Непайтоновий Пайтон

       FizzBuzz
Коли я подавав заявку на вступ до 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))

  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.