Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 126

«Пайтон» — это Питон (Python)?
лол
«Пайтон» — это «Пайтон» (в честь Летающего Цирка Монти Пайтона), а питон — змея.
НЛО прилетело и опубликовало эту надпись здесь
Я очень уважаю русский язык. Только вот тот факт, что название языка «Пайтон» звучит так же как змея «пайтон» — не более чем совпадение. К змее это слово отношения не имеет.

Кстати, называете ли в «Руби» «Рубином», «Си» — «Вэ», а «Бейсик» — «Базисным»?
НЛО прилетело и опубликовало эту надпись здесь
Знаю я.
Вы не поверите, но змею «пайтон» по-русски зовут «питон».
А остров «Джава» по-русски зовут «Ява».
Ну так тут принято.
Змею — да. А тут «Пайтон» — фамилия.
Тогда уж «Пайсн». Еще, кстати, обратите внимание на логотип на python.org
Как представлю, Исаак Азимов, Георгий Кустин, Федор Ртутный. Сразу начинаю гордиться за свою страну.
Во-первых, Азимова по его российским документам действительно звали Исааком.

Во-вторых, последний-то Фредди, а не Тедди — так что Фёдор мимо.
Это, конечно, все меняет :/
Георгий Кустин, Федор Ртутный
— Кто все эти люди?
Джордж Буш, Фредди Меркьюри.
О последнем я даже и не знал. Некультурный я человек…
Давайте сразу Иван Севастьянович Ручьёв
«К змее это слово отношения не имеет»

тем не менее, присутствие в символике языка изображений змей говорит о том, что такое совпадение не только не игнорируется сообществом, но и приветствуется им. поэтому не вижу причин отказываться от русской альтернативы названия языка.
Именую язык «питоном» мы теряем основную ассоциацию. Всё-таки Монти Пайтоны довольно известны и в России тоже.
НЛО прилетело и опубликовало эту надпись здесь
Мы из пятой колонны. Выучили нас на свою голову, что теперь делать.
Я питонщик и считаю, что в русском языке нужно говорить «Питон». Вы же не говорите «Зирокс» и «Мэк оу-эс тэн»?
Блин, если вы питонщик, то должны знать, что холивор здесь не про произношение английских слов по английски в русской речи, а в том, что имя языка — это имя персонажа (человека). А имена в русской речи не переводятся и произносятся как есть.
Претензия имеет все основания на существование.

Поэтому в писменной речи я стараюсь употреблять Python, и пусть все читают как хотят. А в устной по русски я говорю «Питон» просто потому что.

Другие торговые марки, которые содержат в себе имена, воспринимаются нормально и произносятся как по-английски — Hewlett-Packard, Johnson&Johnsons, Ford и другие.
А имена в русской речи не переводятся и произносятся как есть.

Ну да, Джордж Уошингтон и Айзек Нью́тон одобряют ваше утверждение.
А Айзек Азимов, Джордж Буш, Фредди Меркюри — ваше.

То, что в русском языке принято коверкать некоторые имена (например, безграмотное «Фрейд» вместо «Фройд» или «Вашингтон» вместо «Уошинтон»), это не значит, что каждый русскоговорящий обязан коверкать все иностранные имена.

PS К иностранцам всегда представляюсь «Андрей», а не «Эндрю».
НЛО прилетело и опубликовало эту надпись здесь
Ну я бы не стал называть это «коверканием». Есть «устоявшиеся» интерпретации имён и названий. Ну, вот к примеру, мы же не говорим «Хамбург», хотя правильно именно так. Этот город всю жизнь был Гамбургом. А вот название Хайдельберг употребляется, равно как и Гейдельберг. Также и с Питон/Пайтон. Язык постоянно развивается, а уж что приживётся — время покажет. Пайтон пока что режет слух, честно говоря.
Эдак можно и до Уотсона/Ватсона дойти.
Этот аргумент работает и в обратную сторону. Например, Ньютон/Невтон.
Давайте тогда на основании того, что название города Москва (Moscow) основано на названии реки Москва (Moskva) требовать, что бы иностранцы использовали перевод названия реки в качестве перевода названия города.
Так и должно быть, но исторически сложилось не так. Название раньше было «гра́д Моско́в», если верить википедии, от этого и произошла англоязычная форма.
Джек Ландон, Исаак Азимов.

