Играть в игру «BZZT»


56

Победитель: ответ 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 дней с момента публикации).

1
Для целей этого вопроса 0 делится на 3?
Οurous

2
Это "Buzz" или "Bzzt"? Вы уже дважды писали "Buzz".
aditsu

3
Просьба уточнить. Нужно ли выводить данные buzzили bzztесли применяются оба требования? Нужно ли выводить 12bzzt4или bzztдля 1234?
nyuszika7h

4
Я бы сказал bzztза 1234. Это «обычная» пьющая игра здесь (только мы часто делаем это с 7)
Martijn

66
«0 может делиться на 3 или не делится. Вы можете выбрать». Я действительно не думаю, что вы можете выбрать. 0 мод 3 0, это не вопрос мнения.
Дэвид Конрад

Ответы:


33

CJam - 25

501{3sI3%<Is-I"bzzt"?N}fI

Спасибо, Говард :)

Попробуйте это на 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 строками, что приводит к разнице в наборе, что приводит к пустому значению строка iff I% 3 == 0 (первая строка была пустой) или Iимеет 3 цифры в ней
…I"bzzt"?, как … ? I : "bzzt"; предыдущая строка обрабатывается как логическое значение, где "" - false, а любая другая строка - true
Nдобавляет новую строку


Вы можете использовать тот же трюк , как в моем golfscript растворе и сохранить логическую и: 501{3sI3%<Is-I"bzzt"?N}fI.
Говард

29

Руби, 43

501.times{|a|puts"#{a}"[?3]||a%3<1?:Bzzt:a}

Довольно просто.

Редактировать: спас один байт, спасибо, Говард!


1
Вы можете сохранить один пробел, если вы пишете "#{a}"[?3]||a%3<1.
Говард

@ Ховард: Действительно, большое спасибо!
Вентеро

1
Еще более нечитабельно, но, к сожалению, такой же длины "#{a}"[?3[0,a%3]].
Говард

Что о замене putsс pи сохранение 3 символов?
Дэвид Унрик

1
@DavidUnric pпечатает результат вызова inspectпо своему аргументу (по сравнению с путями, которые вызывают to_s). Таким образом, вместо печати Bzzt(которая есть :Bzzt.to_s), она будет печатать :Bzzt, что не соответствует выходным спецификациям.
Вентеро

25

seq и GNU sed - 42 33 31 30

Работает непосредственно в dash, для некоторых других оболочек может потребоваться отключить расширение истории, например, для bash set +H:

seq 500|sed 0~3!{/3/!b}\;cbzzt

Как это работает?
nbubis

Расширение истории отключено по умолчанию в сценариях оболочки.
nyuszika7h

@ nyuszika7h: правда, но я ожидаю, что многие попробуют ответить в интерактивной оболочке.
Тор

1
@nbubis: обновленная версия работает, генерируя последовательность с помощью seq. 0~3!выполняется, {/3/!b}и вместе эти выражения покидают строку как есть, если она не делится на 3. и не содержит 3. Последний бит «исправляет» строку в bzzt.
Тор

18

машинный код x86 в DOS (файл .com) - 71 байт

00000000  31 c9 68 20 24 89 e5 89  c8 bb 03 00 31 d2 f7 f3  |1.h $.......1...|
00000010  85 d2 74 1a 89 c8 b3 0a  31 d2 f7 f3 80 fa 03 74  |..t.....1......t|
00000020  0d 80 c2 30 86 d6 52 44  85 c0 75 ea eb 08 89 ec  |...0..RD..u.....|
00000030  68 7a 74 68 62 7a 89 e2  b4 09 cd 21 89 ec 41 81  |hzthbz.....!..A.|
00000040  f9 f4 01 7e c2 59 c3                              |...~.Y.|

Выводит требуемый вывод в стандартный вывод с пробелом в качестве разделителя; может быть запущен без проблем в DosBox.

Комментируемая сборка:

    org 100h

start:
    ; 0 - 500 counter
    xor cx,cx
    ; we'll use the stack as scratch space to build the strings to print
    ; first of all, push ' $' on the stack (in reverse order); this will be
    ; the end of each string we'll print
    push 2420h
    ; save the stack pointer, to get back to this position after each print
    mov bp,sp
