Zagraj w grę „bzzt”

56

Zwycięzca: odpowiedź CJam Aditsu ! Aż 25 bajtów! Miły!

Możesz kontynuować przesyłanie odpowiedzi, jednak nie możesz już wygrać. Oryginalny post zachowany dla potomności:


Gra „Bzzt” to gra, w której należy liczyć się do liczby (w tym przypadku 500). Jeśli jednak liczba zawiera 3 lub jest podzielna przez 3, nie podajesz liczby. Zamiast tego mówisz „Bzzt”.

Zasady:

  • Nie można na stałe zakodować liczb.
  • Liczba musi spełniać przynajmniej 1 z poniższych wymagań
    • Podzielny przez 3
    • Liczba zawiera 3
  • Niektóre typy separatorów są obowiązkowe (12bzzt14 się nie liczy)
  • Wynik mierzony jest w bajtach.
  • Musisz policzyć dokładnie do 500, zaczynając od 1 lub 0 (wybrałeś).
  • Liczby muszą być wyprowadzane, ale nie ma znaczenia jak (np. Standardowe wyjście, zapis do pliku tekstowego itp.).
  • 0 może być podzielne przez 3 lub niepodzielne. Możesz wybrać.
  • Możesz wypisywać liczby pojedynczo (np. Wyjście 1, następnie 2, następnie bzzt, następnie 4 itd.) Lub wszystkie jednocześnie (np. Wyjście 1 2 bzzt 4 5).
  • Musisz zastąpić literę 3 słowem „bzzt”. To nie rozróżnia wielkości liter (bZzt, Bzzt, bzzt są w porządku).

  • To wyzwanie dla , więc wygrywa najkrótszy kod.
  • Konkurs kończy się 30 czerwca 2014 r. (7 dni od opublikowania).
Jon
źródło
1
Czy dla celów tego pytania 0 jest podzielne przez 3?
Οurous
2
Czy to „buzz” czy „bzzt”? Jak dotąd napisałeś „buzz”.
aditsu
3
Proszę o wyjaśnienie. Czy muszę generować dane, buzzczy bzztmają zastosowanie oba te wymagania? Czy muszę generować, 12bzzt4czy bzztdla 1234?
nyuszika7h
4
Powiedziałbym bzztza 1234. Jest to „powszechna” gra polegająca na piciu (tylko my często robimy to z
siódemką
66
„0 może być podzielne przez 3 lub nie podzielne. Możesz wybrać.” Naprawdę nie sądzę, że możesz wybrać. 0 mod 3 to 0, to naprawdę nie jest kwestia opinii.
David Conrad

Odpowiedzi:

33

CJam - 25

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

Dzięki Howard :)

Wypróbuj na http://cjam.aditsu.net/

Wyjaśnienie:

501{…}fIjest w zasadzie for(int I=0; I<501; ++I) {…}
3skonwertuje 3 na ciąg, tzn. „3”
I3%oznacza I% 3
<pobiera lewy podciąg - "3".substring(0, I % 3)- który jest „” dla I% 3 == 0, a „3” w przeciwnym razie
Iskonwertuje Ina ciąg
-z 2 ciągami robi ustawioną różnicę, w wyniku czego ciąg iff I% 3 == 0 (pierwszy ciąg był pusty) lub Ima 3 cyfry,
…I"bzzt"?jest jak … ? I : "bzzt"; poprzedni ciąg jest traktowany jako wartość logiczna, gdzie „” jest fałszem, a każdy inny ciąg jest prawdziwy,
Ndodaje nowy wiersz

aditsu
źródło
Można użyć tego samego triku, jak w moim roztwór golfscript i zapisać logiczny i: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard
29

Ruby, 43

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

Całkiem proste.

Edycja: Zapisano jeden bajt, dzięki Howard!

Ventero
źródło
1
Możesz zapisać jedną białą spację, jeśli piszesz "#{a}"[?3]||a%3<1.
Howard
@ Howard: Rzeczywiście, wielkie dzięki!
Ventero
1
Jeszcze bardziej nieczytelny ale niestety sama długość: "#{a}"[?3[0,a%3]].
Howard
Co o wymianie putsz pi zapisywania 3 znaki?
David Unric
1
@DavidUnric pwypisuje wynik wywołania inspectswojego argumentu (w porównaniu do putów , które wywołują to_s). Zamiast drukować Bzzt(czyli jest :Bzzt.to_s), drukowałby :Bzzt, co nie odpowiada specyfikacjom wyjściowym.
Ventero
25

