Пограйте в гру «bzzt»


56

Переможець: відповідь CJam Aditsu ! Цілих 25 байт! Приємно!

Ви можете продовжувати надсилати свою відповідь, однак перемогти більше не можете. Оригінальна публікація, збережена для нащадків:


Гра «Bzzt» - це гра, в якій потрібно рахувати число (в даному випадку 500). Однак якщо число має в собі 3 або ділиться на 3, ви не говорите числа. Натомість ви говорите "Bzzt".

Правила:

  • Ви не можете жорстко кодувати цифри.
  • Число лише повинно задовольняти принаймні 1 з наступних вимог
    • Ділиться на 3
    • Номер містить 3
  • Деякий тип сепаратора є обов'язковим (12bzzt14 не враховується)
  • Оцінка вимірюється в байтах.
  • Ви повинні нарахувати рівно до 500, починаючи з 1 або 0 (ви вибрали).
  • Цифри повинні виводитися, але не важливо, як (наприклад, stdout, запис у текстовий файл тощо).
  • 0 можна ділити на 3 або не ділити. Ви можете вибрати.
  • Ви можете виводити цифри по одному (наприклад, вихід 1, потім 2, потім bzzt, потім 4 і т.д.) або всі відразу (наприклад, вихід 1 2 bzzt 4 5).
  • Ви повинні замінити букву 3 словом "bzzt". Це не враховує регістр (bZzt, Bzzt, bzzt - все в порядку).

  • Це завдання з , тому виграє найкоротший код.
  • Цей конкурс закінчується 30 червня 2014 року (7 днів від публікації).

1
Для цілей цього питання чи 0 ділиться на 3?
Οurous

2
Це "гудіння" чи "bzzt"? Ви два рази писали "кайф".
адіцу

3
Будь ласка, поясніть. Чи потрібно виводити, buzzчи застосовуються bzztобидві вимоги? Чи потрібно виводити 12bzzt4або bzztдля 1234?
nyuszika7h

4
Я б сказав bzztза 1234. Тут "звичайна" гра в пиття (тільки ми часто робимо це з 7)
Martijn

66
"0 можна ділити на 3 або не ділити. Ви можете вибрати." Я дійсно не думаю, що ти можеш вибрати. 0 mod 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 рядками робить набір різниці, в результаті чого порожній рядок тоді і тільки тоді I% 3 == 0 (перший рядок була порожня) або Iмає 3 цифри в ньому
…I"bzzt"?, як … ? I : "bzzt"; попередній рядок трактується як булеве значення, де "" є помилковим, а будь-який інший рядок істинним
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.
Говард

@Howard: Дійсно, дякую!
Вентеро

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

Працює безпосередньо в тире, можливо, в деяких інших оболонках буде вимкнено розширення історії, наприклад, з bash set +H:

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

Як це працює?
nbubis

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

@ nyuszika7h: правда, але я сподіваюся, що багато хто спробує відповідь в інтерактивній оболонці.
Тор

1
@nbubis: оновлена ​​версія працює, генеруючи послідовність з послідовністю. 0~3!запускається {/3/!b}і разом ці вирази залишають рядок так, як якщо він не ділиться на і не містить 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.|

Друкує необхідний вихід для stdout з пробілом у якості роздільника; можна запускати без проблем у 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, напевно могли поголити ще кілька байтів.
Маттео Італія


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 за дужки та за () підказку. Мене змусив мене декілька разів вибивати браузер ^^
Martijn

Ха-ха. Я перевірив це, console.log()очевидно, але це коротше.
Martijn

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

Перл, 36

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

Редагувати: Я не монах Перла, тому core1024, здається, у своїй відповіді вдалося переграти ще один байт .


1
Використовуйте sayдля збереження 4 байтів:say$_%3&&!/3/?$_:bzzt for 1..5e2
Заїд

@Zaid чому 5e2, а не 500?
Не те, що Чарльз

@Charles: вони еквівалентні
Заїд

1
@Zaid так чому б не бути зрозумілішим?
Не те, що Чарльз

4
@Charles: У контексті виклику коду-гольфу, чи варто навіть дбати?
Заїд

10

C # (71)

Можна безпосередньо виконати в LinqPad.

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

1
Ви можете зберегти char, скориставшись порозрядним способом або ( |) замість логічного або.
Джонбот

@Johnbot Дякуємо за вашу пропозицію.
EvilFonti

Ви також можете видалити дужки навколо умовного.
Джонбот

@Johnbot: Це не долотно або. Це (не коротке замикання) логічно або, оскільки операнди булеві.
Ryan M

Дамп - це лише LinqPad, правда? Для цього в C # як додатку потрібно буде додати метод розширення. (І це 'bzzt', а не 'buzz' =))
Павло

9

Пітон (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

Якби я писав відповідь, я би скинув IO і повернув значення рядка.
гордий haskeller

1
Ви також повинні перейти ==0з<1
гордий haskeller

Також спробуйте створити префікс елем. Я думаю, ви повинні вміти писати 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)

Версія 1б - 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' ; сигнал (о)
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с &може допомогти зберегти дужки.
Joey

Крім того, ви можете використовувати ==замість EQUі, ймовірно, пропустити кілька місць тут і там.
Joey

@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,

@Thor Ви маєте рацію, але я в межах правил, оскільки вони стверджують, що я можу надрукувати bzztлише ті цифри, які поділяються на 3. Додавання іншого способу могло б бути можливим, але знадобиться більше інструкцій.
Докторо Рейхард

