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 Code-Golf- Herausforderung, also gewinnt der kürzeste Code.
- Dieser Wettbewerb endet am 30. Juni 2014 (7 Tage nach Veröffentlichung).
buzz
oderbzzt
wenn beide Anforderungen zutreffen? Muss ich ausgeben12bzzt4
oderbzzt
dafür1234
?bzzt
für1234
. Es ist ein "übliches" Trinkspiel hier (nur wir machen es oft mit 7)Antworten:
CJam - 25
Vielen Dank Howard :)
Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
501{…}fI
ist im Grundefor(int I=0; I<501; ++I) {…}
3s
konvertiert 3 in String, dh "3"I3%
istI
% 3<
bekommt den linken Teilstring -"3".substring(0, I % 3)
- was "" fürI
% 3 == 0 ist und "3" sonstIs
konvertiertI
in String-
mit 2 Strings bewirkt einen Satzunterschied, was zu einem Leerlauf führt Zeichenkette iffI
% 3 == 0 (die erste Zeichenkette war leer) oderI
hat 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, undN
eine neue Zeile hinzugefügt wirdquelle
501{3sI3%<Is-I"bzzt"?N}fI
.Rubin, 43
Ziemlich einfach.
Bearbeiten: Gespeichert ein Byte, danke Howard!
quelle
"#{a}"[?3]||a%3<1
."#{a}"[?3[0,a%3]]
.puts
mitp
und Speichern von 3 Zeichen?p
das Ergebnis des Aufrufsinspect
seines Arguments aus (im Vergleich zu Puts, die aufrufento_s
). Anstatt zu druckenBzzt
(was ist:Bzzt.to_s
), wird gedruckt:Bzzt
, was nicht den Ausgabespezifikationen entspricht.seq und GNU sed -
42333130Funktioniert direkt in Dash, einige andere Shells benötigen möglicherweise eine deaktivierte History-Erweiterung, z. B. mit bash
set +H
:quelle
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.x86-Maschinencode unter DOS (.com-Datei) - 71 Byte
Druckt die erforderliche Ausgabe mit Leerzeichen als Trennzeichen nach stdout. kann problemlos in DosBox ausgeführt werden.
Kommentierte Versammlung:
quelle
Perl - 35
4042quelle
PHP, kein Trennzeichen -
62, 61,59,58,52,4947Es heißt nicht, dass zwischen ihnen ein Leerzeichen / ein Zeilenumbruch / ein Trennzeichen stehen sollte, ohne:
Mit dem Separator
68,67,65,64,58 / 55,53 / 5251/50echo
, habe mich ein bisschen gerettet.~õ
erstellt einen ZeilenumbruchJavascript -
54,5150Gleiches Prinzip, aber Javascript-Funktionen:
quelle
console.log()
natürlich mit getestet , aber das ist kürzer.<?for(;500>$i++;)echo$i%3*!strpbrk($i,3)?$i:bzzt,~õ;
Dasõ
ist char 245, ein bisschen invertiert\n
.!strpbrk($1,3)
mittrim(3,$i)
4 Byte speichernJavascript
5049-1 Byte dank core1024
quelle
&&
Operator. Zum Beispiel:497 % 3 = 2
=>2 & true = 0
=>bzzt
for(i=0;++i<501;)alert(!/3/.test(i)*i%3?i:'bzzt')
- 49: PGolfScript,
30 bis29 ZeichenEine nicht so einfache Implementierung in GolfScript kann hier getestet werden .
quelle
Perl, 36
Edit: Ich bin kein Perl-Mönch, daher scheint es core1024 in seiner Antwort gelungen zu sein, ein weiteres Byte davon zu spielen .
quelle
say
4 Byte speichern:say$_%3&&!/3/?$_:bzzt for 1..5e2
C # (71)
Kann direkt in LinqPad ausgeführt werden.
quelle
|
) anstelle von logisch-oder verwenden.Python (52)
Danke grc!
Alte Version:
quelle
for i in range(501):print[i,'Bzzt'][i%3<1or'3'in`i`]
['3'[:i%3]in`i`]
Haskell:
88828079quelle
==0
mit<1
elem'3'$show n
, was ein Zeichen kürzer ist. Oder nicht. Ich habe nicht nachgesehen.elem
Präfixnotation werden keine Zeichen gespeichert, da vor dem Apostroph ein Leerzeichen stehen muss. sonst wirst du bekommenNot in scope: elem'3'
. Gutes Auge mit<1
, obwohl!JavaScript
666360Vielen 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.
Version 1b - 65
Wenn wir 0 als nicht teilbar durch 3 betrachten, können wir die Lösung auf 65 Zeichen verkürzen:
Version 2 - 63
Danke an grc für den Vorschlag, die Länge zu reduzieren.
quelle
for(a=i="";i<500;)a+=++i ...
PowerShell, 42
Meistens Venteros Arbeit, mit ein bisschen Hilfe zur Syntax von mir ;-)
quelle
R, 49 Zeichen
Erklärt:
Verwendungszweck:
quelle
Cobra - 70
Charge - 222
Weil ich diese Sprache wirklich liebe ... aus irgendeinem Grund ...
quelle
if
da Sie wissen, dass es mindestens eine Ziffer gibt. Das Verketten des gesamten Blocks innerhalb vonfor
with&
kann auch dazu beitragen, die Klammern zu speichern.==
stattEQU
und wahrscheinlich ein paar Räume hier und dort fallen.TI-BASIC - 31
(32) (34) (35) (36) (43)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
Ans
Variablen getan habe .quelle
bzzt
bzzt
nur 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.C 93
Nur zum Teufel ...
quelle
i = 0
Julia 64 Bytes
quelle
[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 undcmd.exe - 91
... weil warum eine Batch-Datei verwenden, wenn es einen ganz einfachen Einzeiler gibt ... :-)
quelle
groovig - 51
edit: die verwendung
times
der druckversion ist jetzt so kurz wie das "anzeigen". danke @ will-pquelle
(1..500).each
für500.times
C 80
Leerzeichen als Trennzeichen anstelle von Zeilenumbrüchen verwenden.
quelle
1 bzzt 3 4 bzzt 6 7 bzzt 9 10 bzzt bzzt 13 bzzt
... Da stimmt was nicht.Mathematica, 54 Zeichen
Das fühlt sich zu einfach an. Kürzere Lösungen müssen möglich sein.
quelle
T-SQL 2008 - 80
Nichts als Spaß und kein Sieg: Optimiert dank @domager:
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:
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
iif
mü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 ltrimquelle
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
@
. Dann ist die Verwendung von iif () immer noch kürzer als ein if (...) print else print, sodass wir durch die Verwendung desiif
Ausdrucks einiges gewinnen . Wir können auch die kürzere verwenden@+=1
, um ein Zeichen zu speichern+=
. 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.+=
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 getipptint
.str
funktioniert und es ist nicht viel teurer als alles andere (2 zusätzliche Zeichen für die Eltern). Ich habe mich wegen desIIF
Betreibers 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).VBA: 54
Ö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.
quelle
k4
(37)(35)k4
Es fehlt ein integrierter Modulo-Befehl, und die Verwendung dieses Befehlsq
wü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:
So geschickt die Übereinstimmung mit dem Dezimalpunkt auch sein mag, ich kann zwei Bytes rasieren, indem ich prüfe, ob das
3*floor x%3
noch istx
.quelle
h1
undh2
wichtig genug ist, um überhaupt eine Änderung zu rechtfertigen.)Bash,
53 52 4846Benötigt GNU sed (benutzt die
c
Erweiterung).quelle
Java,
142131 danke an WozzeC Vorschlagquelle
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"));}}
R
(40)(36)Diese Antwort ist prinzipiell plannapus etwas verkürzt, kann ich aber noch nicht kommentieren
Update: -4 Zeichen (siehe Kommentar von Plannapus)
Ausgabe:
quelle
strsplit
) Fehler auslösen, wenn sie mit Nicht-Zeichen gefüttert werden, ging ich davon aus, dassgrepl
dies auch der Fall ist. Schöner Fang! +1b
vorher definieren :a=1:500;a[grepl(3,a)|!a%%3]='bzzt';a
Fortran -
118 114111Ein 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:
Das "berechnete Goto"
goto(L1,L2,...,Ln) x
verzweigt 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
enddo
Aussage? Die Ausgabe kann hier überprüft werden .quelle