Честно, мне самому не нравится, что так сильно (я не беру во внимание, что в русском и английском одинаковых звуков не так уж много) транскрипция и написание меняется, но не вижу повода для холивара. Это общепринято, не только в русском языке. Да и нашли повод, чтоб ругаться
Ну почему же «любого»? Мой друг-питонщик в шутку называет свой любимый язык «Пятон» и иногда «Пятончег». :)
И на логотипе тоже 2 господина Монти нарисованы?
Пайтон блин

Я не сомневаюсь, что Гвидо назвал язык в честь персонажа, но по русски это режет слух. Надеюсь вы не говорите «ПиЭйчПи», «ЭйчТиЭмЭл», «СиПласПлас».

UPD на ваш комментарий выше: На логотипе нарисованы 2 питона. Так что отношение имеет.
Да уж обсудили сто раз логотип-то. Все знают, что Гвидо смирился с неграмотностью и выбрал змей.
НЛО прилетело и опубликовало эту надпись здесь
Надеюсь, вы не говорите «сэ-плюс-плюс»?
Что сказать — подловили.
Хм… Мы со знакомыми говорим именно «пи-эйч-пи» и «эйч-ти-эм-эл». «Си-плас-плас» — уже перебор, конечно. Как и «цэ-плюс-плюс».

Это всё исключительно дело привычки. Спор на пустом месте.
Си-плас-плас тоже проскакивает, хотя и редко. Но то, что я говорю си-шарп, а не до-диез (и даже не це-решётка), это точно. Вот «эйч-ти-эм-эл» сказать обычно не получается — в конце откуда-то вылезает мягкий знак («эйч-ти-эм-эль»), хотя я французского не учил.
как java-разработчику, мне больно смотреть на этот стереотип…
К большому сожалению это не стереотип. Еще хватает людей кто придерживается подобного стиля.
Это Java-EE.
Для ЕЕ надо хотя бы разнести
        if n % 15 == 0:
            value = 'FizzBuzz';
        elif n % 3 == 0:
            value = 'Fizz';
        elif n % 5 == 0:
            value = 'Buzz';
на два разных класса: в одном проверки, в другом строки.
VisitorPattern самое оно здесь…
и фабрику по созданию объктов в зависимости от кратности числа
А вы говорите «ява» или «джава»? :)
это вы так тонко пытаетесь продолжить холивар из первого коментария?
В речи — «жаба», в формальном тексте — java
В зависимости от контекста. Шутливо — «жаба». Серьёзно, но при устном общении «со своими» — Ява. В письменном тексте и официальном обсуждении — «Джава/Java»
Все варианты неэффективны — по меньшей мере одно лишнее сравнение
Лишнее сравнение? Да после обилия операций взятия остатка от деления лишнее сравнение вообще ни разу не критично :)

Уж для двух заранее известных делителей можно было бы завести по отдельной переменной, инкрементирующейся на каждой итерации, и в них хранить остаток.
А это какой Пайтон?

[['FizzBuzz', 'Fizz', 'Buzz'][max(enumerate([not num % 15, not num % 3, not num % 5]), key=lambda x:x[1])[0]] if sum([not num % 15, not num % 3, not num % 5]) else num for num in xrange(1, 101)]
Перлово-хакерский, нет?
Перловый.
Я бы сказал, что это не перловый, а просто заявка на конкурс по obfuscated code. :)

