Liebt mich, liebt mich nicht
Dieses einfache Kinderspiel ist alt, aber immer noch beliebt. Da wir jetzt im 21. Jahrhundert leben, sollten wir es digitalisieren!
Spezifikation
Das Programm darf keine Eingaben vornehmen, es sei denn, Sie verwenden eine Sprache, die keinen zufälligen Startwert erzeugen kann. In diesem Fall dürfen Sie den Startwert als Eingabe verwenden. Ihre Aufgabe ist es, ein Programm zu schreiben, das zufällig insgesamt 3 bis 20 Zeilen einschließlich ausgibt: "Liebt mich ..." und "Liebt mich nicht ..." abwechselnd wie im Spiel (und eine zusätzliche Zeile; behalten Sie bei lesen).
Es gibt jedoch einige Einschränkungen. Auf jede Zeile sollte eine neue Zeile folgen. Die erste Zeile muss "liebt mich ..." sein. Die letzte Zeile (entweder "Liebt mich" oder "Liebt mich nicht") sollte mit einem Ausrufezeichen bzw. einem einzelnen Punkt enden. Nach der letzten Zeile müssen Sie in der neuen Zeile entweder ein Herz ( <3
) oder ein gebrochenes Herz ( </3
) ausgeben , je nachdem, ob "Loves me!" oder "liebt mich nicht." war der letzte Satz.
Nachgestellte Leerzeichen sind erlaubt.
Beispielausgabe
Ausgabe:
Liebt mich ...
liebt mich nicht ...
liebt mich ...
liebt mich nicht ...
liebt mich!
<3
Ein weiterer Ausgang:
Liebt mich ...
liebt mich nicht ...
liebt mich ...
liebt mich nicht.
</ 3
Dies ist das Code-Golf , also gewinnt der kürzeste Eintrag!
Auch meine erste Herausforderung :) Viel Glück!
quelle
[3, 20)
) oder 3 bis einschließlich 20 ([3, 20]
)?Antworten:
Pyth,
5453515048 Bytesquelle
%2tWZ"<</33
für das Herz spart Druck 1. Nicht überzeugt, dass dies der beste Weg ist.%
.@".!"Z%hZ"</3
spart zwei BytesCJam,
535049 BytesVielen Dank an Dennis für das Speichern von 1 Byte.
Teste es hier.
Erläuterung
Der Code legt die Zeichenfolge einfach in kleinen Stücken auf den Stapel, der am Ende des Programms automatisch gedruckt wird:
quelle
Brainfuck, 2766 Bytes (derzeit ungültig)
Nur weil. Ich werde später eine ungolfed Version hinzufügen.
Code
Pseudocode
Stichprobe
Beim Ausführen tritt das Programm in eine interaktive Sitzung ein, die auf Eingabe wartet. Die Eingabe sollte eine Zahl sein. Diese Nummer wird als Startwert verwendet.
Seed: 1 (Zufallszahl ist 5, benötigt 218.168.042 Operationen)
Seed: 3 (Zufallszahl ist 20, dauert 463.253.048 Operationen)
Ich würde vorschlagen, dass Sie nicht mit Seeding arbeiten
6
, da es2,105,900,375
Iterationen braucht , um das Ergebnis zu berechnen :).Kompilieren / Laufen
Sie benötigen dafür einen schnellen Dolmetscher. Kein von mir getesteter Online-Interpreter kann mit der Ausführungsgeschwindigkeit umgehen. Die ips (Iterationen pro Sekunde) sollten mehr als sein
100,000,000
. Also habe ich mir eine andere Lösung ausgedacht.Dies ist ein in Brainfuck geschriebener Brainfuck to C-Compiler. Sie können jeden Online-Interpreter verwenden, um meinen Code in reines C umzuwandeln . Ich schlage vor, brainfuck.tk zu verwenden . Fügen Sie meinen Code in die stdin-Eingabe ein und fügen Sie diesen Code in die Code-Eingabe ein:
Laden Sie den Quellcode herunter und kompilieren Sie ihn:
Sie können eine Kopie des C-Codes auch online hier ausführen: über. CodingGround .
Optimierungen
Es gibt noch einiges zu tun, aber die Wiederverwendung der Zellen ist nahezu optimal.
Bemerkungen
Sie können Wörter oder Ausdrücke als Startwert verwenden:
quelle
Javascript (ES6),
1191049998 Bytequelle
new Date
Trick in meiner Antwort verwende?Loves me not... Loves me... Loves me not! <3
undLoves me not... Loves me... Loves me not... Loves me. </3
. Ich denke, Sie müssen eine der Bedingungen ändern, um dies zu beheben. EDIT: Oh, schalte einfach das''
und' not'
in die vierte Zeile.Python, 147
Verwendet
from random import*
stattimport random
undrandint
stattrandrange
, um ein paar Bytes zu sparen. Es sind wahrscheinlich noch ein paar Bytes zum Golfen übrig.quelle
"LLoovveess mmee n o t"[i%2::2].strip()
erscheint unnötig kompliziert. Kannst du nicht einfach tun"Loves me"+~i%2*" not"
?["Loves me","Loves me not"][i%2]
ist optimaler, da Sie jetzt Zeichen.strip()
und ein paar Leerzeichen verschwenden . Aber ja, benutze xnors CodeJavascript (ES6),
110102 BytesDies war eine kurze, aber lustige kleine Herausforderung. Es kann möglich sein, mehr zu verkürzen. Vielen Dank an Mwr247 für einige Tricks zum Speichern von Bytes!
Alternative Version mit
repeat()
105 Bytes:Darn JS 5 + -char eingebaute Namen. Naja. Vorschläge willkommen!
quelle
18+3|0
?Math.random()
. Schätze, es ist jetzt nicht notwendig.Perl, 85
quelle
Rubin, 91 Bytes
quelle
Common Lisp
106104 BytesDies funktioniert nur bei LISPS, bei denen keine ordnungsgemäße Sequenz überprüft wird (z. B. cmucl, sbcl, clisp). Ccl überprüft die Standardsicherheitsstufe auf Zirkularität und Fehler. ecl wird für immer loopen.
Erläuterung:
#1=(1 0 . #1#)
generiert eine zirkuläre Liste mit1
und0
undsubseq
wird verwendet, um eine Liste mit der Länge [3,20] zu erstellen (dies ist der einzige nicht tragbare Teil, dersubseq
nur vom Standard für die Arbeit an richtigen (dh nicht zirkulären) Listen verlangt wird).Unser Format arbeitet jetzt mit einer Liste
1 0 1 0...
von Längen [3,20]Erklärung der
format
Richtlinien:~{
Durchläuft diese Liste~[
gefolgt von einer beliebigen Anzahl von~;
und beendet mit~]
wird das N-te Element basierend auf dem Wert des Format-Arguments ausgewählt. Dies wird hier verwendet, damit der erste Punkt in einem~[
Fall "liebt mich nicht" und der zweite "liebt mich" ist. Beachten Sie, dass mit~[
einem Trennzeichen von~:;
ein Standardfall ausgewählt wird.~#[
funktioniert so,~[
außer dass das Argument die Anzahl der verbleibenden Argumente ist. 0 verbleibende Argumente bedeuten, dass wir am Ende sind. Standardmäßig wird gedruckt...
~:*
Sichert die Argumentliste um eine Position, sodass wir den richtigen Trailer ausdrucken können.quelle
Julia, 98 Bytes
Ungolfed:
quelle
UNIX-Shell, 193 Byte
quelle
Java,
210209203200177 Bytesdrehte sichi%2==0
zui%2<1
{ ... }
Klammern fürfor
-loop, verschobenee
Deklaration in SchleifeRandom
Verwendung überarbeitet und Inkrement füri
Hinweis: Für die Formatierung auf dieser Site wird unten eine neue Zeile hinzugefügt. Die oben angegebene Anzahl gilt für eine einzelne Zeile.
Ungolfed:
quelle
main()
aber ...C,
123, 121, 109106 Zeichen (108 Bytes)(mit ein wenig ♥♥♥ betrügen ♥♥♥)
Es gibt auch einen Unicode-Punkt mit gebrochenem Herzen bei 1f494, aber ich hatte Schwierigkeiten, eine Schriftart zu finden, die ihn implementiert.
quelle
O=0
, weilC
ints automatisch zu initialisieren0
?main(o,O)
wo es initialisiert werden musste.time
eine Zufallszahl zu verwenden ... Clever!srand(time(0))
ändern alle anderen Programme ihre Antwort mit der gleichen Häufigkeit. Der Rand ist völlig nutzlos :-)Python 2,
161159156144 BytesEs sind 39 Bytes, nur um die Zufallszahl zu erhalten.
Ein großes Dankeschön an muddyfish , fryamtheeggman und orlp für ihre Hilfe.
PYG , 109 Bytes
quelle
import random as r
print'</3'if i%2 else'<3'
umprint['<3','</3'][i%2]
3 Bytes zu speichern.import random as r;a=r.randrange(3,21)
undimport random;a=random.randrange(3,21)
sind gleich lang.PowerShell,
121119111 BytesBearbeiten - eigentlich kürzer, um explizit einzuschließen,
"Loves me"
anstatt zu deklarieren$l
Edit2 - habe vergessen, dass ich
for()
Loops durch Pipelining golfen kann ... durr ...Nicht zu schäbig. Verwendet Inline-Codeausführungsblöcke
$(...)
, um die gedruckte Zeichenfolge dynamisch anzupassen, wenn einefor()
Schleife ausgeführt wird. Beachten Sie, dass dies bei bestimmten PowerShell-Versionen extrem langsam sein kann , da dies ein implizitesGet-
Vorzeichen verwendetRandom
, um ein paar Bytes zu speichern. ReferenzZur Verdeutlichung weiter unten erweitert:
quelle
C ++,
210193184168 BytesIn C ++ .. weil .. Warum nicht? :)
Leben:
210193184168Hoffe nur, dass meine Änderungen nicht plattformabhängig sind.
Vielen Dank an Ben Voigt für die Hilfe. Auch dank all der Kommentare waren sie sehr hilfreich.
quelle
j=3+(int)(rand()*17.0/RAND_MAX)
#define c cout
undusing namespace std;
durchauto&c=std::cout;
int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Groovy, 110 Bytes
Eine starke Art von Liebe:
quelle
Python 2, 117 Bytes
Beachten Sie, dass jeder
Loves me( not)?
von gefolgt ist...
und ein Newline, mit Ausnahme des letzten. Das sieht also nach einem Job für ausjoin
.quelle
".!\n\n<</33"[n%2::2]
2 Bytes kürzer.R,
141132128114111109 BytesCode
Ungolfed
Ich habe mich von Eric Brooks Code inspirieren lassen .
Edit 1: Der Code gibt nun die letzte Interpunktion korrekt aus, wie von Martin hervorgehoben.
Edit 2: Die for-Schleife wurde in eine sapply-Schleife geändert und die Herzen in die letzte Zeilenfolge eingefügt.
Edit 3: Entfernte die
{}
und änderte sich+(x==k)*2
zu+2*!x<k
Edit 4: Zurück zur for-Schleife und entfernte die
()
aus(i%%2)+1
Edit 5: Schrieb
me
4 mal und entfernte diesep=""
quelle
R,
119111105 BytesBearbeitungen 1,2: Das explizite Codieren der beiden Optionen spart Platz.
quelle
=
für die Zuweisung verwenden, anstatt eines<-
anderen, indem Siex%%2>0
anstelle vonx%%2==1
. Beachten Sie auch, dass dies die letzte Zeile nicht korrekt behandelt. es sollte ein.
oder!
mehr als sein...
. (Siehe Beispielausgabe in der Frage.)x%%2>0
; justx%%2
C 226 Bytes
(Mit Formatierung)
quelle
Python 2, 115 Bytes
quelle
PHP,
191187146165 BytesUngolfed:
48,49 bytes für pyth und cjam ... wow :)
quelle
mSL,
178176156154 BytesEdit 1: Geändert
== 0
zu< 1
Edit 2: Unnötiges Leerzeichen entfernt, danke AlexA!
Edit 3: Klammern entfernt
quelle
Perl, 97 Bytes
Lesbare Version:
quelle
Hassium , 265 Bytes
Die Antwort wurde golfen.
quelle
</3
.rnd = new Random();rnd.next(0,2);
1000 Mal ausführe , ist die Verteilung in Ordnung. Wenn ich jedochrnd = new Random();
einmal undrnd.next(0,2);
1000 Mal ausführe , erhalte ich immer genau 5330
s und 4671
s.C # (160)
Der Code ist inspiriert von der Antwort von hjk , Kredit geht an ihn.
Ungolfed:
quelle
Lua,
137132 BytesVermutlich kann man noch viel mehr Golf spielen, aber hier ist es erstmal:
Codeerklärung und ungolfed:
Edit: Abgehacktes Leerzeichen.
quelle
Jelly , 55 Bytes (nicht konkurrierend?)
Probieren Sie es online!
Wie immer saugt Jelly an Fäden.
quelle
Power ,
8588 Bytes+3 Bytes danke Veskah: Das ist ein guter Punkt.
Probieren Sie es online!
quelle
of *3* to 20 lines inclusive
. Vielen Dank!