mainloop:
    ; first try to divide by three
    mov ax,cx
    mov bx,3
    xor dx,dx
    div bx
    test dx,dx
    ; no remainder => bzzt
    jz bzzt
    ; otherwise, go into the decimal-print loop
    mov ax,cx
divloop:
    ; bh is already at zero due to the mov bx,3 above
    mov bl,10
    xor dx,dx
    ; divide by 10
    div bx
    ; remainder is 3 => bzzt
    cmp dl,3
    je bzzt
    ; convert number to digit
    add dl,'0'
    ; trick: we move the digit to the upper byte of dx: this allows us to
    ; push the whole dx (you cannot do push dl) but to easily kill the
    ; undesidered byte by touching the stack pointer (it will be overwritten
    ; by the next stack operation/ignored by the print)
    xchg dl,dh
    push dx
    inc sp
    ; check is there anything left to print, rinse & repeat
    test ax,ax
    jnz divloop
    ; skip straight to print
    jmp print
bzzt:
    ; since we may be here from inside divloop, reset the stack pointer to
    ; where we left ' $'
    mov sp,bp
    ; push 'bzzt'
    push 747ah
    push 7a62h
print:
    ; print what is on the stack
    mov dx,sp
    mov ah,9h
    int 21h
    ; move us back to ' $'
    mov sp,bp

    ; increment cx and repeat while we are <=500
    inc cx
    cmp cx,500
    jle mainloop
end:
    ; fix back the stack pointer to the original value (=kill the first push)
    pop cx
    ; quit
    ret

5
РЕСПЕКТ !!!!! Удивительно!
Йоссико

@yossico: спасибо! :) на самом деле, в этом нет ничего особенного, я уверен, что люди, которые на самом деле написали ассемблер для DOS, наверняка смогли бы сбить еще несколько байтов.
Matteo Italia


17

PHP, без разделителя - 62, 61,59,58,52,49 47

Он не говорит, что между ними должен быть пробел / символ новой строки / без:

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt;

С сепаратором 68,67,65,64,58 / 55,53 / 52 51/50

while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,' '; // 51
while(++$i<501)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ; // 50
  • Только что нашел небольшой «чит», не нужно места после echo, спас меня немного.
  • Создает новую строку
  • Еще один маленький «чит», bzzt не нуждается в кавычках (проверено). Не путь, но это работает.

Javascript - 54,51 50

Тот же принцип, но функции JavaScript:

for(i=0;i++<500;)alert(i%3<1|/3/.test(i)?'bzzt':i)

Спасибо @ core за скобки и за () совет. Из-за этого я несколько раз ломал свой браузер ^^
Мартейн

Ха - ха. Я проверял это с console.log()очевидно, но это короче.
Мартейн

1
Ваше решение Javascript имеет значение 501.
nderscore

1
PHP для 52: это символ 245, немного перевернутого . <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;õ\n
Примо

1
Вы можете заменить !strpbrk($1,3)с , trim(3,$i)чтобы сохранить 4 байта
aross

16

Javascript 50 49

-1 байт благодаря core1024

for(i=0;i++<500;)alert(i%3*!/3/.test(i)?i:'bzzt')

Я знал, что это можно сделать! Но не нашел как
edc65

1
Вы можете представить мое лицо, когда решение JavaScript превосходит мое решение LiveScript.
nyuszika7h

во втором решении вы можете удалить один & подписать, и он все еще будет работать
user902383

@ user902383 Это недопустимый результат без логического &&оператора. Например: 497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore

for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')- 49: P
core1024

11

GolfScript, 30 29 символов

501,{:^`3`^3%<?)'bzzt'^if n}/

Не очень простая реализация в GolfScript, может быть протестирована здесь .


10

Perl, 36

print$_%3&&!/3/?$_:Bzzt,$/for 1..500

Изменить: я не монах Perl, поэтому core1024, кажется, сумел сыграть еще один байт в своем ответе .


1
Используйте, sayчтобы сохранить 4 байта:say$_%3&&!/3/?$_:bzzt for 1..5e2
Заид

@ Зачем почему 5е2, а не 500?
Не то, чтобы Чарльз

@Charles: они эквивалентны
Заид

1
@За что так, почему бы не быть яснее?
Не то, что Чарльз

4
@ Чарльз: В контексте проблемы кода-гольфа нужно ли вообще заботиться?
Заид

10

C # (71)

Может быть непосредственно выполнен в LinqPad.

for(var i=0;++i<501;)(i%3<1|(i+"").Contains("3")?"buzz":i+"").Dump();

1
Вы можете сохранить символ с помощью побитового или ( |) вместо логического или.
Джонбот

@Johnbot Спасибо за ваше предложение.
EvilFonti

Вы можете удалить скобки вокруг условных тоже.
Johnbot

@Johnbot: это не поразрядно или. Это (не короткое замыкание) логическое или, так как операнды логические.
Райан М

Дамп это просто LinqPad, правда, правильно? Выполнение этого в C # в качестве приложения потребует добавления метода расширения. (И это «bzzt», а не «buzz» =))
Пол

9

Python (52)

Спасибо, грк!

for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]

Старая версия:

print['Bzzt'if'3'in`i`or i%3<1 else`i`for i in range(501)]

1
Немного короче:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
grc

4
На один символ короче:['3'[:i%3]in`i`]
xnor

7

Haskell: 88 82 80 79

main=mapM_ f[1..500]
f n|n`mod`3<1||'3'`elem`show n=putStrLn"bzzt"
f n=print n

Если бы я писал ответ, я бы отказался от ввода-вывода и вернул строковое значение.
гордый haskeller

1
Вы также должны переключиться ==0с<1
гордый haskeller

Также попробуйте сделать префикс elem. Я думаю, что вы должны быть в состоянии написать elem'3'$show n, что короче. Или нет. Я не проверял.
гордый haskeller

@proudhaskeller: спецификация гласит, что «числа должны быть выведены», поэтому необходимо задействовать IO. И использование elemв префиксной нотации не сохраняет никаких символов, потому что перед апострофом должен быть пробел; в противном случае вы получите Not in scope: elem'3'. Хороший глаз <1, хотя!
Тейлор Фаусак

6

JavaScript 66 63 60

for(a=i=[];i<500;)a[i++]=i%3&&!/3/.test(i)?i:'bzzt';alert(a)

Спасибо edc65 за предложение использовать массив. Вывод теперь будет разделен запятыми.


Старые версии

Версия 1а - 66

Печатайте от 1 до 500 в окне предупреждения в соответствии с правилом. Выход разделен пробелом.

a="";for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

Версия 1b - 65

Если мы считаем, что 0 не делится на 3, мы можем сократить решение до 65 символов:

a=0;for(i=1;i<501;i++)a+=i%3&&!/3/.test(i)?" "+i:" bzzt";alert(a)

Версия 2 - 63

for(a=i="";i<501;)a+=++i%3&&!/3/.test(i)?i+" ":"bzzt ";alert(a)

Спасибо grc за предложение уменьшить длину.


1
Я думаю, что вы могли бы начать сfor(a=i="";i<500;)a+=++i ...
GRC

Вывод через запятую в порядке, массив будет короче: for (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? I: 'bzzt' ; alert (o)
edc65

6

PowerShell, 42

1..500|%{($_,'bzzt')[$_-match3-or!($_%3)]}

Главным образом работа Вентеро, с небольшой помощью по синтаксису мной ;-)


6

R, 49 символов

a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)

Разъяснение:

a=1:500 #Creates a vector with all integers from 1 to 500
b='bzzt'
a[!a%%3]=b #Replace all multiples of 3 by 'bzzt', thus coercing all other integers to character strings
a[grep(3,a)]=b #Replaces the character strings containing 3 by 'bzzt'
cat(a) #Print to stdout

Использование:

