...

пятница, 11 апреля 2014 г.

[Перевод] Непайтоновый Пайтон



Когда я подавал заявку на вступление в Hacker School, я столкнулся со следующей задачкой:


Напишите программу, которая выводит числа от 1 до 100 (включительно). Если число делится на 3, выведите Fizz вместо числа. Если оно делится на 5, выведите Buzz. Если оно делится как на 3, так и 5, выведите FizzBuzz. Вы можете использовать любой язык программирования.





(С тех пор сотрудники Hacker School слегка изменили задачку, скорее всего, для того, чтобы затруднить её решение с помощью интернет-поисковиков. Я намеренно не включил сюда изменённое условие, чтобы минимизировать эффект моего поста на гуглобельность.)

Задачка довольно проста и не требует обдумывания, поэтому хорошо подходит как пример для разых языков и стилей программирования словно Hello, World или задача на поиск чисел Фибоначчи.





Сегодня я опять видел эту задачу, когда показывал другу мою заявку в Hacker School, и внезапно я задумался над тем, как много способов её решения существует лишь только в Пайтоне. Пайтон, особенно с PEP 8, представляет пользователю идеальные методы написаний пайтонового Пайтона. Но Пайтон не требует пайтоновости, поэтому я задумался, в каких стилях я могу писать.

Внимание: далее следует очень непайтоновый Пайтон. Тем не менее, код должен работать (с Пайтоном версии 2.7.5).


Присылайте мне свои комментарии или твиты с исправленями ошибок или добавленями.



def fizzbuzz(number):
if number % 3 == 0 and number % 5 == 0:
return 'FizzBuzz'
elif number % 3 == 0:
return 'Fizz'
elif number % 5 == 0:
return 'Buzz'
else:
return number

for number in range(1, 101):
print fizzbuzz(number)



fizzbuzz = lambda n: 'FizzBuzz' if n % 3 == 0 and n % 5 == 0 else None
fizz = lambda n: 'Fizz' if n % 3 == 0 else None
buzz = lambda n: 'Buzz' if n % 5 == 0 else None
fizz_andor_maybenot_buzz = lambda n: fizzbuzz(n) or fizz(n) or buzz(n) or str(n)

print reduce(lambda m,n: m+'\n'+n, map(fizz_andor_maybenot_buzz, range(1, 101)))



import sys

class Value(object):
def __init__(self,value):
self.setValue(value)

def setValue(self,value):
self.value = value

def getValue(self):
return self.value

def toString(self):
return self.getValue().__str__()

class FizzBuzz(object):
def __init__(self, n):
if n % 15 == 0:
value = 'FizzBuzz';
elif n % 3 == 0:
value = 'Fizz';
elif n % 5 == 0:
value = 'Buzz';
else:
value = str(n);
self.setValue(value);

def setValue(self,value):
self.value = Value(value);

def getValue(self):
return self.value;

class FizzBuzzRunner(object):
def __init__(self, n):
self.setN(n)

def setN(self, n):
self.n = n

def run(self):
for i in range(1,self.n):
sys.stdout.write(FizzBuzz(i).getValue().toString()+'\n');

if __name__ == '__main__':
n = 101;
FizzBuzzRunner(n).run()



def main():
i = 0;
value = '';

while i < 100:
i += 1
if i % 15 == 0:
value = 'FizzBuzz';
elif i % 3 == 0:
value = 'Fizz';
elif i % 5 == 0:
value = 'Buzz';
else:
value = str(i);
print value;

return 0;

main();



def fizzbuzz(n):
return 'FizzBuzz' if n % 3 == 0 and n % 5 == 0 else None

def fizz(n):
return 'Fizz' if n % 3 == 0 else None

def buzz(n):
return 'Buzz' if n % 5 == 0 else None

def fizz_andor_maybenot_buzz(n):
print fizzbuzz(n) or fizz(n) or buzz(n) or str(n)

map(fizz_andor_maybenot_buzz, xrange(1, 101))


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий