Mainkan game "bzzt"


56

Pemenang: Jawaban CJam Aditsu ! 25 byte kekalahan! Bagus!

Anda dapat terus mengirimkan jawaban Anda, namun Anda tidak bisa lagi menang. Pos asli disimpan untuk anak cucu:


Gim "Bzzt" adalah gim di mana Anda harus menghitung angka (dalam hal ini 500). Namun, jika angka tersebut memiliki angka 3 di dalamnya, atau dapat dibagi dengan angka 3, Anda tidak mengatakan angka tersebut. Sebaliknya, Anda mengatakan "Bzzt".

Aturan:

  • Anda tidak dapat membuat kode dengan angka-angka.
  • Jumlahnya hanya harus memenuhi setidaknya 1 dari persyaratan berikut
    • Dibagi dengan 3
    • Angka berisi 3
  • Beberapa jenis pemisah adalah wajib (12bzzt14 tidak masuk hitungan)
  • Skor diukur dalam byte.
  • Anda harus menghitung tepat hingga 500, mulai dari 1 atau 0 (Anda memilih).
  • Angka-angka harus berupa keluaran, tetapi tidak masalah bagaimana (misalnya, stdout, menulis ke file teks, dll.).
  • 0 dapat dibagi 3 atau tidak habis dibagi. Kamu bisa memilih.
  • Anda dapat menampilkan angka satu per satu (ex, output 1, lalu 2, lalu bzzt, lalu 4, dll) atau sekaligus (misalnya, output 1 2 bzzt 4 5).
  • Anda harus mengganti huruf 3 dengan kata "bzzt". Ini tidak peka huruf besar-kecil (bZzt, Bzzt, bzzt semuanya oke).

  • Ini adalah tantangan , sehingga kode terpendek menang.
  • Kontes ini berakhir 30 Juni 2014 (7 hari sejak posting).

1
Untuk keperluan pertanyaan ini, apakah 0 habis dibagi 3?
Kamis

2
Apakah itu "buzz" atau "bzzt"? Anda menulis "buzz" sejauh ini.
aditsu

3
Mohon klarifikasi. Apakah saya harus membuat output buzzatau bzztjika kedua persyaratan berlaku? Apakah saya harus output 12bzzt4atau bzztuntuk 1234?
nyuszika7h

4
Saya akan mengatakan bzztuntuk 1234. Ini adalah permainan minum 'umum' di sini (hanya saja kita sering melakukannya dengan 7)
Martijn

66
"0 bisa dibagi 3 atau tidak habis dibagi. Kamu bisa memilih." Saya benar-benar tidak berpikir Anda dapat memilih. 0 mod 3 adalah 0, itu bukan masalah pendapat.
David Conrad

Jawaban:


33

CJam - 25

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

Terima kasih Howard :)

Cobalah di http://cjam.aditsu.net/

Penjelasan:

501{…}fIpada dasarnya for(int I=0; I<501; ++I) {…}
3smengkonversi 3 ke string, yaitu "3"
I3%adalah I% 3
<mendapat substring kiri - "3".substring(0, I % 3)- yang "" untuk I% 3 == 0 dan "3" jika
Isdikonversi Ike string
-dengan 2 string membuat perbedaan set, menghasilkan kosong string iff I% 3 == 0 (string pertama kosong) atau Imemiliki 3 digit di dalamnya
…I"bzzt"?adalah seperti … ? I : "bzzt"; string sebelumnya diperlakukan sebagai nilai boolean, di mana "" salah dan string lainnya benar
Nmenambahkan baris baru


Anda dapat menggunakan trik yang sama seperti pada solusi golfscript saya dan menyimpan logis dan: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard

29

Ruby, 43

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

Cukup mudah.

Sunting: Disimpan satu byte, terima kasih Howard!


1
Anda dapat menyimpan satu spasi putih jika Anda menulis "#{a}"[?3]||a%3<1.
Howard

@ Howard: Memang, terima kasih banyak!
Ventero

1
Bahkan lebih terbaca tapi sayangnya sama panjang: "#{a}"[?3[0,a%3]].
Howard

Bagaimana mengganti putsdengan pdan tabungan 3 karakter?
David Unric

1
@ DavidVic pmencetak hasil dari memanggil inspectargumennya (dibandingkan dengan menempatkan, yang memanggil to_s). Jadi alih-alih mencetak Bzzt(yang :Bzzt.to_s), itu akan mencetak :Bzzt, yang tidak cocok dengan spesifikasi keluaran.
Ventero

25

seq dan GNU sed - 42 33 31 30

Berfungsi langsung di dasbor, beberapa shell lain mungkin perlu menonaktifkan ekspansi sejarah, misalnya dengan bash set +H:

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

Bagaimana cara kerjanya?
nbubis

Ekspansi riwayat dinonaktifkan secara default di skrip shell.
nyuszika7h

@ nyuszika7h: benar, tapi saya berharap banyak yang akan mencoba jawabannya di shell interaktif.
Thor

1
@nbubis: versi yang diperbarui berfungsi dengan membuat urutan dengan seq. 0~3!menjalankan {/3/!b}dan bersama-sama ungkapan-ungkapan ini meninggalkan garis seolah-olah tidak dapat dibagi oleh dan tidak mengandung 3. Bit terakhir "mengoreksi" garis menjadi bzzt.
Thor

18

kode mesin x86 pada DOS (file .com) - 71 byte

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

Mencetak output yang diperlukan ke stdout dengan spasi sebagai pembatas; dapat dijalankan tanpa masalah di DosBox.

Majelis yang dikomentari:

    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
MENGHORMATI!!!!! Luar biasa!
Yossico

@ yossico: terima kasih! :) sebenarnya, tidak ada yang benar-benar istimewa, saya yakin orang-orang yang benar-benar menulis assembly untuk DOS pasti dapat mencukur lebih banyak byte.
Matteo Italia


17

PHP, tanpa pemisah - 62, 61,59,58,52,49 47

Tidak dikatakan harus ada spasi / baris baru / pemisah di antara mereka, tanpa:

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

Dengan pemisah, 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
  • Baru saja menemukan 'cheat' kecil, tidak perlu spasi setelahnya echo, menyelamatkan saya sedikit.
  • The menciptakan baris baru
  • 'Cheat' kecil lainnya, bzzt tidak perlu penawaran (mengujinya). Bukan cara untuk pergi, tetapi berhasil.

Javascript - 54,51 50

Prinsip yang sama, tetapi fungsi javascript:

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

Terima kasih @ core untuk tanda kurung dan untuk tip (). Untuk membuat saya crash browser saya beberapa kali ^^
Martijn

Ha ha. Saya mengujinya dengan console.log()jelas, tetapi ini lebih pendek.
Martijn

1
Solusi Javascript Anda terhitung hingga 501.
nderscore

1
PHP untuk 52: <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;Ini õadalah char 245, sedikit terbalik \n.
primo

1
Anda dapat mengganti !strpbrk($1,3)dengan trim(3,$i)untuk menyimpan 4 byte
aross

16

Javascript 50 49

-1 byte berkat core1024

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

Saya tahu itu bisa dilakukan! Tetapi tidak menemukan caranya
edc65

1
Anda dapat membayangkan wajah saya ketika solusi JavaScript mengalahkan LiveScript saya.
nyuszika7h

dalam solusi kedua, Anda dapat menghapus satu & masuk dan masih akan berfungsi
user902383

@ user902383 Ini bukan hasil yang valid tanpa &&operator boolean . Sebagai contoh: 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 karakter

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

Implementasi yang tidak begitu mudah dalam GolfScript, dapat diuji di sini .


10

Perl, 36

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

Sunting: Saya bukan seorang biksu Perl, jadi core1024 tampaknya telah berhasil memainkan byte lain dari ini dalam jawabannya .


1
Gunakan sayuntuk menyimpan 4 byte:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@Zaid mengapa 5e2 dan tidak 500?
Bukan karena Charles

@ Charles: keduanya setara
Zaid

1
@ Zaid jadi mengapa tidak lebih jelas?
Bukan berarti Charles

4
@ Charles: Dalam konteks tantangan kode-golf, haruskah orang peduli?
Zaid

10

C # (71)

Dapat langsung dieksekusi di LinqPad.

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

1
Anda dapat menyimpan char dengan menggunakan bitwise-atau ( |) alih-alih logis-atau.
Johnbot

@ Johnbot Terima kasih atas saran Anda.
EvilFonti

Anda dapat menghapus tanda kurung di sekitar conditional juga.
Johnbot

@ Johnbot: Itu bukan bitwise-atau. Ini (non-hubungan pendek) logis-atau, karena operan adalah boolean.
Ryan M

Dump hanya LinqPad, benar? Melakukan ini dalam C # sebagai aplikasi akan membutuhkan metode ekstensi untuk ditambahkan. (Dan itu 'bzzt' bukan 'buzz' =))
Paul

9

Python (52)

Terima kasih grc!

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

Versi lama:

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

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

4
Satu char lebih pendek:['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

Jika saya menulis jawaban, saya akan membuang IO dan mengembalikan nilai string.
haskeller bangga

1
Anda juga harus beralih ==0dengan<1
haskeller bangga

Juga, coba buat awalan elem. Saya pikir Anda harus bisa menulis elem'3'$show n, yang lebih pendek. Atau tidak. Saya tidak memeriksa.
haskeller bangga

@proudhaskeller: Spesifikasi menyatakan bahwa "angka harus berupa output", jadi IO harus dilibatkan. Dan menggunakan elemnotasi awalan tidak menyimpan karakter apa pun karena harus ada spasi sebelum tanda kutip; kalau tidak Anda akan mendapatkan Not in scope: elem'3'. Baik mata dengan <1, meskipun!
Taylor Fausak

6

JavaScript 66 63 60

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

Terima kasih kepada edc65 untuk saran penggunaan array. Output sekarang akan dipisahkan oleh koma.


versi lama

Versi 1a - 66

Cetak dari 1 hingga 500 dalam kotak peringatan sesuai aturan. Outputnya dipisahkan oleh ruang.

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

Versi 1b - 65

Jika kami menganggap 0 tidak dapat dibagi dengan 3, kami dapat mempersingkat solusi menjadi 65 karakter:

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

Versi 2 - 63

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

Terima kasih kepada grc atas sarannya untuk mengurangi panjangnya.


1
Saya pikir Anda bisa mulai denganfor(a=i="";i<500;)a+=++i ...
grc

Output koma yang saya pisah OK, array akan lebih pendek: untuk (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? I: 'bzzt' ; lansiran (o)
edc65

6

PowerShell, 42

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

Sebagian besar karya Ventero, dengan sedikit bantuan tentang sintaks oleh saya ;-)


6

R, 49 karakter

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

Dijelaskan:

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

Pemakaian:

> 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

Cobra - 70

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

Gelombang - 222

Karena saya benar-benar menyukai bahasa ini ... karena suatu alasan ...

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)

Anda harus dapat membuang tanda kutip di sekitar operan di yang pertama ifkarena Anda tahu bahwa setidaknya ada satu digit. Juga menyatukan blok lengkap dalam fordengan &mungkin bekerja untuk menyelamatkan tanda kurung.
Joey

Selain itu, Anda dapat menggunakan ==sebagai ganti EQUdan mungkin menjatuhkan beberapa spasi di sana-sini.
Joey

@ Joey Terima kasih atas sarannya!
Kamis

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

Perhatikan bahwa sebagian besar perintah pada TI-BASIC direpresentasikan sebagai entitas byte tunggal.

Kode membutuhkan X untuk diinisialisasi ke 0 sebelumnya (jika tidak, ini merupakan tambahan 3 byte).

Saya telah melakukan beberapa upaya untuk mencukur beberapa byte, jadi saya tidak merinci semua yang telah saya lakukan di sini, agar tidak mengacaukan postingan. Mereka sebagian besar diarahkan untuk memperpendek loop, yang telah saya lakukan dalam versi ini oleh loop Sementara dan dengan memperpendek kondisi If dengan bantuan Ansvariabel.


Koreksi saya jika saya salah, tetapi sepertinya ini bukan bzztangka yang mengandung angka 3, mis. 13.
Thor

@Thor Anda benar, tetapi saya berada dalam aturan, karena mereka menyatakan bahwa saya dapat mencetak bzzthanya angka-angka yang dapat dibagi oleh 3. Menambahkan cara lain mungkin saja, tetapi akan membutuhkan lebih banyak instruksi.
Doktoro Reichard

1
Aturan mengatakan: jika angka memiliki 3 di dalamnya, atau dapat dibagi dengan 3, Anda tidak mengatakan nomor. Sebagai gantinya, Anda mengatakan "Bzzt" , jadi saya akan mengatakan keduanya harus diganti.
Thor

@Thor Yang paling menggangguku sekarang adalah koma kecil di tengah kalimat. Cara saya menafsirkannya, kedua cara melakukan adalah sama-sama valid, yang juga menjelaskan aturan ke-2: Angka hanya harus memenuhi 1 dari persyaratan ... (baik memiliki 3 atau dapat dibagi 3)
Doktoro Reichard

1
Anda salah menghitung byte di sini karena huruf kecil adalah token dua-byte. Saya setuju dengan interpretasi Thor tentang aturan karena ini adalah yang digunakan oleh setiap jawaban di atas.
lirtosiast

5

C, 93

Persetan ...

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

Ini memiliki kesalahan kecil - melompati output untuki = 0
anatolyg

4
@anatolyg "Anda harus menghitung dengan tepat hingga 500, mulai dari 1 atau 0 (Anda memilih)." - Saya memilih untuk memulai dari 1.
squeamish ossifrage

Kehilangan bagian itu. Maaf!
anatolyg

Melewati lebih banyak jika Anda memberikan argumen, lol. Tapi, golfnya bagus, aku akan memberimu itu! Tepat untuk menggunakan nilai kembalinya sprintf saat Anda cenderung ke arah angka tiga digit untuk mengontrol while, lol. Sangat buruk .... haha!
DreamWarrior

5

Julia 64 byte

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]adalah 54 byte. Juga mengembalikan array tidak mencetak seluruh array, jadi saya tidak yakin apakah itu dianggap sebagai "output". Jika mengembalikan jumlah array maka [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]mungkin menghitung dan skor 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

... karena mengapa menggunakan file batch ketika ada satu-liner yang sangat mudah ... :-)


5

asyik - 51

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

sunting: menggunakan timesversi pencetakan sekarang sependek "menampilkan". terima kasih @ will-p


1
+1. Anda dapat bertukar (1..500).eachuntuk500.times
Will Lp

4

C, 80

Menggunakan spasi sebagai pemisah alih-alih pemisah baris.

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... Ada yang salah di sini.
squeamish ossifrage

Sepertinya saya terlalu serakah, dan tersandung ke dalam Perilaku Tidak Terdefinisi (variabel dimodifikasi dan dibaca antara titik-titik urutan). Sekarang sudah diperbaiki.
anatolyg

Bekerja sekarang :-)
squeamish ossifrage

4

Mathematica, 54 Karakter

Ini terasa terlalu mudah. Solusi yang lebih pendek harus dimungkinkan.

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

Anda tidak perlu tanda kutip :)
Dr. belisarius

@ Belisarius memang. Terima kasih.
Michael Stern

4

T-SQL 2008 - 80

Tidak akan menang atau apa pun selain kesenangan: Tweaked berkat @domager:

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

Fakta yang sedikit diketahui, @ adalah nama yang valid untuk suatu variabel. Rasanya aneh karena kode berbasis set adalah varian SQL yang lebih banyak, tetapi lebih pendek lebih pendek! Versi ini berfungsi pada basis data apa pun. Sunting: Saya dapat menghapus dua semifinal karena tidak diperlukan. Saya cukup yakin ini seoptimal mungkin.

Sunting2: Tidak pernah mengatakan tidak pernah. Di sini sekarang bahkan lebih kotor menggunakan goto, tetapi memungkinkan kita untuk menghindari blokir. Kita dapat Mengganti sementara, mulai, akhiri dengan yang lebih pendek jika, t:, menghemat 6 karakter. Kami juga mengatur ulang pernyataan dengan menulis ulang loop sebagai do-while pseudo, setara secara semantik. Sunting3: Ya, entah bagaimana jika sekarang lebih pendek. Asli:

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

Harus dijalankan di master database. Saya suka T-SQL meskipun berisik dan jelek. Mungkin ada cara untuk membuat ini lebih sederhana, tetapi sayangnya, iifbuilt-in membutuhkan kedua belah pihak menyetujui jenis. Aturan prioritas server Sql memberikan prioritas lebih tinggi daripada string. Angka juga sangat panjang, tetapi aliasing lebih banyak karakter daripada nilainya. Mungkin ada cara yang lebih baik untuk mengubah angka menjadi string. Sunting: str juga berfungsi. 2 karakter lebih sedikit dari ltrim


Awalnya saya pikir kode Anda panjang 2012,96 byte.
nyuszika7h

sedikit lebih lama di @ 101, tetapi tidak bergantung pada tabeldeclare @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, sepenuhnya benar, ditambah kita dapat menyimpan beberapa karakter dengan beralih ke variabel @. Kemudian menggunakan iif () masih lebih pendek dari if (...) cetak yang lain cetak jadi kami mendapatkan sedikit dengan menggunakan iifekspresi. Kita juga bisa menggunakan yang lebih pendek @+=1untuk menyimpan char
Michael B

Saya tidak tahu T-SQL didukung +=. Saya tidak memiliki itu berguna untuk menguji, tetapi saya cukup yakin itu mendukung ''+@untuk konversi string menggunakan lokal invarian.
Peter Taylor

