Mein Kollege hat mir kürzlich das folgende Stück JavaScript als Scherz geschickt:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Da der Code während der Arbeitszeit geschrieben wurde, war dies offensichtlich eine enorme Verschwendung von Unternehmensressourcen. Um ähnliche Ereignisse in Zukunft zu vermeiden, müssen wir die Verschwendung von Arbeitsstunden minimieren. Und da es allgemein bekannt ist, dass ein kürzeres Programm schneller zu schreiben ist, müssen wir diesen Code so kurz wie möglich halten!
Eingang
Eine einzelne nicht negative Ganzzahl. Sie dürfen keine fehlerhaften Eingaben verarbeiten.
Ausgabe
Ihr Programm muss eine Ausgabe erzeugen, die mit der des obigen Skripts identisch ist. Sie sollten ein Wort pro Zeile ausgeben und die Anzahl der Wörter sollte mit dem ursprünglichen Skript übereinstimmen.
Es ist zulässig, am Ende jeder Zeile (aber nicht am Anfang) Nicht-Leerzeichen einzufügen, da sie unsichtbar sind. Ein zusätzliches Zeilenumbruchzeichen ist am Ende der Ausgabe zulässig.
Beispiele
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
Variable hat einen schlechten Namen und ist irreführend. Trotzdem nette einfache Herausforderung.if
s fallen durch und fahren in der aktuellen Schleife fort, wenn ihre Bedingung erfüllt war.Antworten:
Excel, 78 Bytes
Es wird davon ausgegangen, dass die Eingabe in Zelle A1 erfolgt und die Wordwrap-Formatierung für die Zelle aktiviert ist. Verwenden Sie Alt + Eingabetaste, um Zeilenvorschübe in die Zeichenfolge einzufügen und das Leerzeichen zu notieren. Kann aufgrund der eingeschränkten REPT-Funktion nur Eingaben bis zu 3570 verarbeiten.
Nachdruck mit Leerzeichen
So funktioniert es: Das Muster wiederholt sich alle 6 Zahlen:
Jedes dieser Zeichen kann mit 9 Zeichen ausgedrückt werden. Eine Zeichenfolge besteht also aus 54 Zeichen (9 * 6) und wird so oft wiederholt, wie Excel dies zulässt. Dann werden die linken 9 * (Anzahl der eingegebenen) Zeichen als Ausgabe verwendet.
Der Zeilenvorschub für das "aber und keiner" wird nach dem Leerzeichen eingefügt, sodass das Ja für # 6, # 12 (usw.) eher links als rechts formatiert wird und nicht jede 6. Zeile ein Leerzeilenvorschub hinzugefügt wird für diesen Artikel.
quelle
JavaScript (ES6),
59-57ByteProbieren Sie es online!
Wie?
Wir verwenden eine rekursive Funktion, die von ausgehtn 1 0 n−1
Dies ermöglicht es uns, den einfacheren Fall als ersten Eintrag unseres Nachschlage-Arrays zu speichern , in dem wir definieren können : eine Variable, die entweder eine leere Zeichenfolge enthält.n≡0(mod3) s
"But\n"
Die beiden anderen Einträge sind als
"Yeah\n" + s
und definierts + "No\n"
.Hinweis: Wenn Sie von bis iterieren , könnten Sie auch im ersten Eintrag definieren , dies würde jedoch zwei zusätzliche Klammern kosten .n−1 0 s
Kommentiert
quelle
LOLCODE , 257 Bytes
Probieren Sie es online!
quelle
VISIBLE "But"
sich das auf den Hosenmangel des Programms?Whitespace ,
315304300277276 BytesDank @JoKing für -11 Byte (Reduzierung der Anzahl der verwendeten Labels von 8 auf 7) und -24 Byte mehr (Änderung des allgemeinen Programmflusses und Reduzierung der Anzahl der verwendeten Labels von 7 auf 5).
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Whitespace ist definitiv nicht die richtige Sprache für diese Herausforderung. In Whitespace werden sowohl Schleifen als auch if-Anweisungen mit Bezeichnungen und Sprüngen zu Bezeichnungen erstellt, und da es sich nicht um if-else-Fälle handelt, sondern um mehrere if-Fälle,
bedeutet dies I muss nach jedem if zurückspringen, wasbedeutet, dass ich die Checks leicht ändern muss, um einige Ausdrucke zu überspringen (danke @JoKing ).Erklärung im Pseudocode:
Zusätzliche Erklärung:
Im Allgemeinen wird eine Schleife von der Eingabe bis auf 0 ausgeführt, wobei eine neue Zeile eingefügt und das Wort umgekehrt wird (also in der Reihenfolge "\ noN", "\ ntuB", "\ nhaeY" anstelle von "Yeah \ n", "But \ n "," Nein \ n "). Nachdem die Eingabe auf 0 zurückgesetzt wurde und sich alle Zeichen auf dem Stapel befinden, werden diese Zeichen in umgekehrter Reihenfolge gedruckt (also in der richtigen Ausgabereihenfolge).
Ausführlicher jedoch: Obwohl wir Wörter im Bereich drucken müssen
(input, 0]
, wird[input, 0)
stattdessen eine Schleife im Bereich ausgeführt . Aus diesem Grund können wir die Prüfungif(i%3 == 2)
für "\ noN" verwenden (oderif(i%3 != 2)
das Verschieben von "\ noN" überspringen), und wir können die Prüfungif(i%2 != 1)
für "\ ntuB" verwenden (oderif(i%2 == 0)
das Verschieben von "\ ntuB" tatsächlich überspringen ). Erst nach diesen beiden Überprüfungen wird die Iterationi
um 1 verringert. Anschließend wird überprüftif(i%3 == 0)
, ob "\ nhaeY" gedrückt wurde, ähnlich wie im JS-Beispielcode in der Beschreibung der Herausforderung. Überspringen mit If-Not-Checks, anstatt zu einem Label zu wechseln, und Zurückkehren vom Label mit If-Checks, die 23 Byte gespeichert haben.Außerdem werden in Whitespace Zeichenwerte als Unicode-Werte im Stapel gespeichert (dh
10
für Zeilenumbrüche,65
für 'A',97
für 'a' usw.). Da ich den Stapel bereits durchlaufen muss, um die Zeichen zu drucken, kann ich auch meinen Whitespace-Tipp verwenden , um die Byteanzahl zu verringern , indem ich den Zahlenwerten eine Konstante hinzufüge, bevor ich sie als Zeichen drucke.Diese Konstante ist
104
in diesem Fall die Konstante , die mit diesem Java-Programm generiert wird, mit dem ich auch schon eine andere Whitespace-Antwort von mir gespielt habe . Das ist auch der Grund, warum dieser Teil des Codes:hat die Werte
-94
für die Newline,7
für das 'o' und-26
für das 'N'. Da das Hinzufügen der Konstante104
korrekt unsere Unicode - Werte geben10
,111
und78
für diese Zeichen sind.quelle
if i modulo-3 != 1 jump to next if else push NO
i
vor demif(i is 0) call PRINT
ist wahr, aber Ihre andere prüft das,i
bevor sie es subtrahiert und über die Drucke überspringt. Eigentlich ziemlich schlau. Wird es weiterhin implementieren.Python 3 ,
8582 BytesProbieren Sie es online!
Python 3 ,
7976 BytesPort of Keeta ‚s Excel Antwort .
Probieren Sie es online!
quelle
Perl 6 ,
6350 BytesProbieren Sie es online!
Anonymer Codeblock, der eine Nummer annimmt und eine Liste von Zeilen zurückgibt
Erläuterung:
quelle
C (gcc) , 75 Bytes
Probieren Sie es online!
C (gcc) , 60 + 11 = 71 Bytes (unter Verwendung von
-D$=||puts(
)Probieren Sie es online!
quelle
05AB1E (Legacy) ,
272524 ByteDank Kevin Cruijssen 1 Byte gespeichert .
Probieren Sie es online!
Erläuterung
quelle
×
, hatte nicht darüber nachgedacht!Θ
jetzt entfernen, das Sie nicht mehr verwenden×
, daÏ
nur1
s angezeigt werden, sodass es das ignoriert2
(und0
natürlich).Python 2 , 73 Bytes
Probieren Sie es online!
quelle
Python 2 ,
979592908381 BytesProbieren Sie es online!
-2 Bytes dank ovs
Python 3 ,
92908583 BytesProbieren Sie es online!
-4 Bytes dank ovs
-4 Bytes, danke an Jo King
quelle
len(w)<3
->'N'in w
, 81 Bytes :len(w)%2
->(w<'N')
Canvas , 27 Bytes
Probieren Sie es hier aus!
quelle
Groovy (Funktion), 79 Bytes
Seit ich meine Antwort ursprünglich eingereicht habe, habe ich hier einige historische Diskussionen darüber durchgesehen, was eine geeignete Antwort darstellt. Da es allgemein anerkannt ist, nur eine Methode in Java bereitzustellen (einschließlich Rückgabetyp- und Parameterdeklarationen), ist hier eine kürzere Groovy-Methode, deren Rückgabewert die Antwort ist. Verwendung von
def
bedeutet, dass der Rückgabetyp abgeleitet wird.Anders als die ursprüngliche Antwort unten, die von 0 bis n-1 durchläuft, ruft diese sich selbst von n bis 1 auf, dekrementiert jedoch die Eingabe für den Rest der Zeile im rekursiven Aufruf.
Probieren Sie es online!
Groovy (Programm), 87 Bytes
Groovy - Skripte erfordert keine bestimmten gemeinsame Importe, so dass dies ein Programm , das Drucken , ohne dass die Antwort auf Java STDOUT sein kann , erklären ,
System.out.
vorprint
. Es werden auch einige gängige DienstprogrammmethodentoLong()
bereitgestellt, mit denen wir das Eingabeargument einigermaßen konsistent analysieren können.Im Wesentlichen die Java 10-Antwort, aber unter Ausnutzung der kürzeren Loop-Syntax von Groovy und der Fähigkeit, wahrheitsgemäße Aussagen zu bewerten.
Probieren Sie es online!
quelle
Retina 0,8,2 , 45 Bytes
Probieren Sie es online! Erläuterung:
Konvertieren Sie die Eingabe in Unary.
0...n-1
Generieren Sie für jede Ganzzahl drei Textzeilen, eine für jedes Wort mit einemi
1
vorangestellten s, mit Ausnahme vonNo
zwei zusätzlichen1
s, damit wir berechnen,(i+2)%3==0
was äquivalent zu isti%3==1
.Entfernen Sie Paare von
1
s vorB
s.Entferne
1
s in Dreiergruppen überall.Löschen Sie alle Zeilen mit einem
1
.quelle
11No¶
rechnen sehe(i+2)%3==0
(also sind alle drei If-Checks==0
), sieht es so offensichtlich aus, aber ich hätte das selbst nicht gedacht, also ist es eigentlich ziemlich genial. +1 von mir, nette Antwort!Java 10,
10099 Bytes-1 Byte danke an @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
++i%3>1
werden Sie wahrscheinlich ein Byte speichernPowershell,
7574726766 Bytes-1 Byte danke TessellatingHeckler
Testskript und Erklärung:
Ausgabe:
Einfaches Skript, 72 Bytes:
quelle
======
. Es werdenYeah,But,No
nur Strings generiert . Das Testskript enthält ein Trennzeichen, das nur das Lesen der Ergebnisse erleichtert.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 Bytes
Probieren Sie es online!
Erläuterung
Ziemlich einfach, zwei Bytes gespart, indem
[1..n]
stattdessen[0..n-1]
die restlichen verwendet und angepasst werden: Der Operator(?)
testet vier Argumente und gibt eine leere Liste oder die bereitgestellte Zeichenfolge als Singleton zurück, wenn das Ergebnis korrekt ist.Durch Aufrufen des vierten Arguments von können
(?)
wir(<>)
die Ergebnisse jeder Funktion verketten, dh:quelle
C # (Visual C # Interactive Compiler) ,
10599949689 ByteProbieren Sie es online!
quelle
x++%3==1?
kann sein++x%3>1?
. Jemand anderes hat es nur für meine Java-Antwort getippt, aber das Gleiche gilt für Ihre C # -Antwort. :)Pip ,
373533 Bytes(Beachten Sie das Leerzeichen danach
But
.) Nimmt Eingaben als Befehlszeilenargument entgegen. Probieren Sie es online!Erläuterung
Diese Erklärung gilt für die vorherige Version - siehe unten für das Änderungsprotokoll
Inspiriert von Jo Kings Perl 6 Antwort . Wir erstellen diese Liste:
und die ersten
a
Elemente davon unter Verwendung einer zyklischen Indizierung auszugeben .Update: Ich habe festgestellt, dass ich "Ersetzen" nicht verwenden muss, um 0/1/2 in Zeichenfolgen zu ändern. Mit diesen Zahlen kann ich eine Liste direkt indizieren. Dazu müssen wir sicherstellen, dass die mehrstelligen Nummern in Listen mit ihren Ziffern aufgeteilt sind (andernfalls wählen wir Index 10 anstelle der Indizes 1 und 0). Glücklicherweise funktioniert die Verwendung einer willkürlich verschachtelten Liste als Index in Pip erwartungsgemäß und gibt eine (verschachtelte) Ergebnisliste aus. Für die Eingabe von 3 erhalten wir diesen Datenfortschritt (wobei
_
eine neue Zeile darstellt):Nach wie vor wird das Endergebnis zusammengefügt und automatisch gedruckt.
quelle
Attache , 48 Bytes
Probieren Sie es online!
Erläuterung
quelle
C (gcc) ,
7771747269 BytesEs gibt hier bereits eine bessere C- Antwort, aber diese ist rekursiv und ich habe einige Zeit gebraucht, um klar zu kommen, also poste ich sie.
Bis zu 69 Bytes dank @ceilingcat und @JonathanFrech
(Ich denke nie daran, n- ~ -i anstelle von n-i + 1 zu verwenden.)
Probieren Sie es online!
quelle
j
hat dir zwei Bytes erspart.n-~-i
entsprichtn-i+1
- nichti<n+1
- und speichert so eigentlich keine Bytes ...Rubin, 69
7274BytesSehr direkte Antwort, die gerade nach einer kürzeren, rekursiven Methode sucht.
Zwei Bytes dank @BWO gespart :)
Weitere drei Bytes mit Symbolen anstelle von Zeichenfolgen gespeichert
quelle
Python 3, 93 Bytes
Dies ist nicht gerade die beste Lösung, aber ich übernehme sie.
Probieren Sie es online!
quelle
R, 65 Bytes
Aufgrund der Tatsache, dass wir ein leicht fehlerhaftes Programm replizieren (es lässt jedes vierte "aber" aus - es sollte verwendet werden
%4 == 1
und%4 == 3
nicht die%3
Bedingungen), müssen wir einen umständlichen Aufruf an diec
Basis 7 senden und in dieser arbeiten. Trotzdem ist es kürzer als LOLCODE ...(Ich hatte gehofft, dass (3,1,2,3,2,1,2) oder eine ähnliche Permutation
lh
irgendwo im Datensatz erscheinen könnte, aber es sieht nicht so aus)quelle
sed -E ,
179150 BytesDas Schwierigste war, nicht die Liste zu erstellen, sondern die Dezimalzahl zu analysieren.
2 Bytes können gespeichert werden, wenn die Zeilenumbrüche am Ende nicht benötigt werden:
c\
→d
.Muss noch optimiert werden.
Probieren Sie es online aus .
Erläuterung
quelle
Sauber , 116 Bytes
Probieren Sie es online!
quelle
F #,
108106 BytesProbieren Sie es online!
-2 Bytes, die sich von
i=0 to p-1
zu änderni=1 to p
und Module anpassen. Ansonsten ziemlich unkompliziert.quelle
v
Funktion alles druckt.i=1 to p
(und stellen Sie natürlich die Module ein). Umgekehrte Bereiche sind leer. :)PHP,
6568 BytesLaufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle
VBA (Excel),
105, 101,99 BytesEdit: -4 Bytes von Keeta! Vielen Dank!
Editiere 2: -2 Bytes von Chronocidal! Woot! (Es wurde erkannt, dass Testfälle nur für 10 funktionierten. Jetzt behoben)
Ja, Excel hat diesmal VBA geschlagen. Wie auch immer. (Wir kommen für Sie)
^ Dies wird in das Direktfenster eingefügt und in das Debug-Fenster ausgegeben
Ungolfed
quelle
&
IIf(..)
Jelly , 22 Bytes
Ein monadischer Link mit einer Liste von Zeilen (was in Kommentaren erlaubt zu sein scheint)
Probieren Sie es online! (Die Fußzeile nennt den Link using
Ç
und verbindet sich mit Newlines using,Y
da implizites Drucken in Jelly alles zusammenbricht, wenn es geht.)Wie?
Beachten Sie nun, dass die ersten sechs Werte sind:
In der resultierenden Zeilenliste sollten diese Werte also wiederholt (oder abgeschnitten) werden, um die Länge miteinander zu
n
verketten.Beachten Sie nun, dass die Potenz von
"Yeah", "But", "No"
:Also ist jede Periode diese 1-indizierten Werte der Potenzmenge von
"Yeah", "But", "No"
:Der Code erstellt diese Liste, formt sie auf Länge
n
, indiziert sie im Power-Set und entfernt dann die inneren Listen (wodurch auch die leeren Zeichenfolgen entfernt werden, da Zeichenfolgen Listen in Jelly sind) ...quelle
Python 2 ,
939283 BytesProbieren Sie es online!
Massive 9 Bytes, die dank @Jonathan Frech gespeichert wurden
quelle
('','Yeah\n')[x%3<1]
entspricht"Yeah\n"*(x%3<1)
.