1
Правила кажуть: якщо число має в ньому 3, або ділиться на 3, ви не говорите числа. Натомість ви говорите "Bzzt" , тому я б сказав, що обидва повинні бути замінені.
Тор

@Thor Що мене найбільше турбує - це крихітна кома в середині речення. У тому, як я це інтерпретував, обидва способи дії однаково справедливі, що також пояснює 2-е правило: Число повинно задовольняти 1 вимогам ... (або мати 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.
пискливо костене

Пропустив цей шматочок. Вибачте!
anatolyg

Пропускає набагато більше, якщо передаєш це аргументи, хаха. Але, це добре гольф, я вам це дам! Праворуч до використання зворотного значення sprintf, коли ви рухаєтесь до трицифрових чисел, щоб контролювати час, хаха. Так погано .... ха-ха!
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версії для друку тепер така ж коротка, як "відображення". дякую @ will-p


1
+1. Ви можете поміняти (1..500).eachна500.times
Буде Ьр

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... Тут щось не так.
пискливий косинець

Здається, я був занадто жадібним і наткнувся на Невизначене поведінку (змінна зміна та читання між точками послідовності). Тепер виправлено.
anatolyg

Працює зараз :-)
пискливий ossifrage

4

Математика, 54 символи

Це відчувається занадто прямолінійно. Коротші рішення повинні бути можливими.

If[DigitCount[#][[3]] > 0 || #~Mod~3 < 1, Bzzt, #] & /@ Range@500

Вам не потрібні апострофи :)
Доктор belisarius,

@belisarius дійсно. Дякую.
Майкл Стерн

4

T-SQL 2008 - 80

Не вигравати чи нічого, але весело ще більше: Налаштовано завдяки @domager:

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

Маловідомий факт, @ - допустиме ім'я змінної. Це дивно, оскільки встановлений на основі коду варіант є більш SQL, але він коротший! Ця версія працює на будь-якій базі даних. Редагувати: я зміг видалити дві половини, оскільки вони не були потрібні. Я майже впевнений, що це настільки оптимально, як це виходить.

Edit2: Ніколи не кажіть ніколи. Ось тепер це ще більше, використовуючи goto, але це дозволяє нам уникнути блоку. Ми можемо замінити, починаючи і закінчуючи коротшим if, t:, щоб зберегти 6 символів. Ми також переставляємо заяву, переписуючи цикл як псевдо до-час, семантично еквівалентний. Edit3: Так, якось, якщо зараз коротше. Оригінал:

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

Потрібно запустити на головній базі даних. Я люблю T-SQL, незважаючи на його шумні та потворні способи. Можливо, є спосіб зробити це простішим, але, на жаль, для iifвбудованої необхідності обидві сторони домовляються про типи. Правила пріоритету серверів Sql надають перевагу int більшому, ніж рядки. Число також дійсно довге, але в псевдонімі більше символів, ніж варто. Можливо, буде кращий спосіб перетворити число в рядок. Редагувати: str також працює. На 2 символи менше, ніж ltrim


Спочатку я подумав, що ваш код - 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, тому ми отримуємо досить небагато, використовуючи iifвираз. Також ми можемо скористатись коротшим, @+=1щоб врятувати чару
Michael B

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

+=додано у 2008 році. Він підтримує "" + @, але він не робить те, що ви хочете. Як я вже сказав, правила пріоритету, що передаються до int спершу, так що вони передають ''до int, в результаті чого нуль, таким чином ''+@, @все ще набирається як an 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, щоб відкрити ID VBA і вставити код в безпосередню панель і натисніть клавішу Enter.

У VBA: - роздільник ліній,? - це стенограма для друку, iif означає рядок, якщо (подумайте x? "Y": "N"), x / 3 робить поділ з плаваючою комою, а x \ 3 робить ціле поділ, instr повертає позицію char у рядку або 0 в іншому випадку true = -1 і false = 0.

Код в основному збільшується x і виводить x, якщо x / 3 = x \ 3 = instr (1, x, 3) вірно, а "Bzzt" в іншому випадку. x / 3 = x \ 3 порівнює (float) (x / 3) до (int) (x / 3) і повертає булеву (0 - помилково і -1 - істинно). instr (1, x, 3) повертає 0, якщо "3" немає в числі, а додатне ціле число в іншому випадку. Єдиний раз, коли вираз повертається істинним, коли (x / 3 = x \ 3) false (0), а instr (1, x, 3) дорівнює 0, або іншими словами, коли x не ділиться на 3 і не містять цифру "3", саме це ми шукаємо.


4

k4 (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

Ява, 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 символи (див. Коментар планувальника)

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" goto(L1,L2,...,Ln) xрозгалужується на одну з міток L тоді і тільки тоді, коли 1 <= x <= n.

Редагувати: вдалося відшарувати 4 байти, переставивши цикл, який перевіряє цифру 3. Як бонус, код тепер також містить арифметичний if-оператор if(x) a,b,c, який завжди розгалужується на одну з трьох міток: a якщо x <0, b якщо x == 0 або c, якщо x> 0.

На жаль, перші дві версії не дали правильного результату. Цикл цифр-3 зараз працює правильно, і код тепер також включає сучасний логічний вираз if. Ще три байти пішли, бо кому потрібна enddoоперація? Вихід може бути перевірена тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.