seq i GNU sed - 42 33 31 30

Działa bezpośrednio w desce rozdzielczej, niektóre inne powłoki mogą wymagać wyłączenia rozszerzania historii, np. Z bash set +H:

seq 500|sed 0~3!{/3/!b}\;cbzzt
Thor
źródło
Jak to działa?
nbubis
Rozszerzanie historii jest domyślnie wyłączone w skryptach powłoki.
nyuszika7h
@ nyuszika7h: prawda, ale spodziewam się, że wielu spróbuje odpowiedzi w interaktywnej powłoce.
Thor
1
@nbubis: zaktualizowana wersja działa, generując sekwencję z sekw. 0~3!uruchamia się {/3/!b}i razem te wyrażenia opuszczają linię tak, jakby nie była podzielna przez i nie zawierała 3. Ostatni bit „koryguje” linię do bzzt.
Thor
18

kod maszynowy x86 w systemie DOS (plik .com) - 71 bajtów

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

Drukuje wymagane wyjście na standardowe wyjście ze spacją jako separatorem; można uruchomić bez problemów w DosBox.

Skomentowany montaż:

    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
Matteo Italia
źródło
5
SZACUNEK!!!!! Niesamowity!
yossico
@yossico: dziękuję! :) właściwie to nic specjalnego, jestem pewien, że ludzie, którzy napisali asembler dla DOS, z pewnością mogliby zgolić jeszcze więcej bajtów.
Matteo Italia
17

Perl - 35 40 42

print$_*!/3/%3?$_:bzzt,$/for 1..500
rdzeń 1024
źródło
17

PHP, bez separatora - 62, 61,59,58,52,49 47

Nie oznacza to, że między nimi powinien znajdować się spacja / znak nowej linii / separator bez:

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

Z separatorem 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
  • Właśnie znalazłem małe „oszustwo”, nie potrzebuję później miejsca echo, trochę mnie uratowało.
  • Tworzy przełamane
  • Kolejne małe „oszustwo”, bzzt nie potrzebuje cytatów (przetestował je). Nie jest to najlepsza droga, ale działa.

JavaScript - 54,51 50

Ta sama zasada, ale funkcje javascript:

for(i=0;i++<500;)alert(i%3<1|/3/.test(i)?'bzzt':i)
Martijn
źródło
Dzięki @ core za nawiasy i za () wskazówkę. For sprawił, że kilkakrotnie zawiesiłem przeglądarkę ^^
Martijn
Ha ha. Testowałem to console.log()oczywiście, ale to jest krótsze.
Martijn
1
Twoje rozwiązanie Javascript liczy się na 501.
nderscore
1
PHP do 52: jest char 245, nieco odwrócone . <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;õ\n
primo
1
Można wymienić !strpbrk($1,3)z trim(3,$i)uratować 4 bajty
aross
16

JavaScript 50 49

-1 bajt dzięki core1024

for(i=0;i++<500;)alert(i%3*!/3/.test(i)?i:'bzzt')
nderscore
źródło
Wiedziałem, że da się to zrobić! Ale nie znalazłem jak
edc65
1
Możesz sobie wyobrazić moją twarz, gdy rozwiązanie JavaScript wygrywa z moim LiveScript.
nyuszika7h
w drugim rozwiązaniu możesz usunąć jeden znak i nadal będzie działać
user902383
@ user902383 To nie jest poprawny wynik bez &&operatora logicznego . Na przykład: 497 % 3 = 2=> 2 & true = 0=>bzzt
nderscore
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')- 49: P
rdzeń 1024
11

GolfScript, 30 29 znaków

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

Nie tak prosta implementacja w GolfScript, można przetestować tutaj .

Howard
źródło
10

Perl, 36

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

Edycja: Nie jestem mnichem Perla, więc core1024 wydaje się, że udało mu się zagrać w inny bajt w swojej odpowiedzi .

Ventero
źródło
1
Użyj, sayaby zapisać 4 bajty:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid
@Zaid dlaczego 5e2, a nie 500?
Nie to, że Charles
@Charles: są równoważne
Zaid
1
@Zaid więc dlaczego nie być jaśniejszym?
Nie to, że Charles
4
@Charles: Czy w kontekście wyzwania golfowego należy się tym przejmować?
Zaid
10

C # (71)

Może być bezpośrednio wykonany w LinqPad.

for(var i=0;++i<501;)(i%3<1|(i+"").Contains("3")?"buzz":i+"").Dump();
EvilFonti
źródło
1
Możesz zapisać znak za pomocą bitowego-lub ( |) zamiast logicznego-lub.
Johnbot
@Johnbot Dzięki za sugestię.
EvilFonti
Możesz także usunąć nawiasy wokół warunkowego.
Johnbot
@Johnbot: To nie jest bitowe ani. Jest to logiczne (lub nie powodujące zwarcia), ponieważ operandy są logiczne.
Ryan M
Zrzut to tylko LinqPad, prawda? Wykonanie tego w C # jako aplikacji wymagałoby dodania metody rozszerzenia. (I to jest „bzzt”, a nie „buzz” =))
Paul
9

Python (52)

Dzięki, grc!

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

Stara wersja:

print['Bzzt'if'3'in`i`or i%3<1 else`i`for i in range(501)]
.ıʇǝɥʇuʎs
źródło
1
Nieco krótszy:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
grc
4
O jeden znak krótszy:['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
Taylor Fausak
źródło
Gdybym pisał odpowiedź, porzuciłbym IO i zwrócił wartość ciągu.
dumny haskeller
1
Należy również przełączyć ==0z<1
dumny haskeller
Spróbuj także zrobić prefiks elem. Myślę, że powinieneś być w stanie pisać elem'3'$show n, który jest o wiele krótszy. Albo nie. Nie sprawdziłem.
dumny haskeller
@proudhaskeller: Specyfikacja mówi, że „liczby muszą być wyprowadzane”, więc IO musi być zaangażowane. Używanie elemw notacji prefiksu nie zapisuje żadnych znaków, ponieważ przed apostrofem musi być spacja; inaczej dostaniesz Not in scope: elem'3'. <1Ale dobre oko !
Taylor Fausak
6

JavaScript 66 63 60

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

Dzięki edc65 za sugestię użycia tablicy. Dane wyjściowe będą teraz rozdzielane przecinkami.


Stare wersje

Wersja 1a - 66

Wydrukuj od 1 do 500 w polu alertu zgodnie z regułą. Dane wyjściowe są rozdzielone spacjami.

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

Wersja 1b - 65

Jeśli uznamy, że 0 nie jest podzielne przez 3, możemy skrócić rozwiązanie do 65 znaków:

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

Wersja 2 - 63

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

Dzięki grc za sugestię zmniejszenia długości.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
1
Myślę, że możesz zacząćfor(a=i="";i<500;)a+=++i ...
grc
I rozdzielone przecinkami dane wyjściowe są OK, tablica będzie krótsza: dla (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)]}

Głównie praca Ventero, z niewielką pomocą dotyczącą składni przeze mnie ;-)

Joey
źródło
6

R, 49 znaków

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

Wyjaśniono:

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

Stosowanie:

> 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
plannapus
źródło
6

Kobra - 70

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

Partia - 222

Ponieważ naprawdę kocham ten język ... z jakiegoś powodu ...

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)
Obrzydliwe
źródło
Powinieneś być w stanie upuścić cudzysłowy wokół operandów w pierwszym, ifponieważ wiesz, że jest co najmniej jedna cyfra. Również łączenie pełnego bloku wewnątrz forz &może działać w celu zapisania nawiasów.
Joey
Co więcej, możesz użyć ==zamiast EQUi prawdopodobnie upuścić kilka miejsc tu i tam.
Joey
@Joey Dzięki za sugestie!
Ο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

Zauważ, że większość poleceń w TI-BASIC jest reprezentowana jako jednostki jednobajtowe.

Kod wymaga wcześniejszego zainicjowania X na 0 (w przeciwnym razie są to dodatkowe 3 bajty).

Podjąłem kilka prób ogolenia kilku bajtów, więc nie opisuję wszystkiego, co tutaj zrobiłem, aby nie zagracać postu. Były one głównie ukierunkowane na skrócenie pętli, co zrobiłem w tej wersji za pomocą pętli While i przez skrócenie warunku If za pomocą Anszmiennej.

Doktoro Reichard
źródło
Popraw mnie, jeśli się mylę, ale nie wydaje się, aby bzztliczby zawierały 3, np. 13.
Thor
@Thor Masz rację, ale jestem w zgodzie z zasadami, ponieważ stwierdzają, że mogę drukować bzzttylko dla liczb, które są podzielne przez 3. Dodanie innego sposobu mogłoby być możliwe, ale wymagałoby więcej instrukcji.
Doktoro Reichard
1
Reguły mówią: jeśli liczba zawiera 3 lub jest podzielna przez 3, nie podajesz liczby. Zamiast tego mówisz „Bzzt” , więc powiedziałbym, że oba należy wymienić.
Thor
@Thor Najbardziej przeszkadza mi teraz malutki przecinek w środku zdania. Sposób, w jaki to zinterpretowałem, oba sposoby postępowania są jednakowo ważne, co wyjaśnia również drugą zasadę: Liczba musi spełniać tylko 1 z wymagań ... (albo mieć 3, albo być podzielna przez 3)
Doktoro Reichard
1
Błędnie przeliczyłeś bajty tutaj, ponieważ małe litery są tokenami dwubajtowymi. Zgadzam się z interpretacją reguł przez Thora, ponieważ jest to ta, której używa każda odpowiedź powyżej tego.
lirtosiast
5

C, 93

Do diabła z tym ...

main(i){char s[9]="bzzt";while(i<498+sprintf(s+5,"%d",i))puts(s+5*(i++%3&&!strchr(s+5,51)));}
piskliwy kostuch
źródło
Ma to małą usterkę - pomija wyjściei = 0
anatolyg
4
@anatolyg „Musisz dokładnie policzyć do 500, zaczynając od 1 lub 0 (wybrałeś)”. - Zdecydowałem się zacząć od 1.
piskliwy ossifrage
Trochę mi brakowało. Przepraszam!
anatolyg
Pomija znacznie więcej, jeśli przekażesz mu argumenty, lol. Ale jest dobrze golfa, dam ci to! Aż do użycia wartości zwracanej przez sprintf, gdy zmierzasz w kierunku trzycyfrowych liczb do kontrolowania while, lol. Tak źle .... haha!
DreamWarrior
5

Julia 64 bajty

map(x->x%3==0||contains(string(x),"3")?"Bzzt":string(x),[1:500])
bakerg
źródło
2
[println(a%3==0||3 in digits(a)?"bzzt":a) for a=1:500]ma 54 bajty. Zwrócenie tablicy również nie powoduje wydrukowania całej tablicy, więc nie jestem pewien, czy liczy się ona jako „wynik”. Jeśli zwrócona tablica się liczy, [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]może liczyć i zdobyć 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

... bo po co używać pliku wsadowego, gdy istnieje idealnie prosta liniówka ... :-)

znak
źródło
5

groovy - 51

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

edycja: użycie timeswersji drukowanej jest teraz tak krótkie, jak „wyświetlanie”. dzięki @ will-p

cfrick
źródło
1
+1. Możesz zamienić (1..500).eachna500.times
Will Lp
4

C, 80

Używanie spacji jako separatorów zamiast podziałów linii.

n;main(){for(;n++<500;)printf(n%10^3&&n/10%10^3&&n/100^3&&n%3?"%d ":"bzzt ",n);}
anatolig
źródło
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt... Coś tu nie gra.
piskliwy ossifrage
Wygląda na to, że byłem zbyt chciwy i wpadłem w Niezdefiniowane Zachowanie (zmienna zmieniona i odczytana między punktami sekwencji). Teraz naprawione.
anatolyg
Działa teraz :-)
piskliwy ossifrage
4

Mathematica, 54 znaki

To wydaje się zbyt proste. Krótsze rozwiązania muszą być możliwe.

If[DigitCount[#][[3]] > 0 || #~Mod~3 < 1, Bzzt, #] & /@ Range@500
Michael Stern
źródło
Nie potrzebujesz apostrofów :)
Dr Belisarius
@ Belizariusz rzeczywiście. Dzięki.
Michael Stern
4

T-SQL 2008 - 80

Nie wygrywa ani nic innego, ale sprawia przyjemność: Poprawiono dzięki @domager:

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

Mało znany fakt, @ jest prawidłową nazwą zmiennej. To dziwne, ponieważ kod oparty na zestawie jest tym bardziej wariantem SQL, ale krótszy jest krótszy! Ta wersja działa na dowolnej bazie danych. Edycja: mogłem usunąć dwa półwyroby, ponieważ nie były one potrzebne. Jestem prawie pewien, że jest to tak optymalne, jak to możliwe.

Edycja2: Nigdy nie mów nigdy. Tutaj jest teraz jeszcze grubszy przy użyciu goto, ale pozwala nam uniknąć bloku. Możemy zamienić, zaczynając, kończąc na krótszym, jeśli, t:, musisz zapisać 6 znaków. Przekształcamy również instrukcję, przepisując pętlę jako pseudo do-while, semantycznie równoważne. Edycja3: Tak, w jakiś sposób, jeśli jest teraz krótszy. Oryginał:

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

Musi być uruchomiony w głównej bazie danych. Uwielbiam T-SQL pomimo jego hałaśliwych i brzydkich sposobów. Może być sposób na uproszczenie tego, ale niestety iifwbudowane wymaga, aby obie strony uzgodniły typy. Reguły pierwszeństwa serwerów SQL dają int wyższy priorytet niż łańcuchy. Liczba jest również bardzo długa, ale aliasing zawiera więcej znaków, niż jest to warte. Może być lepszy sposób na przekształcenie liczby w ciąg znaków. Edycja: str również działa. 2 mniej znaków niż ltrim

Michael B.
źródło
Na początku myślałem, że twój kod ma długość 2012.96 bajtów.
nyuszika7h
nieco dłużej w @ 101, ale nie polega na stoledeclare @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, całkowicie słuszne, a ponadto możemy zapisać sporo znaków, zmieniając zmienną na @. Wtedy użycie iif () jest jeszcze krótsze niż wydruk if (...), w przeciwnym razie zyskamy całkiem sporo, używając iifwyrażenia. Możemy również użyć krótszego, @+=1aby uratować znak
Michael B
Nie wiedziałem, że obsługiwany jest T-SQL +=. Nie mam go pod ręką do testowania, ale jestem prawie pewien, że obsługuje ''+@konwersję ciągów przy użyciu niezmiennego ustawienia narodowego.
Peter Taylor
+=został dodany w 2008 roku. Obsługuje +, ale nie robi tego, co chcesz. Jak powiedziałem, reguły pierwszeństwa rzutują na int, więc rzutuje ''na int, w wyniku czego zero, więc nadal ''+@jest @wpisywane jako int. strdziała i nie jest o wiele droższy niż cokolwiek innego (2 dodatkowe znaki dla parens). Wybrałem tutaj t-sql 2012 ze względu na IIFoperatora, który wie, że być może wydanie z 2016 roku pozbędzie się trochę hałasu i zacznie być konkurencyjny (mało prawdopodobne).
Michael B
4

VBA: 54

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

Otwórz swój ulubiony program pakietu Office, naciśnij klawisze Alt + F11, aby otworzyć IDE VBA, wklej kod do bezpośredniego panelu i naciśnij klawisz Enter.

W VBA: czy separator linii jest? jest skrótem do wydruku, iif oznacza inline jeśli (pomyśl x? "Y": "N"), x / 3 wykonuje dzielenie zmiennoprzecinkowe, a x \ 3 wykonuje dzielenie całkowite, instr zwraca pozycję znaku w ciągu lub 0 w przeciwnym razie prawda = -1 i fałsz = 0.

Kod w zasadzie zwiększa x i zwraca x, jeśli x / 3 = x \ 3 = instr (1, x, 3) jest prawdą, a „Bzzt” w przeciwnym razie. x / 3 = x \ 3 porównuje (liczba zmiennoprzecinkowa) (x / 3) do (int) (x / 3) i zwraca wartość logiczną (0 to fałsz, a -1 to prawda). instr (1, x, 3) zwraca 0, jeśli „3” nie jest liczbą, a dodatnią liczbą całkowitą w przeciwnym razie. Wyrażenie zwraca wartość true tylko wtedy, gdy (x / 3 = x \ 3) ma wartość false (0), a instr (1, x, 3) ma wartość 0 lub innymi słowy, gdy x nie jest podzielne przez 3 i nie zawierają cyfrę „3”, która jest dokładnie tym, czego szukamy.

JesterBLUE
źródło
4

k4 (37) (35)

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

k4brakuje mu wbudowanego polecenia modulo, a użycie tego qwymagałoby dodatkowej postaci; ta wersja (ab) używa wbudowanego formatu wyjściowego, aby sprawdzić, czy ciąg wyniku dzielenia xprzez 3 zawiera kropkę dziesiętną.

EDYTOWAĆ:

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

Sprytne, ponieważ dopasowanie do kropki dziesiętnej może być, mogę ogolić dwa bajty, sprawdzając, czy 3*floor x%3jest nadal x.

Aaron Davies
źródło
Pozytywnie za sprytne dopasowanie przecinka dziesiętnego!
Mark
Nie aktualizuj wszystkich swoich odpowiedzi. To zepchnie wszystkie aktywne wyzwania z pierwszej strony. Byłoby miło, gdybyś robił tylko jeden lub dwa razy. (Chociaż nawet nie myślę, że zmiana pomiędzy h1i h2jest na tyle ważna, że ​​uzasadnia edycję.)
Martin Ender
3

Grzmotnąć, 53 52 48 46

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

Wymaga GNU sed (używa crozszerzenia).


źródło
3

Java, 142 131 dzięki sugestii 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");}}
użytkownik902383
źródło
1
Moja Java jest trochę zardzewiała. Ale czy nie będzie krótszy z operandem? i% 3> 0 i& („” + i) .indexOf (51) <0? i: „bzzt”. Możliwe jest również pominięcie {} forloop.
WozzeC
to 122 bajty, 9 mniej: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"));}}
Luigi Cortese
3

R (40) (36)

Jest to w zasadzie plannapus nieco skrócona, ale nie mogę jeszcze komentować

Aktualizacja: -4 znaki (patrz komentarz plannapusa)

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

Wynik:

  [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"
Strzelanina
źródło
Ponieważ wiele funkcji operacji na łańcuchach znaków (takich jak strsplit) wyrzuca błąd, gdy jest zasilany znakami niebędącymi znakami, to też założyłem grepl. Dobry chwyt! +1
plannapus
2
Nawiasem mówiąc, ponieważ zredukowałeś je do jednego wyrażenia, nie musisz bwcześniej definiować :a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus
3

Fortran - 118 114 111

Beznadziejnie mało prawdopodobny kandydat, choć pierwotnie opracowany, aby pasował do kart ciosów. Korzystając ze wszystkich niejasnych konstrukcji z przeszłości, nadal można napisać krótki kod:

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

„Obliczone goto” goto(L1,L2,...,Ln) xrozgałęzia się do jednej z etykiet L wtedy i tylko wtedy, gdy 1 <= x <= n.

Edycja: Udało się ogolić 4 bajty, przestawiając pętlę sprawdzającą cyfrę 3. Jako bonus, kod zawiera teraz także arytmetyczną instrukcję if if(x) a,b,c, która zawsze rozgałęzia się do jednej z trzech etykiet: a jeśli x <0, b jeśli x == 0 lub c jeśli x> 0.

Niestety pierwsze dwie wersje nie wygenerowały prawidłowego wyniku. Pętla cyfry 3 działa teraz poprawnie, a kod zawiera teraz także nowoczesną logiczną instrukcję if. Trzy kolejne bajty zniknęły, bo kto potrzebuje enddoinstrukcji? Dane wyjściowe można zweryfikować tutaj .

sigma
źródło