Spielen Sie das Spiel "bzzt"


56

Gewinner: Aditsus CJam-Antwort ! Satte 25 Bytes! Nett!

Sie können Ihre Antwort weiterhin senden, jedoch nicht mehr gewinnen. Originalpost für die Nachwelt aufbewahrt:


Das "Bzzt" -Spiel ist ein Spiel, bei dem Sie bis zu einer Zahl zählen müssen (in diesem Fall 500). Wenn die Zahl jedoch eine 3 enthält oder durch 3 teilbar ist, sagen Sie die Zahl nicht. Stattdessen sagst du "Bzzt".

Regeln:

  • Sie können die Zahlen nicht hart codieren.
  • Die Nummer muss nur mindestens 1 der folgenden Anforderungen erfüllen
    • Teilbar durch 3
    • Nummer enthält eine 3
  • Eine Art von Trennzeichen ist obligatorisch (12bzzt14 zählt nicht)
  • Die Bewertung wird in Bytes gemessen.
  • Sie müssen genau bis 500 zählen, beginnend mit 1 oder 0 (Sie haben gewählt).
  • Die Zahlen müssen ausgegeben werden, aber es spielt keine Rolle, wie (z. B. stdout, Schreiben in eine Textdatei usw.).
  • 0 kann durch 3 teilbar oder nicht teilbar sein. Du kannst wählen.
  • Sie können die Zahlen einzeln ausgeben (z. B. 1, dann 2, dann bzzt, dann 4 usw.) oder alle gleichzeitig (z. B. 1, 2, bzzt, 4, 5).
  • Sie müssen den Buchstaben 3 durch das Wort "bzzt" ersetzen. Hierbei wird nicht zwischen Groß- und Kleinschreibung unterschieden (bZzt, Bzzt, bzzt sind alle in Ordnung).

  • Dies ist eine Herausforderung, also gewinnt der kürzeste Code.
  • Dieser Wettbewerb endet am 30. Juni 2014 (7 Tage nach Veröffentlichung).

1
Ist 0 für diese Frage durch 3 teilbar?
Urous

2
Ist es "buzz" oder "bzzt"? Sie haben bisher zweimal "buzz" geschrieben.
Aditsu

3
Bitte klären Sie. Muss ich ausgeben buzzoder bzztwenn beide Anforderungen zutreffen? Muss ich ausgeben 12bzzt4oder bzztdafür 1234?
Nyuszika7h

4
Ich würde sagen bzztfür 1234. Es ist ein "übliches" Trinkspiel hier (nur wir machen es oft mit 7)
Martijn

66
"0 kann durch 3 teilbar oder nicht teilbar sein. Sie können wählen." Ich glaube wirklich nicht, dass Sie sich entscheiden können. 0 mod 3 ist 0, das ist eigentlich keine Ansichtssache.
David Conrad

Antworten:


33

CJam - 25

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

Vielen Dank Howard :)

Versuchen Sie es unter http://cjam.aditsu.net/

Erläuterung:

501{…}fIist im Grunde for(int I=0; I<501; ++I) {…}
3skonvertiert 3 in String, dh "3"
I3%ist I% 3
<bekommt den linken Teilstring - "3".substring(0, I % 3)- was "" für I% 3 == 0 ist und "3" sonst
Iskonvertiert Iin String
-mit 2 Strings bewirkt einen Satzunterschied, was zu einem Leerlauf führt Zeichenkette iff I% 3 == 0 (die erste Zeichenkette war leer) oder Ihat eine 3-stellige Zahl,
…I"bzzt"?wie … ? I : "bzzt"; Die vorherige Zeichenfolge wird als boolescher Wert behandelt, wobei "" false ist und jede andere Zeichenfolge true ist, und
Neine neue Zeile hinzugefügt wird


Sie können den gleichen Trick wie in meiner golfscript Lösung verwenden und die logischen speichern und: 501{3sI3%<Is-I"bzzt"?N}fI.
Howard

29

Rubin, 43

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

Ziemlich einfach.

Bearbeiten: Gespeichert ein Byte, danke Howard!


1
Sie können ein einzelnes Leerzeichen speichern, wenn Sie schreiben "#{a}"[?3]||a%3<1.
Howard

@ Howard: In der Tat, vielen Dank!
Ventero

1
Noch nicht lesbar , aber leider gleich lang: "#{a}"[?3[0,a%3]].
Howard

Was über das Ersetzen putsmit pund Speichern von 3 Zeichen?
David Unric

1
@DavidUnric gibt pdas Ergebnis des Aufrufs inspectseines Arguments aus (im Vergleich zu Puts, die aufrufen to_s). Anstatt zu drucken Bzzt(was ist :Bzzt.to_s), wird gedruckt :Bzzt, was nicht den Ausgabespezifikationen entspricht.
Ventero

25

seq und GNU sed - 42 33 31 30

Funktioniert direkt in Dash, einige andere Shells benötigen möglicherweise eine deaktivierte History-Erweiterung, z. B. mit bash set +H:

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

Wie funktioniert es?
Nbubis

Die Verlaufserweiterung ist in Shell-Skripten standardmäßig deaktiviert.
nyuszika7h

@ nyuszika7h: stimmt, aber ich gehe davon aus, dass viele die Antwort in einer interaktiven Shell versuchen werden.
Thor

1
@nbubis: Die aktualisierte Version erzeugt die Sequenz mit seq. 0~3!Läuft {/3/!b}und zusammen verlassen diese Ausdrücke die Zeile so, wie sie ist, wenn sie nicht durch eine 3 teilbar ist und keine 3 enthält. Das letzte Bit "korrigiert" die Zeile auf bzzt.
Thor

18

x86-Maschinencode unter DOS (.com-Datei) - 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.|

Druckt die erforderliche Ausgabe mit Leerzeichen als Trennzeichen nach stdout. kann problemlos in DosBox ausgeführt werden.

Kommentierte Versammlung:

    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
RESPEKT!!!!! Tolle!
Yossico

@yossico: danke! :) Eigentlich ist es nichts Besonderes, ich bin mir sicher, dass Leute, die Assembly für DOS geschrieben haben, sicher noch ein paar Bytes mehr sparen könnten.
Matteo Italia


17

PHP, kein Trennzeichen - 62, 61,59,58,52,49 47

Es heißt nicht, dass zwischen ihnen ein Leerzeichen / ein Zeilenumbruch / ein Trennzeichen stehen sollte, ohne:

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

Mit dem Separator 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
  • Habe gerade einen kleinen 'Cheat' gefunden, brauche kein Leerzeichen danach echo, habe mich ein bisschen gerettet.
  • Der erstellt einen Zeilenumbruch
  • Ein weiterer kleiner "Cheat", der bzzt braucht keine Anführungszeichen (getestet). Nicht der richtige Weg, aber es funktioniert.

Javascript - 54,51 50

Gleiches Prinzip, aber Javascript-Funktionen:

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

Danke @ core für die Klammern und für den () -Tipp. Das hat mich dazu gebracht, meinen Browser ein paar Mal zum Absturz zu bringen ^^
Martijn

Haha. Ich habe es console.log()natürlich mit getestet , aber das ist kürzer.
Martijn

1
Ihre Javascript-Lösung zählt bis 501.
nderscore

1
PHP für 52: <?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;Das õist char 245, ein bisschen invertiert \n.
Primo

1
Sie können ersetzen !strpbrk($1,3)mit trim(3,$i)4 Byte speichern
aross

16

Javascript 50 49

-1 Byte dank core1024

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

Ich wusste, dass das möglich ist! Aber nicht gefunden, wie
edc65

1
Sie können sich mein Gesicht vorstellen, wenn eine JavaScript-Lösung mein LiveScript übertrifft.
Nyuszika7h

in ihrer zweiten lösung können sie eine & sign entfernen und sie wird immer noch funktionieren
user902383

@ user902383 Es ist kein gültiges Ergebnis ohne einen Booleschen &&Operator. Zum Beispiel: 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 bis 29 Zeichen

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

Eine nicht so einfache Implementierung in GolfScript kann hier getestet werden .


10

Perl, 36

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

Edit: Ich bin kein Perl-Mönch, daher scheint es core1024 in seiner Antwort gelungen zu sein, ein weiteres Byte davon zu spielen .


1
Verwenden Sie say4 Byte speichern:say$_%3&&!/3/?$_:bzzt for 1..5e2
Zaid

@ Zaid warum 5e2 und nicht 500?
Nicht dass Charles

@ Charles: Sie sind gleichwertig
Zaid

1
@Zaid also warum nicht klarer sein?
Nicht dass Charles

4
@Charles: Sollte man sich im Zusammenhang mit einer Code-Golf-Herausforderung überhaupt darum kümmern?
Zaid

10

C # (71)

Kann direkt in LinqPad ausgeführt werden.

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

1
Sie können ein Zeichen speichern, indem Sie bitweise-oder ( |) anstelle von logisch-oder verwenden.
Johnbot

@ Johnbot Vielen Dank für Ihren Vorschlag.
EvilFonti

Sie können auch die Klammern um die Bedingung entfernen.
Johnbot

@ Johnbot: Das ist nicht bitweise oder. Es ist (kein Kurzschluss) logisch-oder, da die Operanden boolesch sind.
Ryan M

Dump ist nur LinqPad, richtig? Wenn Sie dies in C # als Anwendung ausführen, muss eine Erweiterungsmethode hinzugefügt werden. (Und es ist "bzzt" nicht "buzz" =))
Paul

9

Python (52)

Danke grc!

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

Alte Version:

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

1
Ein bisschen kürzer:for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
Grc

4
Ein ['3'[:i%3]in`i`]
Zeichen

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

Wenn ich eine Antwort schreiben würde, würde ich IO loswerden und einen Zeichenfolgenwert zurückgeben.
stolzer Haskeller

1
Du solltest auch ==0mit<1
proud haskeller

Versuchen Sie auch, das Präfix elem zu setzen. Ich denke, Sie sollten in der Lage sein zu schreiben elem'3'$show n, was ein Zeichen kürzer ist. Oder nicht. Ich habe nicht nachgesehen.
stolzer Haskeller

@proudhaskeller: Die Spezifikation besagt, dass die "Zahlen ausgegeben werden müssen", also muss IO beteiligt sein. Bei Verwendung der elemPräfixnotation werden keine Zeichen gespeichert, da vor dem Apostroph ein Leerzeichen stehen muss. sonst wirst du bekommen Not in scope: elem'3'. Gutes Auge mit <1, obwohl!
Taylor Fausak

6

JavaScript 66 63 60

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

Vielen Dank an edc65 für den Vorschlag, array zu verwenden. Die Ausgabe wird nun durch Kommas getrennt.


alte Versionen

Version 1a - 66

Drucken Sie gemäß der Regel zwischen 1 und 500 in einem Benachrichtigungsfeld. Die Ausgabe ist durch Leerzeichen getrennt.

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

Version 1b - 65

Wenn wir 0 als nicht teilbar durch 3 betrachten, können wir die Lösung auf 65 Zeichen verkürzen:

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

Version 2 - 63

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

Danke an grc für den Vorschlag, die Länge zu reduzieren.


1
Ich denke, du könntest mitfor(a=i="";i<500;)a+=++i ...
grc am

Wenn die durch Kommas getrennte Ausgabe in Ordnung ist, wird ein Array kürzer: für (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)]}

Meistens Venteros Arbeit, mit ein bisschen Hilfe zur Syntax von mir ;-)


6

R, 49 Zeichen

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

Erklärt:

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

Verwendungszweck:

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

Charge - 222

Weil ich diese Sprache wirklich liebe ... aus irgendeinem Grund ...

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)

Sie sollten in der Lage sein, die Anführungszeichen um die Operanden im ersten zu setzen, ifda Sie wissen, dass es mindestens eine Ziffer gibt. Das Verketten des gesamten Blocks innerhalb von forwith &kann auch dazu beitragen, die Klammern zu speichern.
Joey

Darüber hinaus können Sie verwenden ==statt EQUund wahrscheinlich ein paar Räume hier und dort fallen.
Joey

@ Joey Danke für die Vorschläge!
Ο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

Beachten Sie, dass die meisten Befehle in TI-BASIC als Einzelbyte-Entitäten dargestellt werden.

Der Code erfordert, dass X zuvor auf 0 initialisiert wird (ansonsten sind es zusätzliche 3 Bytes).

Ich habe mehrere Versuche unternommen, mehrere Bytes zu rasieren, daher gehe ich nicht auf alles ein, was ich hier getan habe, um den Beitrag nicht zu überfrachten. Sie waren hauptsächlich darauf gerichtet, die Schleife zu verkürzen, was ich in dieser Version durch eine While-Schleife und durch Verkürzen der If-Bedingung mit Hilfe der AnsVariablen getan habe .


Korrigieren Sie mich, wenn ich falsch bzzt
Thor

@Thor Sie haben Recht, aber ich halte mich an die Regeln, da sie besagen, dass ich bzztnur für die Zahlen drucken darf , die durch 3 teilbar sind. Das Hinzufügen auf andere Weise wäre möglich, würde aber weitere Anweisungen erfordern.
Doktoro Reichard

1
Die Regeln besagen: Wenn die Zahl eine 3 enthält oder durch 3 teilbar ist, sagt man die Zahl nicht. Stattdessen sagst du "Bzzt" , also würde ich sagen, dass beide ersetzt werden sollten.
Thor

@Thor Was mich jetzt am meisten stört, ist das winzige Komma in der Mitte des Satzes. So wie ich es interpretiert habe, sind beide Vorgehensweisen gleichermaßen gültig, was auch die 2. Regel erklärt: Die Zahl muss nur 1 der Anforderungen erfüllen ... (entweder eine 3 haben oder durch 3 teilbar sein)
Doktoro Reichard

1
Sie haben die Bytes hier falsch gezählt, weil Kleinbuchstaben Zwei-Byte-Token sind. Ich stimme Thors Interpretation der Regeln zu, da jede Antwort darüber diese verwendet.
Lirtosiast

5

C 93

Nur zum Teufel ...

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

Dies hat eine kleine Panne - es überspringt die Ausgabe füri = 0
anatolyg

4
@anatolyg "Sie müssen genau bis 500 zählen, beginnend bei 1 oder 0 (Sie haben gewählt)." - Ich entschied mich für den Start von 1.
Squeamish Ossifrage

Hab das bisschen verpasst. Es tut uns leid!
Anatolyg

Überspringt viel mehr, wenn Sie Argumente übergeben, lol. Aber es ist gut Golf, das gebe ich dir! Bis hin zur Verwendung des Rückgabewerts von sprintf, wenn Sie den Trend zu den dreistelligen Zahlen verfolgen, um die while-Zeit zu steuern, lol. So schlimm ... haha!
DreamWarrior

5

Julia 64 Bytes

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]ist 54 Bytes. Bei der Rückgabe eines Arrays wird nicht das gesamte Array gedruckt, daher bin ich mir nicht sicher, ob es als "Ausgabe" gilt. Wenn ein Array zurückgegeben wird, kann es [a%3==0||3 in digits(a)?"bzzt":a for a=1:500]sein, dass 45 gezählt und
gewertet werden

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

... weil warum eine Batch-Datei verwenden, wenn es einen ganz einfachen Einzeiler gibt ... :-)


5

groovig - 51

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

edit: die verwendung timesder druckversion ist jetzt so kurz wie das "anzeigen". danke @ will-p


1
+1. Sie können (1..500).eachfür500.times
Will Lp

4

C 80

Leerzeichen als Trennzeichen anstelle von Zeilenumbrüchen verwenden.

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... Da stimmt was nicht.
Squeamish Ossifrage

Es scheint, ich war zu gierig und stolperte über Undefiniertes Verhalten (Variable geändert und zwischen Sequenzpunkten gelesen). Jetzt behoben.
Anatolyg

Working now :-)
zimperliche Ossifrage

4

Mathematica, 54 Zeichen

Das fühlt sich zu einfach an. Kürzere Lösungen müssen möglich sein.

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

Sie brauchen keine Apostrophe :)
Dr. Belisarius

@belisarius in der Tat. Vielen Dank.
Michael Stern

4

T-SQL 2008 - 80

Nichts als Spaß und kein Sieg: Optimiert dank @domager:

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

Eine wenig bekannte Tatsache ist, dass @ ein gültiger Name für eine Variable ist. Es fühlt sich seltsam an, da der setbasierte Code die mehr SQL-Variante ist, aber kürzer ist kürzer! Diese Version funktioniert auf jeder Datenbank. Bearbeiten: Ich konnte zwei der Semis entfernen, da sie nicht benötigt wurden. Ich bin mir ziemlich sicher, dass dies so optimal ist, wie es nur geht.

Edit2: Sag niemals nie. Hier ist es jetzt noch grober mit goto, aber es erlaubt uns, den Block zu umgehen. Wir können ersetzen, indem wir mit dem kürzeren beginnen und enden, wenn wir 6 Zeichen speichern müssen. Wir ordnen die Anweisung auch neu an, indem wir die Schleife als Pseudo-Do-While umschreiben, semantisch äquivalent. Edit3: Ja, irgendwie ist es jetzt kürzer. Original:

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

Muss in der master-Datenbank ausgeführt werden. Ich liebe T-SQL trotz seiner lauten und hässlichen Art und Weise. Es könnte einen Weg geben, dies zu vereinfachen, aber leider iifmüssen sich beide Seiten auf Typen einigen. SQL Server-Prioritätsregeln geben int eine höhere Priorität als Zeichenfolgen. Number ist auch sehr lang, aber Aliasing ist mehr Zeichen als es wert ist. Es gibt möglicherweise eine bessere Möglichkeit, eine Zahl in eine Zeichenfolge umzuwandeln. Edit: str funktioniert auch. 2 Zeichen weniger als ltrim


Zuerst dachte ich, dass Ihr Code 2012.96 Bytes lang ist.
nyuszika7h

etwas länger in @ 101, aber nicht auf einen Tisch angewiesendeclare @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, ganz richtig, und wir können einige Zeichen sparen, indem wir die Variable auf umschalten @. Dann ist die Verwendung von iif () immer noch kürzer als ein if (...) print else print, sodass wir durch die Verwendung des iifAusdrucks einiges gewinnen . Wir können auch die kürzere verwenden @+=1, um ein Zeichen zu speichern
Michael B

Ich wusste nicht, dass T-SQL unterstützt wird +=. Ich habe es nicht zum Testen zur Hand, aber ich bin mir ziemlich sicher, dass es die ''+@Zeichenfolgenkonvertierung mit dem unveränderlichen Gebietsschema unterstützt.
Peter Taylor

+=wurde 2008 hinzugefügt. Es unterstützt '' + @, aber es macht nicht das, was Sie wollen. Wie gesagt, werfen Präzedenzregeln erste int so wirft es ''auf int, in Null resultierende so ''+@wird @nach wie vor als ein getippt int. strfunktioniert und es ist nicht viel teurer als alles andere (2 zusätzliche Zeichen für die Eltern). Ich habe mich wegen des IIFBetreibers für t-sql 2012 entschieden , der weiß, dass die Veröffentlichung von sql im Jahr 2016 möglicherweise das Rauschen lindert und anfängt, wettbewerbsfähig zu sein (unwahrscheinlich).
Michael B

4

VBA: 54

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

Öffnen Sie Ihr bevorzugtes Office-Programm, drücken Sie Alt + F11, um die VBA-IDE zu öffnen, fügen Sie den Code in das unmittelbare Fenster ein und drücken Sie die Eingabetaste.

In VBA: ist das Zeilentrennzeichen? ist eine Abkürzung für print, iif bedeutet inline, wenn (denke x? "Y": "N"), x / 3 eine Gleitkommadivision und x \ 3 eine Ganzzahldivision durchführt, instr die Position eines Zeichens in einem String zurückgibt oder 0 Andernfalls ist true = -1 und false = 0.

Der Code erhöht grundsätzlich x und gibt x aus, wenn x / 3 = x \ 3 = instr (1, x, 3) wahr ist und ansonsten "Bzzt". x / 3 = x \ 3 vergleicht (float) (x / 3) mit (int) (x / 3) und gibt einen Booleschen Wert zurück (0 ist falsch und -1 ist wahr). instr (1, x, 3) gibt 0 zurück, wenn "3" nicht in der Zahl enthalten ist, andernfalls eine positive ganze Zahl. Der Ausdruck gibt nur dann true zurück, wenn (x / 3 = x \ 3) false (0) und instr (1, x, 3) 0 ist, oder mit anderen Worten, wenn x nicht durch 3 teilbar ist und nicht Enthalten Sie die Ziffer "3", die genau das ist, was wir suchen.


4

k4 (37) (35)

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

k4Es fehlt ein integrierter Modulo-Befehl, und die Verwendung dieses Befehls qwürde ein zusätzliches Zeichen erfordern. Diese Version (ab) verwendet das eingebaute Ausgabeformat, um zu prüfen, ob der String das Ergebnis der Teilung istx durch 3 ein Dezimalzeichen enthält.

BEARBEITEN:

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

So geschickt die Übereinstimmung mit dem Dezimalpunkt auch sein mag, ich kann zwei Bytes rasieren, indem ich prüfe, ob das 3*floor x%3noch ist x.


Ausgezeichnet für die geschickte Anpassung des Dezimalpunkts!
Mark

Bitte aktualisieren Sie nicht alle Ihre Antworten. Das wird alle aktiven Herausforderungen von der Titelseite verdrängen. Es wäre schön, wenn Sie nur ein oder zwei Mal tun würden. (Obwohl ich nicht einmal denke, dass ein Wechsel zwischen h1und h2wichtig genug ist, um überhaupt eine Änderung zu rechtfertigen.)
Martin Ender,

3

Bash, 53 52 48 46

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

Benötigt GNU sed (benutzt die cErweiterung).


3

Java, 142 131 danke an WozzeC Vorschlag

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
Mein Java ist ein bisschen verrostet. Aber wird es mit einem und einem Operanden nicht kürzer sein? i% 3> 0 && ("" + i) .indexOf (51) <0? i: "bzzt". Es ist auch möglich, das {} für den Forloop zu überspringen.
WozzeC

Dies ist 122 Bytes, 9 weniger: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)

Diese Antwort ist prinzipiell plannapus etwas verkürzt, kann ich aber noch nicht kommentieren

Update: -4 Zeichen (siehe Kommentar von Plannapus)

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

Ausgabe:

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

Da viele Zeichenkettenoperationsfunktionen (wie strsplit) Fehler auslösen, wenn sie mit Nicht-Zeichen gefüttert werden, ging ich davon aus, dass grepldies auch der Fall ist. Schöner Fang! +1
Plannapus

2
Übrigens, da Sie es auf einen Ausdruck reduziert haben, müssen Sie es nicht bvorher definieren :a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Plannapus

3

Fortran - 118 114 111

Ein hoffnungslos unwahrscheinlicher Kandidat, der ursprünglich für Lochkarten entwickelt wurde. Unter Verwendung aller obskuren Konstrukte aus der Vergangenheit wird möglicherweise noch ein kurzer Code geschrieben:

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

Das "berechnete Goto" goto(L1,L2,...,Ln) xverzweigt genau dann zu einem der Labels L, wenn 1 <= x <= n.

Bearbeiten: Es ist gelungen, 4 Bytes zu sparen, indem die Schleife, die die Ziffer 3 prüft, neu angeordnet wurde. Als Bonus enthält der Code jetzt auch die arithmetische if-Anweisung if(x) a,b,c, die immer zu einem der drei Labels verzweigt: a if x <0, b wenn x == 0 oder c wenn x> 0.

Leider lieferten die ersten beiden Versionen nicht die richtige Ausgabe. Die Ziffer-3-Schleife funktioniert jetzt ordnungsgemäß, und der Code enthält jetzt auch eine moderne logische if-Anweisung. Drei weitere Bytes sind weg, denn wer braucht eine enddoAussage? Die Ausgabe kann hier überprüft werden .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.