Победитель: ответ Aditsu на CJam ! Колоссальные 25 байтов! Приятно!
Вы можете продолжить отправлять свой ответ, однако вы больше не можете выиграть. Оригинальный пост сохранен для потомков:
Игра «Bzzt» - это игра, в которой вы должны сосчитать число (в данном случае 500). Однако, если число содержит 3 или делится на 3, вы не говорите число. Вместо этого вы говорите «Bzzt».
Правила:
- Вы не можете жестко закодировать числа.
- Число должно удовлетворять как минимум одному из следующих требований
- Делится на 3
- Номер содержит 3
- Некоторые типы разделителей являются обязательными (12bzzt14 не считается)
- Оценка измеряется в байтах.
- Вы должны считать ровно до 500, начиная с 1 или 0 (вы выбрали).
- Числа должны быть выведены, но это не имеет значения, как (например, стандартный вывод, запись в текстовый файл и т. Д.).
- 0 может делиться на 3 или не делиться. Ты можешь выбрать.
- Вы можете выводить числа по одному (например, вывод 1, затем 2, затем bzzt, затем 4 и т. Д.) Или все сразу (например, вывод 1 2 bzzt 4 5).
- Вы должны заменить букву 3 словом «bzzt». Это не чувствительно к регистру (bZzt, Bzzt, bzzt все в порядке).
- Это задача для игры в гольф , поэтому выигрывает самый короткий код.
- Этот конкурс заканчивается 30 июня 2014 года (7 дней с момента публикации).
buzz
илиbzzt
если применяются оба требования? Нужно ли выводить12bzzt4
илиbzzt
для1234
?bzzt
за1234
. Это «обычная» пьющая игра здесь (только мы часто делаем это с 7)Ответы:
CJam - 25
Спасибо, Говард :)
Попробуйте это на http://cjam.aditsu.net/
Объяснение:
501{…}fI
в основномfor(int I=0; I<501; ++I) {…}
3s
преобразует 3 в строку, то есть «3»I3%
означает, чтоI
% 3<
получает левую подстроку, -"3".substring(0, I % 3)
что означает «» дляI
% 3 == 0, а «3» в противном случаеIs
преобразуетсяI
в строку-
с 2 строками, что приводит к разнице в наборе, что приводит к пустому значению строка iffI
% 3 == 0 (первая строка была пустой) илиI
имеет 3 цифры в ней…I"bzzt"?
, как… ? I : "bzzt"
; предыдущая строка обрабатывается как логическое значение, где "" - false, а любая другая строка - trueN
добавляет новую строкуисточник
501{3sI3%<Is-I"bzzt"?N}fI
.Руби, 43
Довольно просто.
Редактировать: спас один байт, спасибо, Говард!
источник
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
сp
и сохранение 3 символов?p
печатает результат вызоваinspect
по своему аргументу (по сравнению с путями, которые вызываютto_s
). Таким образом, вместо печатиBzzt
(которая есть:Bzzt.to_s
), она будет печатать:Bzzt
, что не соответствует выходным спецификациям.seq и GNU sed -
42333130Работает непосредственно в dash, для некоторых других оболочек может потребоваться отключить расширение истории, например, для bash
set +H
:источник
0~3!
выполняется,{/3/!b}
и вместе эти выражения покидают строку как есть, если она не делится на 3. и не содержит 3. Последний бит «исправляет» строку в bzzt.машинный код x86 в DOS (файл .com) - 71 байт
Выводит требуемый вывод в стандартный вывод с пробелом в качестве разделителя; может быть запущен без проблем в DosBox.
Комментируемая сборка:
источник
Perl - 35
4042источник
PHP, без разделителя -
62, 61,59,58,52,4947Он не говорит, что между ними должен быть пробел / символ новой строки / без:
С сепаратором
68,67,65,64,58 / 55,53 / 5251/50echo
, спас меня немного.~õ
Создает новую строкуJavascript -
54,5150Тот же принцип, но функции JavaScript:
источник
console.log()
очевидно, но это короче.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
õ
\n
!strpbrk($1,3)
с ,trim(3,$i)
чтобы сохранить 4 байтаJavascript
5049-1 байт благодаря core1024
источник
&&
оператора. Например:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
3029 символовНе очень простая реализация в GolfScript, может быть протестирована здесь .
источник
Perl, 36
Изменить: я не монах Perl, поэтому core1024, кажется, сумел сыграть еще один байт в своем ответе .
источник
say
чтобы сохранить 4 байта:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Может быть непосредственно выполнен в LinqPad.
источник
|
) вместо логического или.Python (52)
Спасибо, грк!
Старая версия:
источник
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079источник
==0
с<1
elem'3'$show n
, что короче. Или нет. Я не проверял.elem
в префиксной нотации не сохраняет никаких символов, потому что перед апострофом должен быть пробел; в противном случае вы получитеNot in scope: elem'3'
. Хороший глаз<1
, хотя!JavaScript
666360Спасибо edc65 за предложение использовать массив. Вывод теперь будет разделен запятыми.
Старые версии
Версия 1а - 66
Печатайте от 1 до 500 в окне предупреждения в соответствии с правилом. Выход разделен пробелом.
Версия 1b - 65
Если мы считаем, что 0 не делится на 3, мы можем сократить решение до 65 символов:
Версия 2 - 63
Спасибо grc за предложение уменьшить длину.
источник
for(a=i="";i<500;)a+=++i ...
PowerShell, 42
Главным образом работа Вентеро, с небольшой помощью по синтаксису мной ;-)
источник
R, 49 символов
Разъяснение:
Использование:
источник
Кобра - 70
Партия - 222
Потому что я искренне люблю этот язык ... по какой-то причине ...
источник
if
потому что вы знаете, что есть хотя бы одна цифра. Конкатенация всего блока внутриfor
с&
может также помочь сохранить скобки.==
вместоEQU
и, возможно, отбросить несколько пробелов здесь и там.TI-BASIC - 31
(32) (34) (35) (36) (43)Обратите внимание, что большинство команд в TI-BASIC представлены как однобайтовые объекты.
Код требует, чтобы X был предварительно инициализирован в 0 (иначе, это дополнительные 3 байта).
Я сделал несколько попыток побрить несколько байтов, поэтому я не буду подробно описывать все, что сделал, чтобы не загромождать пост. Они в основном были направлены на сокращение цикла, что я и сделал в этой версии с помощью цикла While и сокращения условия If с помощью
Ans
переменной.источник
bzzt
числа, содержащие 3, например 13.bzzt
только для тех чисел, которые делятся на 3. Возможно добавление другого пути, но для этого потребуются дополнительные инструкции.С, 93
Просто ради всего этого ...
источник
i = 0
Юлия 64 байта
источник
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]
составляет 54 байта. Кроме того, возвращение массива не печатает весь массив, поэтому я не уверен, считается ли он «выводом». Если возвращено значение массива, то[a%3==0||3 in digits(a)?"bzzt":a for a=1:500]
можно считать и получить 45 баллов.cmd.exe - 91
... потому что зачем использовать командный файл, когда существует совершенно простая однострочная строка ... :-)
источник
заводной - 51
редактировать: использование
times
версии для печати теперь так же коротко, как и «отображение». спасибо @ будет-ристочник
(1..500).each
на500.times
С, 80
Использование пробелов в качестве разделителей вместо разрывов строк.
источник
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Здесь что-то не так.Mathematica, 54 персонажа
Это кажется слишком простым. Более короткие решения должны быть возможны.
источник
T-SQL 2008 - 80
Не собираюсь побеждать или что-нибудь еще, кроме веселья: Tweaked благодаря @domager:
Малоизвестный факт, @ является допустимым именем переменной. Это кажется странным, так как код, основанный на множестве, является более SQL-вариантом, но чем короче, тем короче! Эта версия работает на любой базе данных. Изменить: мне удалось удалить два из полуфабрикатов, поскольку они не были необходимы. Я уверен, что это настолько оптимально, насколько это возможно.
Edit2: никогда не говори никогда. Здесь теперь даже грубее использовать goto, но это позволяет нам избежать блока. Мы можем заменить while, begin, end на более короткий, если, t:, перейти к сохранению 6 символов. Мы также переставляем оператор, переписывая цикл как псевдо-do-while, семантически эквивалентный. Edit3: Да, как-то, если сейчас короче. Оригинал:
Должен быть запущен в главной базе данных. Я люблю T-SQL, несмотря на его шумные и уродливые способы. Возможно, есть способ сделать это проще, но, к сожалению,
iif
встроенное требует, чтобы обе стороны согласовали типы. Правила приоритета серверов Sql имеют более высокий приоритет, чем строки. Число тоже очень длинное, но псевдоним - это больше символов, чем оно того стоит. Там может быть лучший способ превратить число в строку. Редактировать: ул работает тоже. На 2 персонажа меньше, чем у Литримаисточник
declare @i int=1;while(@i<501)begin;if(@i)like'%3%'or @i%3=0 print'bzzt'else print @i;set @i=@i+1 end
@
. Тогда использование iif () все еще короче, чем if (...) print else print, поэтому мы получим немало выигрыша, используяiif
выражение. Также мы можем использовать короче,@+=1
чтобы сохранить символ+=
. У меня нет удобного тестирования, но я уверен, что он поддерживает''+@
преобразование строк с использованием инвариантной локали.+=
был добавлен в 2008 году. Он поддерживает '' + @, но не делает то, что вы хотите. Как я уже сказал, правила приоритета приведения к Int первой , так что бросает''
в целое, в результате чего в нуле , так''+@
как до@
сих пор набран какint
.str
работает, и это не намного дороже, чем что-либо еще (2 дополнительных символа для паренов). Я выбрал t-sql 2012 здесь из-заIIF
оператора, который знает, что, возможно, выпуск 2016 года sql избавится от шума и станет конкурентоспособным (маловероятно).VBA: 54
Откройте вашу любимую программу Office, нажмите Alt + F11, чтобы открыть IDE VBA, вставьте код в ближайшую панель и нажмите Enter.
В VBA: разделитель строк? является условным обозначением для печати, iif означает встроенный if (думаю, x? "Y": "N"), x / 3 - деление с плавающей запятой, а x \ 3 - целочисленное деление, instr возвращает позицию символа в строке или 0 в противном случае true = -1 и false = 0.
Код в основном увеличивает x и выдает x, если x / 3 = x \ 3 = instr (1, x, 3) имеет значение true, а «Bzzt» - в противном случае. x / 3 = x \ 3 сравнивает (float) (x / 3) с (int) (x / 3) и возвращает логическое значение (0 - false, а -1 - true). instr (1, x, 3) возвращает 0, если «3» отсутствует в числе, и положительное целое число в противном случае. Единственное время, когда выражение возвращает true, это когда (x / 3 = x \ 3) равно false (0), а instr (1, x, 3) равно 0, или, другими словами, когда x не делится на 3 и не делится содержит цифру «3», которая именно то, что мы ищем.
источник
к4
(37)(35)k4
отсутствует встроенная команда по модулю, и при ее использованииq
потребуется дополнительный символ; эта версия (ab) использует встроенный выходной формат, чтобы проверить,x
содержит ли строка результата деления на 3 десятичную точку.РЕДАКТИРОВАТЬ:
Умный, как может соответствовать десятичной запятой, я могу побрить два байта, проверив, что
3*floor x%3
все ещеx
.источник
h1
иh2
достаточно важно, чтобы гарантировать редактирование в первую очередь.)Bash,
53 52 4846Требуется GNU sed (используется
c
расширение).источник
Java,
142131 благодаря предложению WozzeCисточник
class A{public static void main(String[]a){for(int i=0;++i<501;System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt"));}}
R
(40)(36)Это в основном планнапус ответ немного укорочен, но пока комментировать не могу
Обновление: -4 символа (см. Комментарий Plannapus)
Выход:
источник
strsplit
) выдают ошибку при подаче с не символами, я предположил,grepl
что так же. Хорошо поймал! +1b
до этого:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Фортран -
118 114111Безнадежно маловероятный кандидат, хотя изначально был разработан для размещения на перфокартах. Используя все неясные конструкции из прошлого, некоторый короткий код все еще может быть написан:
«Вычисленное переход»
goto(L1,L2,...,Ln) x
переходит к одной из меток L тогда и только тогда, когда 1 <= x <= n.Редактировать: удалось сократить 4 байта, переставив цикл, проверяющий число 3. В качестве бонуса, код теперь также содержит арифметическое выражение if
if(x) a,b,c
, которое всегда ветвится на одну из трех меток: a if x <0, b если x == 0 или c, если x> 0.К сожалению, первые две версии не дали правильного вывода. Цикл цифра-3 теперь работает правильно, и код теперь также включает в себя современный логический оператор if. Еще три байта ушли, потому что кому нужно
enddo
утверждение? Вывод может быть проверен здесь .источник