Питоновский вот:
print map (
        lambda _:
        (
                _ % 15 == 0 and 'FizzBuzz'
                        or _ % 3 == 0 and 'Fizz'
                        or _ % 5 == 0 and 'Buzz'
                        or _
        ),
        range( 1, 101 )
)
s/Питоновский/Перловый/, конечно.
Как-то недостаточно запутанно для Перла :) Должно быть как-то так:

print(map(lambda _:('Fizz'*(not _%5)+'Buzz'*(not _%3))or _, range(1,101)))
Гм. Ниже предложили очень похожий на этот вариант. Не увидел.
А принта нет. Не получается однострочник.
Ну так поставьте впереди :)
Нууууу, так не интересно. Но ладно, засчитывается.
Я вот такой придумал, только не знаю что это за стиль :)

def fizzbuzz(number):
    return {
        0: number,
        number % 3: 'Fizz',
        number % 5: 'Buzz',
        number % 15: 'FizzBuzz',
    }[0]

for number in range(1, 101):
    print fizzbuzz(number)
Гениальный :)
Хотя использование диктов для реализации Switch Statement рекомендовано как раз в питоне.
Тут не совсем они. Обычно словари используются для выборки по индексу, а тут дело в том, что при срабатывании индекс затирается :)
{…}[case] — у вас просто ключ всегда равен нулю — да, switch происходит на стадии формирования дикта. Блин, как клево! :)
А гарантируется такое поведение словаря?
Что затираться будет? Сейчас это так, по крайней мере.
Но да, полагаться на такое, наверное, неправильно. Но можно добавить пару строчек и делать апдейт словаря по ключу в нужном нам порядке.
Вот это (принудительно гарантировать порядок) и будет правильным решением для нормального кода. Иначе, в будущем это место может стать источником трудноуловимых багов. Может отличаться работа на разгых версиях Питон или на разных архитектурах, или разных системных библиотеках.
Порядок гарантирован:

If a comma-separated sequence of key/datum pairs is given, they are evaluated from left to right to define the entries of the dictionary: each key object is used as a key into the dictionary to store the corresponding datum. This means that you can specify the same key multiple times in the key/datum list, and the final dictionary’s value for that key will be the last one given.


. То же самое написано в документации для Python 3.4.0. Так что нормальный способ. Только учтите, что вычисляться будут все выражения. Без lambda это ни в коем случае не замена switch.
Ради интереса проверил, как работает {1: 1, 1: 2, 1: 3} не в CPython. PyPy-2.0.2 и jython-2.5.3-r3 выдают {1: 3}.
Спасибо за то, что нашли в доках. Я поленился копаться.
Ну тогда, конечно, пользоваться можно. Хотя лично мое мнение, что для решения олимпиадной задачи ну или вопроса на интервью такой метод работы со словарем подходит неплохо, но в продакшен коде — ни в коем случае.
А теперь представим ситуацию, если бы питоновский интерпретатор создавал элементы словаря не в том порядке, в каком они записаны в коде, а в каком-нибудь другом.
Хранит же он их в довольно произвольном порядке:
>>> {x*x:x*x*x for x in range(1,11)}
{16: 64, 1: 1, 4: 8, 49: 343, 81: 729, 9: 27, 64: 512, 25: 125, 100: 1000, 36: 216}
>>> {x*x+1:x*x*x for x in range(1,11)}
{17: 64, 2: 1, 50: 343, 82: 729, 5: 8, 65: 512, 26: 125, 101: 1000, 10: 27, 37: 216}

Какой-то Race-Condition-driven development может получиться.
Он обязан создавать их именно в порядке записи. Это прямо написано в документации. Так что не надо представлять.
Минуту врубался… Очень круто, спасибо :)
НЛО прилетело и опубликовало эту надпись здесь
А я такой придумал. Тоже затрудняюсь сказать какой это стиль.
True/False переводятся в числа, складываются по основанию два и этой суммой индексируется массив выходных значений.

fizzbuzz = [None, 'Fizz', 'Buzz', 'FizzBuzz']

for number in range(1, 101):
  print fizzbuzz[(number % 3 == 0) + (number % 5 == 0) * 2] or number
Ассемблерный %)
Компактнее, но кортеж создаётся заново каждый раз.

for number in range(1, 101):
  print (number, 'Fizz', 'Buzz', 'FizzBuzz')[(not number % 3) + (not number % 5) * 2]
Был такой вариант, но совесть не позволила написать.
Больше всего понравился вариант с генератором:

fizzbuzz = ((not x % 3) * 'Fizz' + (not x % 5) * 'Buzz' or x for x in range(1, 101))

for x in fizzbuzz:
    print(x)
Отличный вариант!
Можно даже еще больше за-однострочить (хотя из-за list() теряется преимущество генератора):
print(list((not x%3)*'Fizz'+(not x%5)*'Buzz' or x for x in range(1,101)))
Тогда уж проще «скобки поменять» ))
[(not x % 3) * 'Fizz' + (not x % 5) * 'Buzz' or x for x in range(1, 101)]
Кто сделает реализацию в 30 строк на чистом JavaScript?
for(var i=1; i<101; i++){if ((!(i%15))) {console.log("FizzBuzz")} else if(!(i%3)) {console.log("Fizz")} else if (!(i%5)) {console.log("Buzz")} else {console.log(i)}}

Одна строка
Проверяем на 15 потому, что если число делиться и на 3 и на 5, то оно автоматом делиться на 3*5 = 15
НЛО прилетело и опубликовало эту надпись здесь
Ну, если благородный дон настаивает:
То не вижу, почему бы другому благородному дону не сделать это
var i=1;
var flag=true;
while (flag)
{
  if (!(i%15))
  {
    console.log("FizzBuzz");
  }
  else
  {
    if (!(i%3))
    {
      console.log("Fizz");
    }
    else
    {
      if (!(i%5))
      {
        console.log("Buzz");
      }
      else
      {
        console.log(i);
      }
    }
  }
  i++;
  if (i > 100)
  { flag = false}
}

НЛО прилетело и опубликовало эту надпись здесь
А еще
golang
package main

import "fmt"

func main() {
	var i int
	for i < 101 {
		flag := true
		if i%3 == 0 {
			fmt.Printf("Fizz")
			flag = false
		}
		if i%5 == 0 {
			fmt.Printf("Buzz")
			flag = false
		}
		if flag {
			fmt.Printf("%v", i)
		}
		fmt.Printf("\n")
		i++
	}
}


ruby
puts (1..100).map{|i|  s = ""; s += "Fizz" if (i % 3 == 0);  s += "Buzz" if (i % 5 ==0); s = i.to_s if s.empty?; s; }.join(" ")



Собственно питон
for i in range(1,101): print(((not i%3)*'Fizz' +(not i%5)*'Buzz') or i)



PHP
<?php foreach(range(1,100) as $i){if($i%15 == 0){echo "FizzBuzz";}else{if($i%3 == 0){echo "Fizz";}else if($i%5 == 0){echo "Buzz";}else{echo $i;}};echo "\n";} ?>



Спасибо, немного размялся
Простите, но это у вас не Гоу, а Си какой-то. Гоу вот:

package main

func main() {
    for i := 0; i<101; i++ {
        switch {
        case i % 3 == 0:
            print("Fizz")
            fallthrough
        case i % 5 == 0:
            print("Buzz")
        default:
            print(i)
        }
        print("\n")
    }
}
Да, только про FizzBuzz забыли.
fallthrough
for(var i = 1, s = ''; i < 101; i++) (s = (i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz')) && console.log(s);
А как насчет Scala Пайтона:

from fn import F, _
from operator import add, mul

# F(f, *args) means partial application
# same as functools.partial but returns fn.F instance
assert F(add, 1)(10) == 11

# F << F means functions composition,
# so (F(f) << g)(x) == f(g(x))
f = F(add, 1) << F(mul, 100)
assert list(map(f, [0, 1, 2])) == [1, 101, 201]
assert list(map(F() << str << (_ ** 2) << (_ + 1), range(3))) == ["1", "4", "9"]
Так а FizzBuzz где?
Сишный у вас получился какой-то несишный :)
Откуда в Си операторы elif?
Тут switch направшивается.
Ну да и выделение памяти под строки. Только в Пайтоне нет ни того, ни другого :)
Да-а-аааа… зарапортовался…
Прошу прощения, в голове каша, вы абсолютно правы.
Хотя switch питону всё-таки не помешал бы :)
НЛО прилетело и опубликовало эту надпись здесь
JS Python:

n = 0
while n - 100:
	n = -~n
	print (not n % 3 and 'Fizz' or '') + (not n % 5 and 'Buzz' or '') or n


Жаль, синтаксис не позволяет обернуть всё это в самовызывающуюся лямбду.
Не нашел самой простой и быстрой реализации, она, ИМХО, должна быть такая:
i = 1
while True:
    print i,; i += 1        # 1
    print i,; i += 1        # 2
    print "Fizz",; i += 1   # 3
    print i,; i += 1        # 4
    print "Buzz",; i += 1   # 5
    print "Fizz",; i += 1   # 6
    print i,; i += 1        # 7
    print i,; i += 1        # 8
    print "Fizz",; i += 1   # 9    
    print "Buzz",; i += 1   # 10
    if i > 100:
        break
    print i,; i += 1        # 11
    print "Fizz",; i += 1   # 12
    print i,; i += 1        # 13
    print i,; i += 1        # 14
    print "FizzBuzz",; i += 1   # 15
Ну, вообще-то да, но мне не нравится, как «while 1» выглядит.
Про простую Вы пошутили?
Я всегда считал, что «просто» — это когда человек, не знающий языка, все равно поймет, что происходит.
Пардон, а что непонятно? Трудно догадаться, какая исходно была поставлена задача из текста программы? Возможно. Это же фактически таблица. Реализация-то простая и легко можно реализовать любую логику. А поставленную задачу при такой реализации, думаю нужно писать в комментах. Как раз тот случай, когда комменты уместны.
Ну лично мне не ясен смысл рядом стоящих ,;
И поскольку Вы пишнте инкремент в одной строчке с выводом, не совсем ясно, является ли точка с запятой разделителем или ",;" — это оператор отдельный.

А насчет комментариев согласен, но стоило хотя бы сверху написать, что все выводится группами по 15, тогда бы подобных сомнений не возникло.

Разумеется, я понял смысл кода, но, каюсь, не без труда
А, запятая! :) Пардон, нужно было при печати убрать. Она для смысла не имеет значения. Моя вина.
Это для того, чтобы print не добавлял при печати перевод строки, и печатал подряд а не столбиком. Я проверял в ipython notebook и хотел, чтобы было видно сразу все 100 выводов, а если столбиком печатать, влезает мало.
Точка с запятой это разделитель.
Еще раз извиняюсь.
Насчет реализаций, я б сделал с помощью массива:
a = [i for i in range(101)]  # лишний элемент для удобства 
for i in range(3, 100, 3):
    a[i] = "Fizz"

for i in range(5, 101, 5):
    a[i] = "Buzz"

for i in range(15, 101, 15):
    a[i] = "FizzBuzz"

a.pop(0)
print(*a)

Или такая. Это правда не пайтон, а REXX, но тоже без выяснения остатка от деления. Оно-же, с нормальной подсветкой на pastebin.com
/* REXX */
collector3 = 3
collector5 = 5
fizz.  = 0
buzz.  = 0
fizz.3 = collector3
buzz.5 = collector5

