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

от автора

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)) 

ссылка на оригинал статьи http://habrahabr.ru/post/218981/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *