"Bzzt" oyununu oyna


56

Kazanan: Aditsu'nun CJam cevabı ! Bir kuyruklu 25 bayt! Güzel!

Cevabınızı göndermeye devam edebilirsiniz, ancak artık kazanamazsınız. Posterity için tutulan orijinal yayın:


"Bzzt" oyunu bir sayıya dikkat etmeniz gereken bir oyundur (bu durumda 500). Ancak, sayının içinde 3 varsa veya 3'e bölünebiliyorsa, sayıyı söylemezsiniz. Bunun yerine "Bzzt" diyorsunuz.

Kurallar:

  • Numaraları zor kodlayamazsın.
  • Numara yalnızca aşağıdaki şartlardan en az birini karşılamalıdır
    • 3 ile bölünebilir
    • Sayı 3 içerir
  • Bazı ayırıcılar zorunludur (12bzzt14 sayılmaz)
  • Puan bayt cinsinden ölçülür.
  • Tam olarak 500'e kadar saymalısınız, 1 veya 0 ile başlayın (seçtiğiniz)
  • Rakamların çıktısı alınmalıdır, ancak bunun önemi yoktur (örneğin, stdout, bir metin dosyasına yazma, vb.).
  • 0, 3 ile bölünebilir veya bölünemez olabilir. Seçebilirsiniz.
  • Numaraları bir defada (örneğin, çıkış 1, sonra 2, sonra bzzt, sonra 4 vb.) Veya hepsini bir kerede (örneğin, çıkış 1 2 bzzt 4 5) yazdırabilirsiniz.
  • 3 harfini "bzzt" kelimesi ile değiştirmelisiniz. Bu, büyük / küçük harfe duyarlı değildir (bZzt, Bzzt, bzzt tamamdır).

  • Bu bir mücadelesidir, bu yüzden en kısa kod kazanır.
  • Bu yarışma 30 Haziran 2014'te sona eriyor (yayınlanmasından 7 gün sonra).

1
Bu sorunun amaçları için 0, 3 ile bölünebilir mi?
Zorlu

2
"Buzz" mı, yoksa "bzzt" mi? Şimdiye kadar iki kez "vızıltı" yazdın.
aditsu

3
Lütfen açıkla. Ben çıkışa var mı buzzveya bzztşartların her ikisi geçerli değilse? Çıkmak zorunda mıyım 12bzzt4yoksa bzztiçin 1234mi?
nyuszika7h

4
Derdim bzztiçin 1234. Burada 'yaygın' bir içme oyunu (sadece 7 ile yapıyoruz)
Martijn

66
"0, 3 ile bölünebilir veya bölünemez olabilir. Seçebilirsiniz." Gerçekten seçim yapabileceğini sanmıyorum. 0 mod 3 0, bu gerçekten bir fikir meselesi değil.
David Conrad

Yanıtlar:


33

CJam - 25

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

Teşekkürler Howard :)

Http://cjam.aditsu.net/ adresinde deneyin

Açıklama:

501{…}fItemelde for(int I=0; I<501; ++I) {…}
3s3'ü dizgeye dönüştürür, yani "3"
I3%, I% 3
<, sol alt dizgeyi alır - "3".substring(0, I % 3)- "" I% 3 == 0 ve "3" ise, aksi halde 2 dizgili dizgeye
Isdönüştürülür , boş bir sonuç elde edilir. iFF dizisi % 3 == 0 (ilk ifade boş) ya da bunun bir 3 rakamı vardır gibidir ; önceki dize bir boolean değeri olarak kabul edilir; burada "" false olur ve başka bir dize true ise newline eklerI
-II
…I"bzzt"?… ? I : "bzzt"
N


Sen benim golfscript çözümde olduğu gibi aynı kolaylıktan ve mantıklı ve kaydedebilirsiniz: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard,

29

Ruby, 43

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

Oldukça basit.

Düzenleme: Bir bayt kaydedildi, teşekkürler Howard!


1
Yazarsanız, tek bir boşluktan tasarruf edebilirsiniz "#{a}"[?3]||a%3<1.
Howard,

@Howard: Gerçekten, çok teşekkürler!
Ventero

1
Daha da okunmaz ama ne yazık ki aynı uzunlukta: "#{a}"[?3[0,a%3]].
Howard,

Ne değiştirilmesi konusunda putsbirlikte pve 3 karakter tasarrufu?
David Unric

1
@DavidUnric , argümanında pçağrının sonucunu yazdırır (çağrıları yapanlara göre ). Bu yüzden baskı ( yerine) yerine , çıktı özelliklerine uymayan yazdırılır . inspectto_sBzzt:Bzzt.to_s:Bzzt
Ventero

25

seq ve GNU sed - 42 33 31 30

Doğrudan dash, diğer bazı kabukları tarih genişleme, devre dışı bash ile örneğin olması gerekebilir eserler set +H:

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

O nasıl çalışır?
nbubis

Kabuk komut dosyalarında geçmiş genişletme varsayılan olarak devre dışıdır.
nyuszika7h

@ nyuszika7h: true, ancak pek çoğunun cevabı etkileşimli bir kabukta deneyeceğini umuyorum.
Thor

1
@ nBubis: güncellenmiş versiyon, sekanslı diziyi oluşturarak çalışır. 0~3!koşular {/3/!b}ve birlikte bu ifadeler, satırı bölünemez ve 3 içermediği gibi satırdan çıkar. Son bit, bzzt satırını "düzeltir".
Thor

18

DOS'ta (x86 dosyası) x86 makine kodu - 71 bayt

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

Gerekli çıktıyı sınırlayıcı olarak boşluklu stdout'a yazdırır; DosBox'ta sorunsuzca çalıştırılabilir.

Yorum yapılan montaj:

    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
SAYGI!!!!! İnanılmaz!
yossico

@yossico: teşekkür ederim! :) aslında, gerçekten özel bir şey değil, eminim ki DOS için derleme yazan insanlar kesinlikle biraz daha baytları tıraş edebilirler.
Matteo Italia


17

PHP, ayırıcı yok - 62, 61,59,58,52,49 47

Aralarında boşluk / newline / separator olması gerektiğini söylemez:

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

Ayırıcı ile 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
  • Sadece küçük bir 'hile' buldum, sonra boşluğa gerek yok echo, beni kurtardı.
  • Yeni bir satır oluşturur
  • Başka bir küçük 'hile', bzzt'in alıntılara ihtiyacı yok (test edildi). Gidecek yol değil ama işe yarıyor.

Javascript - 54,51 50

Aynı ilke, ancak javascript fonksiyonları:

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

Parantez ve () ucu için teşekkürler @ core. Beni birkaç kez tarayıcımı çökertmeme sebep oldu ^^
Martijn

Haha. console.log()Açıkça test ettim ama bu daha kısa.
Martijn

1
Javascript çözümünüz
501'e kadar

1
52 için PHP: 245 Char, yani bir bit ters . <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;õ\n
primo

1
4 byte tasarruf etmek için !strpbrk($1,3)ile değiştirebilirsiniztrim(3,$i)
9

16

Javascript 50 49

Core1024 sayesinde -1 bayt

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

Bunun yapılabileceğini biliyordum! Ama nasıl bulamadım
edc65

1
Bir JavaScript çözümü LiveScript'imi geçtiğinde yüzümü hayal edebilirsiniz.
nyuszika7h

ikinci
çözümdeyken

@ user902383 Bir boolean &&operatörü olmadan geçerli bir sonuç değil . Örneğin: 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}/

GolfScript'te bu kadar basit olmayan uygulama, burada test edilebilir .


10

Perl, 36

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

Düzenleme: Ben bir Perl keşiş değilim, bu yüzden core1024 bu dışında başka bir bayt golf başarmış gibi görünüyor onun cevabını .


1
say4 bayttan tasarruf etmek için kullanın :say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@ Zaid neden 5e2 ve 500 değil?
Charles

@Charles: eşdeğerdirler
Zaid

1
@ Zaid öyleyse neden net olmasın?
Charles

4
@Charles: Bir kod golf mücadelesi bağlamında, kişi bile umursamalı mı?
Zaid

10

C # (71)

Doğrudan LinqPad'de çalıştırılabilir.

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

1
Bir karakteri |, mantıksal veya yerine bit yönünde veya ( ) kullanarak kaydedebilirsiniz .
Johnbot

@Johnbot Öneriniz için teşekkürler.
EvilFonti

Koşullu parantezleri de kaldırabilirsiniz.
Johnbot

@ Jobot: Bu bitsel ya da değil. Bu (kısa devre dışı) mantıksaldır, ya da operandlar booleandır.
Ryan M

Dökümü sadece LinqPad olsa da, doğru mu? Bunu bir uygulama olarak C # 'da yapmak, eklenecek bir uzatma yöntemi gerektirecektir. (Ve 'bzzt' değil 'buzz' =))
Paul

9

Python (52)

Teşekkürler grc!

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

Eski versiyon:

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

1
Biraz daha kısa:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
grc

4
Bir karakter daha kısa:['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

Bir cevap yazıyor olsaydım, G / Ç hendek ve bir dize değeri dönecekti.
Gurur haskeller

1
Ayrıca geçiş yapmalıdır ==0ile<1
gururlu haskeller

Ayrıca, elem öneki yapmayı deneyin. Bence elem'3'$show ndaha kısa olan bir karakter yazabilmelisin . Ya da değil. Kontrol etmedim.
Gurur haskeller

@ proudhaskeller: Spesifikasyonda "sayıların çıkılması gerekiyor" yazıyor, bu yüzden IO'nun dahil olması gerekiyor. Ve elemprefix notasyonunda kullanmak hiçbir karakteri kaydetmez, çünkü kesme işleminden önce bir boşluk olması gerekir; Aksi takdirde alırsınız Not in scope: elem'3'. <1Yine de iyi göz !
Taylor Fausak

6

JavaScript 66 63 60

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

Dizi kullanmak için öneri için edc65 teşekkürler . Çıktı şimdi virgülle ayrılacak.


Eski versiyonlar

Sürüm 1a - 66

Kurallara göre bir uyarı kutusunda 1 ile 500 arasında yazdırın. Çıktı boşlukla ayrılmıştır.

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

Sürüm 1b - 65

0'ın 3'e bölünemeyeceğini düşünürsek, çözümü 65 karaktere kadar kısaltabiliriz:

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

Sürüm 2 - 63

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

Uzunluğunu azaltmak için öneri için grc sayesinde .


1
Sanırım başlamanız gerekfor(a=i="";i<500;)a+=++i ...
grc

Virgülle ayrılmış çıktı Tamam, bir dizi daha kısa olacak: için (o = i = []; i <500;) o [i ++] = i% 3 &&! / 3 / .test (i)? İ: 'bzzt' ; alert (o)
edc65

6

PowerShell, 42

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

Çoğunlukla Ventero'nun çalışması, benim tarafımdan sözdizimi üzerine küçük bir yardım ;-)


6

R, 49 karakter

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

Açıklaması:

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

Kullanımı:

> 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

Kobra - 70

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

Toplu iş - 222

Çünkü bu dili gerçekten seviyorum ... nedense ...

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)

İlk önce operandların etrafındaki tırnak işaretlerini bırakabilmelisiniz, ifçünkü en az bir rakam olduğunu biliyorsunuz. Ayrıca tüm bloğu forile birlikte birleştirmek &de parantezleri kaydetmek için işe yarayabilir.
Joey

Ayrıca, burada ve orada birkaç boşluk bırakmak ==yerine EQUbüyük olasılıkla kullanabilirsiniz .
Joey

@Joey Önerileriniz için teşekkürler!
Zorlu

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'deki çoğu komutun tek baytlık varlıklar olarak temsil edildiğini unutmayın.

Kod, X'in önceden 0'a başlatılmasını gerektirir (aksi takdirde fazladan 3 bayt).

Birkaç byte'ı tıraş etmek için birkaç girişimde bulundum, bu yüzden burada yaptığım her şeyi ayrıntılandırmıyorum, yazıyı karıştırmamak için. Çoğunlukla bu sürümde yaptığım döngüyü kısaltırken bir While döngüsü ile ve If koşulunu Ansdeğişken yardımıyla kısaltarak yönlendirilirler .


Eğer hatalıysam düzelt, ama bu bzzt3'lü sayıları gösteriyor, örneğin 13 gibi görünmüyor .
Thor

@ Doğru, ancak kurallar dahilindeyim, bzztyalnızca 3 ile bölünebilen sayılar için yazdırabileceğimi belirtiyorlar. Başka bir şekilde eklemek mümkün olabilir, ancak daha fazla talimat gerekebilir.
Doktoro Reichard

1
Kurallar şöyle der: Sayının içinde 3 varsa veya 3 ile bölünebiliyorsa, numarayı söylemezsin. Bunun yerine, "Bzzt" diyorsunuz , bu yüzden ikisinin de değiştirilmesi gerektiğini söyleyebilirim.
Thor,

Beni şimdi en çok rahatsız eden cümlenin ortasındaki ufacık minik virgül. Bunu yorumlanır ettik yolu, yapmanın hem yolları da 2 kuralını açıklıyor eşit şekilde geçerlidir: numarası yalnızca ... gereksinimlerinin 1 karşılamak için vardır (ya bir 3 ya 3 ile bölünebilir olması)
Doktoro Reichard

1
Buradaki baytları yanlış saydınız, çünkü küçük harfler iki baytlık simgelerdir. Thor'un kurallar hakkındaki yorumuna katılıyorum, çünkü yukarıdaki her cevabın kullandığı kural.
lirtosiast

5

C, 93

Sadece bunun cehennemi için ...

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

Bu küçük bir aksaklık vardır - çıktısını atlari = 0
anatolyg 23:14

4
@anatolyg "1 veya 0'dan başlayarak (seçtiğiniz) tam olarak 500'e kadar saymanız gerekir." - 1'den başlamayı seçtim.
squeamish ossifrage

Bu kısmı kaçırdım. Üzgünüm!
anatolyg

Eğer argümanları geçerseniz çok daha fazla atlar, lol. Ama iyi golf oynuyor, sana bunu vereceğim! Süreyi kontrol etmek için üç basamaklı sayılara yöneldiğinizde sprintf dönüş değerini kullanmaya başlayın, lol. Çok kötü .... haha!
DreamWarrior

5

Julia 64 bayt

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 bayttır. Ayrıca bir dizi döndürmek tüm diziyi yazdırmaz, bu nedenle "çıktı" olarak sayıldığından emin değilim. Bir dizi sayıları döndürürse, o zaman [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]sayılabilir ve puan 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

... çünkü neden tamamen anlaşılır tek bir astar varken toplu iş dosyası kullanıyorsunuz ... :-)


5

canlı - 51

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

düzenleme: timesbaskı sürümünü kullanmak artık "görüntüleme" kadar kısa. teşekkürler @ will-p


1
+1. Sen takas olabilir (1..500).eachiçin500.times
LP Will

4

C, 80

Satır kesmeleri yerine boşlukları ayırıcı olarak kullanmak.

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... Burada bir sorun var.
squeamish ossifrage

Görünüşe göre çok açgözlüydüm ve Tanımsız Davranış'a rastladım (değişken değiştirildi ve sıralama noktaları arasında okundu). Şimdi düzeltildi.
anatolyg

Çalışıyor :-)
squeamish ossifrage

4

Mathematica, 54 Karakterler

Bu çok basit geliyor. Daha kısa çözümler mümkün olmalıdır.

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


@belisarius gerçekten. Teşekkürler.
Michael Stern,

4

T-SQL 2008 - 80

Kazanmayacak ya da hiçbir şey almayacak ama eğlenceli değil: @domager sayesinde Tweaked:

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

Az bilinen bir gerçektir, @ bir değişken için geçerli bir isimdir. Set tabanlı kod daha SQL varyantı olduğu için garip hissettirir, fakat daha kısadır! Bu sürüm herhangi bir veritabanında çalışır. Düzenleme: Semislerin ikisini gerekmediği için çıkarabildim. Bunun olabildiğince optimal olduğuna eminim.

Düzen2: Asla asla deme. İşte artık goto kullanarak daha da iğrenç, ancak bloktan kaçınmamıza izin veriyor. Değiştirebiliriz, başlayabiliriz, eğer daha kısa biterse, t: 6 karaktere kaydedersek. Döngüyü, anlamsal olarak eşdeğer bir takma işlem yapma adımı olarak yeniden yazarak da ifadeyi yeniden düzenleriz. Düzen3: Evet, bir şekilde şimdi kısalırsa. Orijinal:

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

Ana veritabanında çalıştırılmalıdır. Gürültülü ve çirkin yollarına rağmen T-SQL'i seviyorum. Bunu basitleştirmenin bir yolu olabilir, ancak ne yazık ki, iifyerleşik iki tarafın da tipler üzerinde hemfikir olmasını gerektirir. Sql sunucuları öncelik kuralları, dizgelerden int önceliği verir. Sayı da gerçekten uzun, ancak takma ad, değerden daha fazla karakter. Sayıyı bir dizgeye çevirmenin daha iyi bir yolu olabilir. Düzenleme: str de çalışır. Ltrim'den 2 daha az karakter


İlk başta kodunuzun 2012.96 bayt uzunluğunda olduğunu düşündüm.
nyuszika7h

@ 101'de biraz daha uzun, ama bir masaya 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
güvenmiyor

@domager, tamamen doğru, ayrıca değişkeni değiştirerek birkaç karakter kaydedebiliriz @. Daha sonra, iif () kullanmak bir if (...) baskısından daha kısaysa, başka bir iififadeyle yazdırın; @+=1Bir karakter kaydetmek için kısa
Michael B

T-SQL'in desteklendiğini bilmiyordum +=. Sınamak için elimde bir yazılım yok, ancak ''+@değişmeyen yerel ayarı kullanarak dizge dönüştürmeyi desteklediğinden eminim .
Peter Taylor

+=2008 yılında eklendi. '' + @ özelliğini destekliyor, ancak istediğiniz şeyi yapmıyor. Dediğim gibi, öncelik kuralları ilk önce int a atılır, böylece ''int a çıkar, sıfıra neden olur ''+@, @hala a olarak yazılır int. strçalışır ve her şeyden çok daha pahalı değildir (parenler için 2 ilave karakter). IIF2016'nın yayınlanma sql'sinin gürültüden kurtulacağını ve rekabetçi olmaya başlayacağını bilen operatör nedeniyle burada t-sql 2012'yi seçtim .
Michael B,

4

VBA: 54

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

En sevdiğiniz Office programını açın, VBA IDE'yi açmak için alt + F11 tuşlarına basın ve kodu hemen bölmesine yapıştırın ve enter tuşuna basın.

VBA'da: satır ayırıcı,? iif kısaltmadır, iif (x? "Y": "N" yi düşünürse, x / 3 kayan noktalı bölümü yapar ve x \ 3 tamsayı bölü yaparsa, instr karakterin bir dizgede konumunu döndürürse veya 0 ise satır içi anlamına gelir. Aksi takdirde, true = -1 ve false = 0.

Kod temel olarak x'i artırır ve x / 3 = x \ 3 = instr (1, x, 3) doğruysa x, aksi takdirde "Bzzt" olursa x değerini çıkarır. x / 3 = x \ 3 (float) (x / 3) ile (int) (x / 3) arasındakileri karşılaştırır ve bir boole döndürür (0, yanlış ve -1, doğru). instr (1, x, 3), "3" sayı sayısında değilse 0, aksi takdirde pozitif bir tamsayı döndürür. İfadenin true döndürdüğü tek zaman (x / 3 = x \ 3) yanlış (0) ve instr (1, x, 3) 0 olduğunda veya başka bir deyişle x, 3 ile bölünemezse ve tam olarak aradığımız şey olan “3” rakamını içerir.


4

k4 (37) (35)

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

k4yerleşik bir modulo komutundan yoksundur ve qbirini kullanmak ekstra bir karakter alır; bu sürüm (ab), x3'e bölmenin sonucunun dizesinin içinde ondalık sayı olup olmadığını kontrol etmek için yerleşik çıktı biçimini kullanır .

DÜZENLE:

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

Ondalık noktayı eşleştirmek kadar akıllıca 3*floor x%3, hala olup olmadığını kontrol ederek iki baytı tıraş edebilirim x.


Zekice ondalık basamağıyla eşleşti!
Mark

Lütfen tüm cevaplarınızı cevap olarak güncellemeyin. Bu, tüm aktif zorlukları ön sayfadan aşağı iter. Bir seferde sadece bir ya da iki tane yapsan iyi olurdu. (Her ne kadar ilk önce bir düzenlemeyi garanti edecek kadar değişmediğini h1ve h2önemli olduğunu düşünmüyorsam bile .)
Martin Ender

3

Bash, 53 52 48 46

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

GNU sed gerektirir ( cuzantıyı kullanır ).


3

Java, 142 131 WozzeC önerisine teşekkür ediyor

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'm biraz paslanmış. Ama bir ve operand ile daha kısa olmayacak mı? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Ayrıca forloop için {} atlamak da mümkün olabilir.
WozzeC

bu 122 bayttır, 9 daha az: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)

Bu temelde plannapus cevap biraz kısaltılmış, ancak henüz yorum yapamam

Güncelleme: -4 karakter (plannapus'un yorumuna bakın)

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

Çıktı:

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

Birçok dize işlemi işlevi (örneğin strsplit), sandığım karakter dışı karakterlerle beslendiğinde hata fırlattığından grepl. Güzel yakalayış! +1
plannapus

2
Bu arada, onu bir ifadeye indirgemenizden bönce ondan önce tanımlamanıza gerek yok :a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
plannapus

3

Fortran - 118 114 111

Ümitsizce olası bir aday, başlangıçta delikli kartlara sığacak şekilde geliştirilmiş olmasına rağmen. Geçmişteki bütün gizli yapıları kullanarak, bazı kısa kodlar hala yazılabilir:

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

"Bilgisayarlı Goto" goto(L1,L2,...,Ln) x , L etiketlerinden birine, sadece 1 <= x <= n ise, dallara ayrılır.

Düzenle: 3 basamağını kontrol eden döngüyü yeniden düzenleyerek 4 byte'ı tıraş etmeyi başardı. Bonus olarak, kod artık if(x) a,b,cher zaman üç etiketten birine dağılan aritmetik if-deyimini içerir : a eğer x <0, b eğer x == 0 ise veya c> x> 0 ise.

Ne yazık ki, ilk iki sürüm doğru çıktı vermedi. Digit-3 döngüsü şimdi doğru çalışıyor ve kod şimdi modern bir mantıksal if ifadesi de içeriyor. Üç bayt daha gitti, çünkü kimin bir enddobildiriye ihtiyacı var ? Çıktı burada doğrulanabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.