+=telah ditambahkan pada tahun 2008. Ini mendukung '' + @, tetapi tidak melakukan apa yang Anda inginkan. Seperti yang saya katakan, aturan didahulukan dilemparkan ke int pertama sehingga gips ''untuk int, sehingga nol sehingga ''+@yang @masih diketik sebagai int. strbekerja dan itu tidak jauh lebih mahal daripada yang lain (2 karakter tambahan untuk parens). Saya memilih t-sql 2012 di sini karena IIFoperator, siapa tahu mungkin rilis 2016 sql akan menghilangkan beberapa kebisingan dan mulai menjadi kompetitif (tidak mungkin).
Michael B

4

VBA: 54

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

Buka program Office favorit Anda, tekan alt + F11 untuk membuka VBA IDE dan tempel kode ke panel langsung dan tekan enter.

Dalam VBA,: apakah garis pemisah,? adalah singkatan untuk cetak, iif berarti inline if (think x? "Y": "N"), x / 3 melakukan pembagian titik mengambang dan x \ 3 melakukan pembagian bilangan bulat, instr mengembalikan posisi char dalam sebuah string, atau 0 jika tidak, true = -1 dan false = 0.

Kode pada dasarnya menambah x dan menghasilkan x jika x / 3 = x \ 3 = instr (1, x, 3) benar dan "Bzzt" sebaliknya. x / 3 = x \ 3 membandingkan (float) (x / 3) hingga (int) (x / 3) dan mengembalikan boolean (0 salah dan -1 benar). instr (1, x, 3) mengembalikan 0 jika "3" tidak ada dalam angka, dan bilangan bulat positif sebaliknya. Satu-satunya saat ekspresi mengembalikan true adalah ketika (x / 3 = x \ 3) salah (0) dan instr (1, x, 3) adalah 0, atau dengan kata lain, ketika x tidak dapat dibagi oleh 3 dan tidak mengandung digit "3", yang persis seperti yang kita cari.


4

k4 (37) (35)

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

k4tidak memiliki perintah modulo bawaan, dan menggunakannya qakan membutuhkan karakter tambahan; versi ini (ab) menggunakan format keluaran bawaan untuk memeriksa apakah string hasil pembagian xoleh 3 memiliki titik desimal di dalamnya.

SUNTING:

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

Pintar seperti mencocokkan titik desimal mungkin, saya bisa mencukur dua byte dengan memeriksa yang 3*floor x%3masih x.


Terpilih untuk secara pintar mencocokkan titik desimal!
Markus

Harap jangan perbarui semua jawaban Anda sekaligus. Itu akan mendorong semua tantangan aktif dari halaman depan. Alangkah baiknya jika Anda hanya melakukan satu atau dua kali. (Meskipun saya bahkan tidak berpikir untuk beralih di antara h1dan h2cukup penting untuk mendapatkan suntingan di tempat pertama.)
Martin Ender

3

Pesta, 53 52 48 46

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

Membutuhkan GNU sed (menggunakan cekstensi).


3

Java, 142 131 terima kasih atas saran 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 saya agak berkarat. Tapi tidak akan lebih pendek dengan dan operan? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Mungkin juga untuk melewatkan {} untuk forloop.
WozzeC

ini 122 byte, 9 lebih sedikit: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)

Ini pada dasarnya jawaban plannapus sedikit disingkat, tapi saya belum bisa berkomentar

Perbarui: -4 karakter (lihat komentar plannapus)

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

Keluaran:

  [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"

Karena banyak fungsi operasi string (seperti strsplit) melempar kesalahan ketika diumpankan dengan non-karakter saya berasumsi grepljuga. Tangkapan bagus! +1
plannapus

2
Ngomong-ngomong sejak Anda menguranginya menjadi satu ekspresi Anda tidak perlu mendefinisikan bsebelum itu:a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Fortran - 118 114 111

Kandidat yang sangat tidak mungkin, meskipun awalnya dikembangkan agar sesuai dengan kartu punch. Dengan menggunakan semua konstruksi yang tidak jelas dari masa lalu, beberapa kode pendek mungkin masih ditulis:

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

Cabang "computed goto" goto(L1,L2,...,Ln) xke salah satu label L jika dan hanya jika 1 <= x <= n.

Sunting: Berhasil mencukur 4 byte dengan mengatur ulang loop yang memeriksa angka 3. Sebagai bonus, kode sekarang juga berisi aritmatika if-statement if(x) a,b,c, yang selalu bercabang ke salah satu dari tiga label: a jika x <0, b jika x == 0 atau c jika x> 0.

Sayangnya, dua versi pertama tidak menghasilkan output yang benar. Digit-3 loop sekarang berfungsi dengan benar, dan kode sekarang juga menyertakan pernyataan if logis logis modern. Tiga byte lagi hilang, karena siapa yang butuh enddopernyataan? Outputnya dapat diverifikasi di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.