> a=1:500;b='bzzt';a[!a%%3]=b;a[grep(3,a)]=b;cat(a)
1 2 bzzt 4 5 bzzt 7 8 bzzt 10 11 bzzt bzzt 14 bzzt 16 17 bzzt 19 20 bzzt 22 bzzt bzzt 25 26 bzzt 28 29 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 40 41 bzzt bzzt 44 bzzt 46 47 bzzt 49 50 bzzt 52 bzzt bzzt 55 56 bzzt 58 59 bzzt 61 62 bzzt 64 65 bzzt 67 68 bzzt 70 71 bzzt bzzt 74 bzzt 76 77 bzzt 79 80 bzzt 82 bzzt bzzt 85 86 bzzt 88 89 bzzt 91 92 bzzt 94 95 bzzt 97 98 bzzt 100 101 bzzt bzzt 104 bzzt 106 107 bzzt 109 110 bzzt 112 bzzt bzzt 115 116 bzzt 118 119 bzzt 121 122 bzzt 124 125 bzzt 127 128 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 140 bzzt 142 bzzt bzzt 145 146 bzzt 148 149 bzzt 151 152 bzzt 154 155 bzzt 157 158 bzzt 160 161 bzzt bzzt 164 bzzt 166 167 bzzt 169 170 bzzt 172 bzzt bzzt 175 176 bzzt 178 179 bzzt 181 182 bzzt 184 185 bzzt 187 188 bzzt 190 191 bzzt bzzt 194 bzzt 196 197 bzzt 199 200 bzzt 202 bzzt bzzt 205 206 bzzt 208 209 bzzt 211 212 bzzt 214 215 bzzt 217 218 bzzt 220 221 bzzt bzzt 224 bzzt 226 227 bzzt 229 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 241 242 bzzt 244 245 bzzt 247 248 bzzt 250 251 bzzt bzzt 254 bzzt 256 257 bzzt 259 260 bzzt 262 bzzt bzzt 265 266 bzzt 268 269 bzzt 271 272 bzzt 274 275 bzzt 277 278 bzzt 280 281 bzzt bzzt 284 bzzt 286 287 bzzt 289 290 bzzt 292 bzzt bzzt 295 296 bzzt 298 299 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 400 401 bzzt bzzt 404 bzzt 406 407 bzzt 409 410 bzzt 412 bzzt bzzt 415 416 bzzt 418 419 bzzt 421 422 bzzt 424 425 bzzt 427 428 bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt bzzt 440 bzzt 442 bzzt bzzt 445 446 bzzt 448 449 bzzt 451 452 bzzt 454 455 bzzt 457 458 bzzt 460 461 bzzt bzzt 464 bzzt 466 467 bzzt 469 470 bzzt 472 bzzt bzzt 475 476 bzzt 478 479 bzzt 481 482 bzzt 484 485 bzzt 487 488 bzzt 490 491 bzzt bzzt 494 bzzt 496 497 bzzt 499 500

6

Кобра - 70

class P
    def main
        for i in 501,print if('3'in'[i]'or i%3<1,'Bzzt',i)

Партия - 222

Потому что я искренне люблю этот язык ... по какой-то причине ...

SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%n in (1,1,500) do (
    set a=%%n&set /ai=!a!%%3
    if "!a:~0,1!"=="3" set a=Bzzt
    if "!a:~1,2!"=="3" set a=Bzzt
    if "!a:~2,3!"=="3" set a=Bzzt
    if !i!==0 set a=Bzzt
    echo !a!>>x)

Вы должны иметь возможность сбрасывать кавычки вокруг операндов в первом, ifпотому что вы знаете, что есть хотя бы одна цифра. Конкатенация всего блока внутри forс &может также помочь сохранить скобки.
Джои

Кроме того, вы можете использовать ==вместо EQUи, возможно, отбросить несколько пробелов здесь и там.
Джои

@Joey Спасибо за предложения!
Οurous

6

TI-BASIC - 31 (32) (34) (35) (36) (43)

:While X<500
:X+1→X
:If not(fPart(X/3
:"bzzt
:Disp Ans
:End

Total: 25 + 6 lines = 31

Обратите внимание, что большинство команд в TI-BASIC представлены как однобайтовые объекты.

Код требует, чтобы X был предварительно инициализирован в 0 (иначе, это дополнительные 3 байта).

Я сделал несколько попыток побрить несколько байтов, поэтому я не буду подробно описывать все, что сделал, чтобы не загромождать пост. Они в основном были направлены на сокращение цикла, что я и сделал в этой версии с помощью цикла While и сокращения условия If с помощью Ansпеременной.


Поправьте меня, если я ошибаюсь, но это не похоже на bzztчисла, содержащие 3, например 13.
Тор

@Thor Вы правы, но я нахожусь в пределах правил, поскольку они утверждают, что я могу печатать bzztтолько для тех чисел, которые делятся на 3. Возможно добавление другого пути, но для этого потребуются дополнительные инструкции.
Doktoro Reichard

1
Правила гласят: если число содержит 3 или делится на 3, вы не говорите число. Вместо этого вы говорите «Bzzt» , поэтому я бы сказал, что оба должны быть заменены.
Тор

@Thor Сейчас меня больше всего беспокоит крошечная запятая в середине предложения. То, как я это интерпретировал, оба способа выполнения одинаково действительны, что также объясняет 2-е правило: число должно удовлетворять только одному из требований ... (либо иметь 3, либо делиться на 3)
Доктор Рейхард

1
Вы пропустили здесь байты, потому что строчные буквы - это двухбайтовые токены. Я согласен с толкованием Тором правил, так как именно оно использует каждый ответ выше.
lirtosiast

5

С, 93

Просто ради всего этого ...

main(i){char s[9]="bzzt";while(i<498+sprintf(s+5,"%d",i))puts(s+5*(i++%3&&!strchr(s+5,51)));}

У этого есть небольшой глюк - он пропускает вывод дляi = 0
anatolyg

4
@anatolyg "Вы должны считать до 500, начиная с 1 или 0 (вы выбрали)." - Я решил начать с 1.
брезгливое ossifrage

Пропустил этот бит. Сожалею!
Анатолий

Пропускает намного больше, если вы передадите ему аргументы, смеется. Но, это хорошо для игры в гольф, я дам вам это! Вплоть до использования возвращаемого значения sprintf, когда вы стремитесь к трехзначным числам, чтобы контролировать время, lol. Так плохо .... ха-ха!
DreamWarrior

5

Юлия 64 байта

map(x->x%3==0||contains(string(x),"3")?"Bzzt":string(x),[1:500])

2
[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 баллов.
gggg

5

cmd.exe - 91

for /l %x in (1,1,500)do @set/a %x%3|find "0">nul&&echo bzzt||echo %x|find/v"3"||echo bzzt

... потому что зачем использовать командный файл, когда существует совершенно простая однострочная строка ... :-)


5

заводной - 51

500.times{println"$it".find('3')||it%3<1?'bzzt':it}

редактировать: использование timesверсии для печати теперь так же коротко, как и «отображение». спасибо @ будет-р


1
+1. Вы можете поменяться (1..500).eachна500.times
Will Lp

4

С, 80

Использование пробелов в качестве разделителей вместо разрывов строк.

n;main(){for(;n++<500;)printf(n%10^3&&n/10%10^3&&n/100^3&&n%3?"%d ":"bzzt ",n);}

1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt... Здесь что-то не так.
брезгливое оссифраж

Кажется, я был слишком жадным и наткнулся на неопределенное поведение (измененная переменная и считывание между точками последовательности). Сейчас исправлено.
Анатолий

Работаю сейчас :-)
брезгливый оссифраж


4

T-SQL 2008 - 80

Не собираюсь побеждать или что-нибудь еще, кроме веселья: Tweaked благодаря @domager:

declare @ int=0t:if(@)like'%3%'or @%3=0print'bzzt'print @;set @+=1if @<501goto t

Малоизвестный факт, @ является допустимым именем переменной. Это кажется странным, так как код, основанный на множестве, является более SQL-вариантом, но чем короче, тем короче! Эта версия работает на любой базе данных. Изменить: мне удалось удалить два из полуфабрикатов, поскольку они не были необходимы. Я уверен, что это настолько оптимально, насколько это возможно.

Edit2: никогда не говори никогда. Здесь теперь даже грубее использовать goto, но это позволяет нам избежать блока. Мы можем заменить while, begin, end на более короткий, если, t:, перейти к сохранению 6 символов. Мы также переставляем оператор, переписывая цикл как псевдо-do-while, семантически эквивалентный. Edit3: Да, как-то, если сейчас короче. Оригинал:

select top 501iif(number like'%3%'or number%3=0,'bzzt',str(number))from spt_values where'p'=type

Должен быть запущен в главной базе данных. Я люблю T-SQL, несмотря на его шумные и уродливые способы. Возможно, есть способ сделать это проще, но, к сожалению, iifвстроенное требует, чтобы обе стороны согласовали типы. Правила приоритета серверов Sql имеют более высокий приоритет, чем строки. Число тоже очень длинное, но псевдоним - это больше символов, чем оно того стоит. Там может быть лучший способ превратить число в строку. Редактировать: ул работает тоже. На 2 персонажа меньше, чем у Литрима


Сначала я думал, что ваш код имеет длину 2012,96 байт.
nyuszika7h

немного длиннее в @ 101, но не зависит от таблицы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
domager

@domager, совершенно верно, плюс мы можем сохранить немало символов, переключив переменную в @. Тогда использование iif () все еще короче, чем if (...) print else print, поэтому мы получим немало выигрыша, используя iifвыражение. Также мы можем использовать короче, @+=1чтобы сохранить символ
Майкл Б

Я не знал, что T-SQL поддерживается +=. У меня нет удобного тестирования, но я уверен, что он поддерживает ''+@преобразование строк с использованием инвариантной локали.
Питер Тейлор

+=был добавлен в 2008 году. Он поддерживает '' + @, но не делает то, что вы хотите. Как я уже сказал, правила приоритета приведения к Int первой , так что бросает ''в целое, в результате чего в нуле , так ''+@как до @сих пор набран как int. strработает, и это не намного дороже, чем что-либо еще (2 дополнительных символа для паренов). Я выбрал t-sql 2012 здесь из-за IIFоператора, который знает, что, возможно, выпуск 2016 года sql избавится от шума и станет конкурентоспособным (маловероятно).
Майкл Б

4

VBA: 54

for x=0to 500:?iif(x/3=x\3=instr(1,x,3),x,"Bzzt"):next

Откройте вашу любимую программу 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

к4 (37) (35)

{$(x;`bzzt)(|/51=$x)|~"."in$x%3}'!501

k4отсутствует встроенная команда по модулю, и при ее использовании qпотребуется дополнительный символ; эта версия (ab) использует встроенный выходной формат, чтобы проверить, xсодержит ли строка результата деления на 3 десятичную точку.

РЕДАКТИРОВАТЬ:

{$(x;`bzzt)(|/51=$x)|x=3*_x%3}'!501

Умный, как может соответствовать десятичной запятой, я могу побрить два байта, проверив, что 3*floor x%3все еще x.


Проголосовал за умное сопоставление десятичной точки!
Марк

Пожалуйста, не обновляйте все свои ответы по одному. Это отодвинет все активные вызовы с первой страницы. Было бы хорошо, если бы вы делали один или два раза. (Хотя я даже не думаю, что изменение между h1и h2достаточно важно, чтобы гарантировать редактирование в первую очередь.)
Мартин Эндер

3

Bash, 53 52 48 46

seq 500|factor|sed '/3.*:\| 3 */cBzzt
s/:.*//'

Требуется GNU sed (используется cрасширение).


3

Java, 142 131 благодаря предложению WozzeC

public class a{public static void main(String[]a){for(int i=1;i<501;i++)System.out.println(i%3>0&(""+i).indexOf(51)<0?i:"bzzt");}}

1
Моя Java немного ржавая. Но разве это не будет короче с операндом? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Также возможно пропустить {} для forloop.
WozzeC

это 122 байта, на 9 меньше: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"));}}
Луиджи Кортезе

3

R (40) (36)

Это в основном планнапус ответ немного укорочен, но пока комментировать не могу

Обновление: -4 символа (см. Комментарий Plannapus)

a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a

Выход:

  [1] "1"    "2"    "bzzt" "4"    "5"    "bzzt" "7"    "8"    "bzzt" "10"   "11"   "bzzt" "bzzt" "14"   "bzzt" "16"   "17"   "bzzt" "19"   "20"   "bzzt" "22"   "bzzt" "bzzt" "25"   "26"   "bzzt" "28"   "29"   "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "40"   "41"   "bzzt" "bzzt" "44"   "bzzt" "46"   "47"   "bzzt" "49"   "50"   "bzzt" "52"   "bzzt" "bzzt" "55"   "56"   "bzzt" "58"   "59"   "bzzt" "61"   "62"   "bzzt" "64"   "65"   "bzzt" "67"   "68"   "bzzt" "70"   "71"   "bzzt" "bzzt" "74"   "bzzt" "76"   "77"   "bzzt" "79"   "80"   "bzzt" "82"   "bzzt" "bzzt" "85"   "86"   "bzzt" "88"   "89"   "bzzt" "91"   "92"   "bzzt" "94"   "95"   "bzzt" "97"   "98"   "bzzt" "100"  "101"  "bzzt" "bzzt" "104"  "bzzt" "106"  "107"  "bzzt" "109"  "110"  "bzzt" "112"  "bzzt" "bzzt" "115"  "116"  "bzzt" "118"  "119"  "bzzt" "121"  "122"  "bzzt" "124"  "125"  "bzzt" "127"  "128"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "140"  "bzzt" "142"  "bzzt" "bzzt" "145"  "146"  "bzzt" "148"  "149"  "bzzt" "151"  "152"  "bzzt" "154"  "155"  "bzzt" "157"  "158"  "bzzt" "160"  "161"  "bzzt" "bzzt" "164"  "bzzt" "166"  "167"  "bzzt" "169"  "170"  "bzzt" "172"  "bzzt" "bzzt" "175"  "176"  "bzzt" "178"  "179"  "bzzt" "181"  "182"  "bzzt" "184"  "185"  "bzzt" "187"  "188"  "bzzt" "190"  "191"  "bzzt" "bzzt" "194"  "bzzt" "196"  "197"  "bzzt" "199"  "200"  "bzzt" "202"  "bzzt" "bzzt" "205"  "206"  "bzzt" "208"  "209"  "bzzt" "211"  "212"  "bzzt" "214"  "215"  "bzzt" "217"  "218"  "bzzt" "220"  "221"  "bzzt" "bzzt" "224"  "bzzt" "226"  "227"  "bzzt" "229"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "241"  "242"  "bzzt" "244"  "245"  "bzzt" "247"  "248"  "bzzt" "250"  "251"  "bzzt" "bzzt" "254"  "bzzt" "256"  "257"  "bzzt" "259"  "260"  "bzzt" "262"  "bzzt" "bzzt" "265"  "266"  "bzzt" "268"  "269"  "bzzt" "271"  "272"  "bzzt" "274"  "275"  "bzzt" "277"  "278"  "bzzt" "280"  "281"  "bzzt" "bzzt" "284"  "bzzt" "286"  "287"  "bzzt" "289"  "290"  "bzzt" "292"  "bzzt" "bzzt" "295"  "296"  "bzzt" "298"  "299"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "400"  "401"  "bzzt" "bzzt" "404"  "bzzt" "406"  "407"  "bzzt" "409"  "410"  "bzzt" "412"  "bzzt" "bzzt" "415"  "416"  "bzzt" "418"  "419"  "bzzt" "421"  "422"  "bzzt" "424"  "425"  "bzzt" "427"  "428"  "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "bzzt" "440"  "bzzt" "442"  "bzzt" "bzzt" "445"  "446"  "bzzt" "448"  "449"  "bzzt" "451"  "452"  "bzzt" "454"  "455"  "bzzt" "457"  "458"  "bzzt" "460"  "461"  "bzzt" "bzzt" "464"  "bzzt" "466"  "467"  "bzzt" "469"  "470"  "bzzt" "472"  "bzzt" "bzzt" "475"  "476"  "bzzt" "478"  "479"  "bzzt" "481"  "482"  "bzzt" "484"  "485"  "bzzt" "487"  "488"  "bzzt" "490"  "491"  "bzzt" "bzzt" "494"  "bzzt" "496"  "497"  "bzzt" "499"  "500"

Поскольку многие функции строковых операций (например, strsplit) выдают ошибку при подаче с не символами, я предположил, greplчто так же. Хорошо поймал! +1
планапус

2
Кстати, так как вы сократили его до одного выражения, вам не нужно определять bдо этого:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Фортран - 118 114 111

Безнадежно маловероятный кандидат, хотя изначально был разработан для размещения на перфокартах. Используя все неясные конструкции из прошлого, некоторый короткий код все еще может быть написан:

do3 i=1,500
j=i
if(mod(i,3))2,1,2
1 print*,'bzzt'
cycle
2 goto(1)mod(j,10)-2
j=j/10
if(j>0)goto2
3 print*,i
end

«Вычисленное переход» 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утверждение? Вывод может быть проверен здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.