DO count=1 TO 100
 SELECT
        WHEN count = fizz.count & count = buzz.count THEN
             DO
              say 'FizzBuzz'
              collector3 = collector3 + 3
              collector5 = collector5 + 5
              fizz.collector3 = collector3
              buzz.collector5 = collector5
             END
        WHEN count = fizz.count THEN
             DO
              say 'Fizz'
              collector3 = collector3 + 3
              fizz.collector3 = collector3
             END
        WHEN count = buzz.count THEN
             DO
              say 'Buzz'
              collector5 = collector5 + 5
              buzz.collector5 = collector5
             END
 OTHERWISE
  say count
 END
END
Вчера неплохую команду узнал для Bash'а

:~$ factor 105
105: 3 5 7
Это не команда Баша.
Может не Баш, но точно линукс.
С Линуксом я не спорил. Я написал, что это не команда Баша.
НЛО прилетело и опубликовало эту надпись здесь
Вы меня переплюнули по олдскульности. REXX конечно появился чуть раньше, но судя по википедии ABAP это такой продвинутый COBOL.
Кстати, эта (и много других интересных задач) есть здесь: checkio.org. Осторожно, затягивает.
Подумал еще немного. Не хватает КМК, еще одного варианта, с логикой, зашитой не в код, а в данные, вот, набросал наскоро, думаю идея понятна. Думаю, это более «промышленный» вариант:
MAX = 100
MIN_LOGIC = 15
arr_1 = [0,3,6,9,12]
arr_2 = [0,5,10]
logic = {(1,0):"Fizz",(0,1):"Buzz",(1,1):"FizzBuzz"}
for i in range(1,MAX + 1):
    j = i % MIN_LOGIC
    var_1 = j in arr_1
    var_2 = j in arr_2
    key = (var_1,var_2)
    try:
        out = logic[key]
    except KeyError:
        out = i
    print out,

Жду оценок.
Из комментариев в личку со сторонних сайтов:

Здравствуйте, Анатолий! Хотел бы прокомментировать Ваш пост:
habrahabr.ru/post/218981/

Конечно, самое правильное решение там уже предложили:
for i in xrange(1,101): print ((not i%3)*'Fizz'+(not i%5)*'Buzz') or i


Я, просто чтобы показать другой (и весьма кривой) алгоритм, извратился так:

from itertools import cycle, izip, chain
S = 1, 3, 5, 15
W = xrange(1,101), ['Fizz'], ['Buzz'], ['FizzBuzz']
print dict(chain(*(izip(xrange(s,101,s), cycle(w)) for (s,w) in izip(S,W)))).values()


Мой ник на Хабре — adugin
>number % 3 == 0 and number % 5 == 0
number % 3 ==  number % 5 == 0
Enumerable.Range(1, 100).Select(x => x%15 == 0 ? "FizzBuzz" : x%3 == 0 ? "Fizz" : x%5 == 0 ? "Buzz" : x.ToString()).ToList().ForEach(Console.WriteLine);
Вообще говоря, все предложенные решения могут оказаться неверными. В задаче не сказано, что нужно для каждого числа вывести только одну строчку. Для числа 15 их вполне может быть три, причем это только один из вариантов (т.к. требуемый порядок вывода в данном случае тоже неизвестен):
Fizz
Buzz
FizzBuzz
Если оно делится как на 3, так и 5, выведите FizzBuzz.

Из этого следует, что для такого числа должна быть выведена только эта строка. Вполне однозначно следует, что для каждого числа выводится только одна строка. Можно придираться к формулировке, но она достаточно четкая, чтобы придирки так и остались необоснованными.
Не вижу, с чего бы это должно следовать. Из этого следует только, что должна быть выведена эта строка. То, что остальные не должны — вопрос открытый. Чисто интуитивно, на уровне обычной разговорной речи, я конечно склоняюсь к мысли, что все три варианта взаимоисключающие, но формально в условии этого не сказано.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации