yes
, von coreutils, ist 91 Zeilen lang . Viele von ihnen sind Kommentare, aber das ist immer noch WAY zu lang.
Bearbeitung ab September 2019: Die Quelldatei ist in den letzten fünf Jahren gewachsen und umfasst nun 126 Zeilen.
Schreiben Sie ein Programm, das Folgendes imitiert yes
:
- Ausgabe in
stdout
einen unendlichen Strom von "y \ n" - Es muss eine andere Option geben, um den Prozess zu stoppen, als ihn zu beenden
SIGKILL
: aberSIGINT
undSIGPIPE
sind in Ordnung - Sie dürfen weder "y" noch "\ n" oder deren ASCII-Werte (121, 0x79, 0171, 10, 0xA oder 012) verwenden.
Kürzeste Antwort gewinnt.
Bonus:
- Subtrahieren Sie 10 von Ihrer Codelänge, wenn Sie einen Ausdruck erhalten
stdin
und anstelle von "y" ausdrucken können (aber immer noch den Zeilenumbruch enthalten).
code-golf
restricted-source
Ramon Snir
quelle
quelle
y
oder\n
innerhalb eines Zeichenfolgenliterals“?true.c
80 Zeilen lang.yes
Option coreutils verwendet ein optionales Argument in der Befehlszeile, nichtstdin
.y
s selbst eingeben .Antworten:
CJam, 13 Bytes - 10 = 3
Sie müssen hierfür den Java-Interpreter verwenden , da der Online-Interpreter erst nach dem Beenden des Programms zurückgibt.
Sie können das Programm mit SIGINT abbrechen (durch Drücken von Strg-C). Es liest eine Zeile aus STDIN und gibt diese Zeile aus, oder
y
wenn die Eingabe leer war.Erläuterung
Nach der Klarstellung des OP scheint Folgendes genauer zu sein:
Ich werde mit der Aktualisierung der Einreichung warten, bis das OP auf meinen Kommentar antwortet.
quelle
/no/i
, wenn man bedenkt, welche Herausforderung es darstellt.Brainfuck - 38 Bytes
Es werden keine 10 oder 121 verwendet, da
+-<>.,[]
es sowieso alle bedeutungsvollen Zeichen in der Sprache sind, aber es berechnet sie ziemlich naiv (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 =) 10, 10 · 12 + 1 = 121).Dies hängt wahrscheinlich vom Interpreter ab, stirbt aber
^C
auf meinem Rechner ab.Brainfuck - (63-10) = 53
quelle
Python 3, 27 Bytes
Funktioniert mindestens mit CPython und Jython.
SIGINT stoppt es.
quelle
while 1:print`help`[1]
.chr(11**2)
ein paar Zeichen speichern121
.Marbelous 14 Bytes
Dies ist ziemlich einfach, das '/ \' Gerät platziert zwei Kopien links und rechts davon, die rechte wird inkrementiert
++
und fällt dann von der Platine und wird gedruckt. Das]]
Gerät schiebt eine beliebige Kugel nach rechts, wenn STDIN leer ist, lässt jedoch das erste Byte von STDIN nach unten fallen, wenn dies nicht der Fall ist. Dies wird dann das!!
Gerät auslösen , das die Karte verlässt. Dies wird also y \ n drucken, bis Sie etwas auf stdin eingeben.Dies funktioniert nur im Python-Interpreter.
quelle
Pyth,
1096 Bytes - 10 =0-1-4Ich habe seit Ewigkeiten versucht, eine zu finden, mit der ich zufrieden bin. Grundsätzlich konvertiert zu:
quelle
#
Funktionalität wieW1
undePG
ist ein viel kürzerer Weg, um den Charakter zu bekommeny
alsC^hT2
.C #,
817876 BytesKann nicht mit den anderen Sprachen konkurrieren, aber hier ist es trotzdem:
Kann mit SIGINT durch Drücken von Ctrl+ getötet werden C.
Kein Bonus, weil es mehr als 10 Bytes dauern würde, um es zu bekommen.
quelle
while(1)
? Speichert zwei Zeichen.for(;;)
sollte funktionieren.y
. Bitte prüfen SieSystem
.System
kann nicht entfernt werden. Dies ist der oberste Namespace in .NET Framework. Alle Klassen / andere Namespaces sind darin enthalten. Daher kann hier keine Reflexion hilfreich sein. Aber nicht sicher, ob es ungültig ist. Siehe Ramons Kommentar: "Nichts, das mit y oder \ n bewertet wird". Dies wird nicht bewertety
. Ich hinterlasse einen Kommentar zu der Frage, ob dies gültig ist.Java, 178
Drucken erfordert
System
, aber dasy
Zeichen ist verboten. Daher musste ich Reflexion verwenden.quelle
;
indem Sie eschar c='x'+1;
in diefor
Loop-Deklarationfor(char c='x'+1;;)
Perl: 18 Bytes - 10 = 8
Die Zeichenfolge stammt von STDIN.
quelle
y\n
Wird wiederholt gedruckt, wenn keine Eingabe von STDIN empfangen wird? Wenn nicht, dann ahmt es nicht richtig nachyes
.yes
nimmt keine Eingabe vonSTDIN
immerhin :)y\n
.Ruby,
302318 BytesKann mit SIGINT durch Drücken von Ctrl+ getötet werden C.
Dank an manatwork für das Teilen von Verbesserungen!
quelle
loop{puts [*?x..?z][1]}
- 23 Zeichen,loop{puts ?x.succ}
- 18 ZeichenPerl, 26 Bytes
Benutzerdefinierte Eingabe von Argument (wie
yes
tatsächlich funktioniert), 22 Bytes-10 = 12Benutzerdefinierte Eingabe von stdin, 22 Byte - 10 = 12
quelle
C
6455534540 - 10 = 30main(int c,int**a){for(;;)puts(a[c>1]);}
Ich bin nicht sehr glücklich damit, da es erfordert, dass das Programm "y" heißt und nur mit "y" aufgerufen wird, also muss es in $ PATH sein, aber hey, erster Codegolf :)
Alternative:
C, 30 (+ 1 Dateiname)
main(){for(;;)puts(__FILE__);}
Mit der gleichen Technik wie mein geschätzter Kollege @Matt Windsor
quelle
Linux Bash, 33-10 = 23
Kann mit SIGINT durch Drücken von Ctrl+ getötet werden C.
quelle
yes
nurcat
Programme.read a;for((;;));{ echo $a;}
Rust, 52 Zeichen
Es gibt anscheinend keine
y
gute Art zu rechnen, ohne in Rust frech zu sein - sie haben es zu gut gemacht, Zeichen sicher zu tun. ICH:println!
, daher sind dort keine Tricks zulässig.'x'
, da in Rust Zeichen keine Zahlen sind;Es lohnt sich auch nicht für den Code-Bonus, denn das Lesen von
stdin
würde eine Fehlerbehandlung = 3 erfordernEin Großteil der Codeverkürzungen, die ich finden konnte, war darauf zurückzuführen, dass ich in der Compiler-Umgebung zunehmend gegen Regeln verstieß:
Rust, 44 Zeichen (+ mindestens 1 Zeichen für Dateiname)
Veraltet von unten. Dieser zählt wahrscheinlich nicht, da der Name der Quelldatei damit beginnen muss
y
.Edit: Rust, 36 Zeichen (35 Quellen, 1 Dateiname)
Wie oben, aber die Datei muss aufgerufen werden
y
(nichty.rs
,y
). Humorvoll überschreibt Rust die Quelle mit der Binärdatei! Zumindest auf meinem Rechner funktioniert die Binärdatei danach jedoch.Rust, 37 Zeichen (+ Äquivalent zu
env K='y'
auf Ihrer Plattform)Dieser ist sogar noch schlimmer: die Umgebungsvariable einstellen müssen ,
K
umy
bei der Kompilierung .Bearbeiten : Wenn Sie setzen
K
aufy\n
, könnten Sie die Drop -ln
inprintln!
, für eine Gesamtsumme von35 Zeichen undmehrere facepalms:quelle
x
in einer Weise hinzufügen , aber es ist immer noch nicht kurz:(b'x' + 1) as char
Linux Bash - 19 Bytes
Dies ist wahrscheinlich ein Betrug und kann fehlschlagen, wenn Sie nicht über / usr / bin / yes oder ein / usr / bin / xes oder / usr / bin / zes verfügen:
Ich denke, es erfüllt die Anforderungen, obwohl es möglicherweise gegen die Regel "Nichts, das als y bewertet wird" verstößt. Und vielleicht verstößt das Nachahmen
yes
durch Laufenyes
gegen die Regeln.Dies könnte ein wenig optimiert werden (obwohl es weniger wahrscheinlich ist, dass es funktioniert), um es auf 11 Bytes zu reduzieren:
Ich konnte nicht herausfinden, wie ich den 10-Punkte-Bonus erhalten konnte, indem ich eine Zeichenfolge aus stdin las, ohne dem Code mehr als 10 Bytes hinzuzufügen
quelle
/*/*/?es `line`
oder/*/*/?es `head -n1`
wenn Sie nicht haben/usr/bin/line
.sed q
fürline
.dc, 12
Nur Ausgänge
y\n
. Liest nicht von stdin, also kein Bonus.30986 ist 0x790A (dh "y \ n"). Der
P
Befehl konvertiert einfach die Zahl in Basis 256 und gibt das entsprechende Zeichen für jede Basis 256-Stelle aus.quelle
y\n
?P
, wusste aber nicht, dass es mehr als einen Charakter gleichzeitig kann.Common Lisp: (30-10) = 20
(read)
aus dem Eingabestream(format t ... )
format
Argumente (nur eines hier):~@{ ... ~}
innerhalb der Schleife für jedes Argument:
~A
gefolgt von einem Zeilenumbruch~%
~:*
(Endlosschleife)Sie können die Schleife mit unterbrechen Ctrl+C, was bei Neustartoptionen einen Fehler signalisiert (Fortfahren / Abbrechen).
quelle
Haskell, 29 Bytes
Ich glaube, das wird von beiden
SIGINT
und gestopptSIGPIPE
.quelle
'\89'
statt verwendensucc 'x'
Ruby, 27 Bytes - 10 = 17
Es ist nur @ ProgramFOXs Lösung mit dem Bonus (es dauerte 9 Bytes, um die Bonusfrage zu lösen).
quelle
Gleichstrom, 21 Bytes - 10 = 11
Beachten Sie, dass die Eingabe eingeschlossen werden muss
[]
, z. B.[no]
weil dies?
die einzige Möglichkeit ist, Eingaben zu übernehmen, die sie alsdc
Code ausführen .quelle
C2
anstelle von verwenden122
. In der Tat würde ich argumentieren, dass ersetzt werden122 1-
könnte,C1
wieC1
in der Frage nicht ausdrücklich verbotenCommodore 64 Basic:
1413 BytesWie üblich habe ich in PETSCII Zeichen ersetzt, die in Unicode nicht vorhanden sind.
|
wird verwendet, um darzustellenSHIFT+H
, während╭
darstelltSHIFT+U
. Beachten Sie, dass dies ASCII-Zeichen "y" (Byte-Wert 121) anstelle eines Zeichens ausgibt, das im Standard-Commodore-Zeichensatz als "y" angezeigt wird.BASIC ist angeblich eine leicht zu erlernende Programmiersprache in englischer Sprache. Wenn Sie die Tastenkombinationen verwenden, die in vielen frühen Dialekten enthalten sind, erhalten Sie etwas, das kürzer und weniger lesbar ist als Perl.
BEARBEITEN : Im "Shifted Mode" werden diese zwei Bytes kürzer, da Kleinbuchstaben "y" mit dem Dezimalwert 89 codiert sind. Die Verwendung eines Nicht-ASCII-Zeichensatzes zur Umgehung der Regel "Die ASCII-Werte dürfen nicht verwendet werden" kann sein Schummeln.
quelle
SHIFT+H
, aber das Pipe-Zeichen ist einfacher zu tippen. Es gibt nichts zu den „Linien auf der oberen und linken Ränder“ erzeugt entsprechend durch `SHIFT + O“.AWK, 38 Bytes
Variante, die den String auf stdin liest: 14 bytes-10 = 4
Aber da es nicht beides kann (kehren Sie zu "y" zurück, wenn kein stdin angegeben ist), bin ich mir nicht sicher, ob es zählt ...: o)
Beide können mit Strg + C verlassen werden.
quelle
Spaltung , 5 Bytes
Dies ist ziemlich wettbewerbsfähig für Fission. :)
Der Kontrollfluss beginnt mit einem
(1,0)
rechtsgerichteten Atom beiR
.x
setzt die Masse auf120
und+
erhöht sie, um zu geben(121,0)
. Dann!
druckt das entsprechende Zeichen (y
) undN
druckt eine neue Zeile. Der Quellcode wird an den Rändern herumgewickelt, so dass das AtomR
erneut durchläuft (was jetzt nichts mehr macht),x
die Masse auf120
erneut setzt, sie+
inkrementiert und so weiter und so fort ...quelle
C 32 Bytes
Benötigt Little-Endian-Maschine und Kompilierung mit -O2 (um Stapelüberlauf zu vermeiden).
quelle
PowerShell, 27 - 10 = 17
Funktioniert möglicherweise nicht in Pash. Eine robustere Alternative sollte sein
quelle
Lua, 42 Bytes - 10 = 32
Lua, 49 Bytes - 10 = 39
Beide wurden mit Lua 5.1.4 getestet und können mit SIGINT ( Ctrl+ C) getötet werden.
quelle
Perl, 31
Hier ist eine Perl-Version, die sich tatsächlich wie GNU verhält
yes
, soweit ich das beurteilen kann:Dies funktioniert, wenn es in Ordnung ist, die Befehlszeilenoptionen von Perl (
-l
für die neue Zeile) zu verwenden, da es sonst 3 Zeichen länger werden würde:quelle
-l
(nicht-e
) der Schalter für die neue Zeile.CAPL 1.5+; 6 ohne Eingabe; 10 - 10 = 0 bei Eingabe
Nebenbemerkung
Ich habe irgendwo gelesen, dass benutzerdefinierte Sprachen in Golffragen nicht zulässig sind, da sie integrierte Funktionen enthalten können, die genau das tun, was die Frage stellt. Ich habe jedoch CAPL entwickelt, um das Golfspiel im Allgemeinen zu vereinfachen . Wenn Sie denken, dass dies hier nicht erlaubt ist, lassen Sie es mich wissen!
Ich habe einige Ideen von > <> und Befunge (Sie können zwischen den Zeilen wechseln und hexadezimale Zeichen verwenden, um Zahlen zu drücken), einige von Ruby und einige von mir, um das Golfen zu vereinfachen.
CAPL liest von links nach rechts und geht am Ende der Zeile eine Zeile nach unten. Wenn es sich um die letzte Zeile handelt, wird das Programm beendet.
Da diese Sprache noch niemand kennt, werde ich versuchen, so viel wie möglich zu erklären.
Y ausgeben. 6 Bytes
bb*.n<
bb*
b
ist hexadezimal für11
, alsobb*
ist11*11
=121
, was das UTF-8-Äquivalent von isty
. Dieser Wert wird in den Stack verschoben..
Öffnet den obersten Wert des Stapels und gibt ihn als UTF-8 aus. Wie121
oben auf dem Stapel wird der Index hier ignoriert.n
Ausgabe einer neuen Zeile<
Sendet den Zeiger an den Zeilenanfang und wiederholt diese Zeile. Da wir keine Eingabe erwarten, können wir dies sicher tun, ohne erneut nach der Eingabe zu fragen.Ausgabe von der Eingabe. 10 Bytes, 0 nach Bonus
i~a&{X:.)}
i
Nimmt Eingaben vom Benutzer entgegen, drückt als UTF-8 oben auf den Stapel und drückt die Länge danach. Das heißt, es wird[72,101,108,108,111,5]
~
eine Zahl aus dem Stapel entfernt und dann die Anzahl der Bytes umgekehrt. Das heißt,[111,108,108,101,72]
a
hexadezimal für10
das Newline-Zeichen.&{...}
Erstellt eine Endlosschleife. Wir haben Eingaben, daher können wir den Zeiger nicht zurück in die Zeile senden. Ich könnte die Funktion in der Zeile darunter platzieren, was mir ein Byte ersparen würde, aber Zeilenumbrüche sind in dieser Herausforderung nicht zulässig.X
Entfernt den obersten Wert vom Stapel (Der Index aus der Schleife).:.
Dupliziert den obersten Wert und gibt ihn als UTF-8 aus.)
Dreht den Stapel nach rechts. ([1,2,3,4,5]
->[5,1,2,3,4]
)Dies bedeutet jedoch, dass wir mit einer neuen Zeile beginnen und dann die Eingabe, dann eine neue Zeile, dann die Eingabe usw. ausgeben. Wenn wir nicht mit einer neuen Zeile beginnen dürfen, verwenden Sie nach dem Subtrahieren den folgenden Code mit 12 Bytes oder 2 der Bonus.
iXa#~&{X:.)}
Der einzige neue Befehl hier ist
#
, der die Anzahl der Elemente auf dem Stapel auf den Stapel schiebt.Ich habe die Länge von entfernt
i
, da das Hinzufügen von 1 und das Austauschen mit der neuen Zeile länger ist als das Entfernen und erneute Abrufen der Länge.Nur zum Spaß gibt es hier ein "Hello World" -Programm
Die
?!
Bedienung ist die gleiche wie bei> <>quelle
APL (Dyalog APL) , 5 - 10 = -5 Bytes
Warnung: stützt sich auf eine undokumentierte und nicht unterstützte Funktion / einen nicht unterstützten Fehler.
Leere STDIN druckt leere Zeilen (nicht „y“), die erlaubt ist , und vorgeschlagen worden .
Probieren Sie es online!
⎕
STDOUT mit nachgestellten Zeilenumbrüchen,←
bekommt⍣
wiederholt bis≢
es unterscheidet sich von⍞
STDINdh niemals, aber unterbrechungsfrei durch Anhalten des Threads.
quelle
⍣
bei der Zuweisung←
, obwohl←
es sich nicht um eine eigentliche Funktion handelt und daher nicht wirklich als Operand in Frage kommt. Funktioniert noch ...> <>, 6 Bytes
Wenn Sie
;
am Ende kein "a " einfügen , schwimmt das " > <>" so lange weiter, bis es von einem "SIGINT" freigegeben wird.Erläuterung
> <>, 17 - 10 = 7 Bytes
Die vorherige ist eine ziemlich langweilige Lösung, hier ist eine, die Eingaben von stdin nimmt. Dies missbraucht die Tatsache, dass die Standardmethode zum Bereitstellen von Eingaben für ein > <> -Programm darin besteht
echo 'input' | fish.py yes.fish
,echo
das\n
Zeichen bereitzustellen.Erläuterung
Am
0r
Ende kann die Schleife durch Umwickeln entstehen, wobei wir immer noch davon ausgehen, dass der Stapel mit einem-1
Oben umgedreht wird .quelle
Anscheinend ist das nicht ganz portabel. Meins
sys.version
ist , also wenn deins anders ist2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2]
, funktioniert das wahrscheinlich nicht.Python 2 - (76-10) = 66
Ziemlich lang, aber ich wollte den Bonus bekommen (obwohl er mehr als 10 Bytes kostete). Offenbar ist es lang, zu prüfen, ob stdin leer ist oder nicht, ohne zur Eingabe aufzufordern.
Zuerst habe ich den Bonus falsch verstanden, weil ich ein Argument anstelle von stdin genommen habe. Ich bin stolz auf meine Lösung dafür, also poste ich sie trotzdem;)
Python 2 - (52-10 + ∞) = ∞ (ungültig!)
sys.argv
ist eine Liste, in der das nullte Element der Dateiname ist und jedes Element afterwords ein Argument für das Programm ist. Ich füge am Ende der Liste einen Falsey-Wert hinzu. Wenn es keine Argumente gibt, ist das erste Element dieser falsche Wert, andernfalls ist es das erste Argument.a or b
in Python wird der erste Wert zurückgegeben, der bestätigt, wie das Ergebnisa
aussehen wird: Wenn es wahr ist, wissen wir bereits, dass das Ganze wahr sein wird, sodass es nur zurückgegeben wird. Wenn es falsch ist,b
wird zurückgegeben (seitFalse or b
==b
).quelle
y\n
wenn stdin leer ist.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 Zeicheny
, die zweite auch.