Wenn Sie mit Hackertyper nicht vertraut sind, lesen Sie hackertyper.net . Kurz gesagt, es ist ein Programm, das einen Teil einer Codebasis pro Tastendruck für komödiantische Effekte ausgibt. ABER die hackertyper.net Version ist viel zu einfach zu implementieren. Es werden einfach drei Zeichen gleichzeitig aus einem beliebigen Code ausgegeben. Für diese Herausforderung muss ein Programm seinen eigenen Quellcode ausgeben und einen durch Leerzeichen getrennten Codeabschnitt pro Tastendruck drucken .
Einzelheiten
- Man kann einen Dateinamen für das Programm nicht hart codieren; es muss seinen Namen dynamisch bestimmen. Wenn das Programm zu einer ausführbaren Datei kompiliert, hängt es möglicherweise die Standarddateierweiterung an den Namen der ausführbaren Datei an (mit Ausnahme der EXE-Datei, wenn Windows verwendet wird) und geht davon aus, dass sich die Quelldatei im Verzeichnis der ausführbaren Datei befindet. Wenn eine ausführbare C-Datei beispielsweise "hacker" heißt, sollte sie ihren Quellcode aus einer Datei mit dem Namen "hacker.c" in demselben Verzeichnis abrufen. Wenn ein kompiliertes Programm eine Erweiterung hat, sollte diese gelöscht werden, bevor der Name seines Quellcodes ermittelt wird ("typer.exe" -> "typer.cs").
- Programme müssen mindestens 5 Leerzeichen enthalten, wobei zwischen jedem Leerzeichen mindestens ein Zeichen stehen muss. Dies bedeutet, dass die kleinstmögliche Größe für diese Herausforderung 9 Byte beträgt. Die Räume müssen nicht entscheidend für das Funktionieren des Programms sein.
- Alle Formatierungen (Einrückungen, neue Zeilen usw.) müssen in der Ausgabe beibehalten werden. Diese Formatierung kann entweder mit dem Code gedruckt werden, der darauf folgt, oder es kommt darauf an, dass die Formatierung beibehalten wird.
- Verwenden Sie keine Kommentare, um die 5 Speicherplatzanforderungen zu erfüllen, es sei denn, es gibt keine andere Möglichkeit, die Leerzeichen in der Sprache Ihrer Wahl zu implementieren.
BEARBEITEN : Neue Zeilen können anstelle von oder zusätzlich zu Leerzeichen als Blocktrennzeichen verwendet werden.
Antworten:
Bash, 51
58quelle
2: read: Illegal option -s
)cat $0
und tildes mit$(<$0)
IFS=\
eigentlich benötigt, wenn man den shebang weglässt? Standard-IFS ist so etwas wieIFS=$'\n\t '
, und da Sie keinen Zeilenumbruch mehr haben, müssen Sie ihn meines Erachtens nicht auf Leerzeichen beschränken.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML & JavaScript, 123
Dies funktioniert ähnlich wie bei Hacker Typer, jedoch mit einem eigenen Quellcode. Lassen Sie mich wissen, wenn ich die Regeln missverstanden habe.
Und hier ist eine gestaltete Version (170 Zeichen):
Ich habe eine Demo gemacht . Es wurde geändert, weil JS Bin viel zusätzlichen Code hinzufügt, aber die allgemeine Idee ist dieselbe.
quelle
<head>
habe den Grund angegeben, dass der Browser ihn hinzufügt, wenn er nicht vorhanden ist, sodass er immer angezeigt wird. Ich habe es jedoch vergessen<html>
.Perl + Term :: ReadKey, 56 Byte
Vielen Dank an ThisSuitIsBlackNot für die ursprüngliche Inspiration und an primo für die Anregung
open 0
und<0>
.Beachten Sie, dass die Zeile danach
for
eigentlich nicht erforderlich ist, außer dass ich irgendwo eine zusätzliche Zeile einfügen muss , um die Anzahl der Leerzeichen auf das angegebene Minimum von fünf zu erhöhen .Beachten Sie auch, dass dieses Programm wie ThisSuitIsBlackNot das Modul Term :: ReadKey von CPAN benötigt. Unter Debian / Ubuntu Linux kann dieses Modul, falls es noch nicht vorhanden ist, einfach mit dem Befehl installiert werden
sudo apt-get install libterm-readkey-perl
.Um einige Zeichen zu speichern, stellt dieses Programm den Eingabemodus beim Beenden nicht auf den normalen Wert zurück, sodass Sie möglicherweise nicht sehen können, was Sie danach eingeben. Ausführen des Shell-Befehls
stty sane
oderreset
sollte das beheben. Dieses Problem konnte auf Kosten von 10 zusätzlichen Bytes behoben werden mit:Bonus: Pure Quine, 81 Bytes
Auch hier wird der Zeilenumbruch nach dem Komma nur benötigt, um das Minimum von fünf Leerzeichen zu erreichen.
Im Gegensatz zum obigen 56-Byte-Programm muss diese Version keinen eigenen Quellcode lesen, da sie auf einem Quine basiert - speziell auf diesem Quine:
Das Schöne an dieser Quine ist, dass sie problemlos eine beliebige "Nutzlast" innerhalb des
q{ }
Blocks transportieren kann, ohne sie wiederholen zu müssen. Es ist zwar nicht ganz kurz zu schlagen<0>
, aber es kommt ziemlich nahe.Hinweis: Dieses Programm verwendet die Perl 5.10+
say
-Funktion und muss daher mit der Befehlszeilenoption-M5.010
(oder-E
) aufgerufen werden. Gemäß dem bestehenden Metakonsens zählen solche Schalter, die zur Aktivierung moderner Sprachfunktionen verwendet werden, nicht als zusätzliche Zeichen . Die kürzeste Lösung, die ich finden kann,say
ist 83 Bytes:Beide können auch terminalfreundlicher gestaltet werden, indem Sie (die letzten beiden Zeilen verbinden und) Folgendes einfügen:
vor dem letzten
}
.quelle
stty sane
anstatt zu schreibenreset
(was auf einigen Betriebssystemen manchmal etwas mehr als nur das Zurücksetzen einiger Terminalparameter sein könnte ^^)open F,$0
und<F>
könnte durchopen 0
und ersetzt werden<0>
. Außerdem würde ich argumentieren, dass ein Beitrag in Meta nicht wirklich einen Konsens darstellt. Die Option-M5.01
nicht „bringt die Sprache zu einem bestimmten Punkt“ , wie der Autor sagt, es ermöglicht Funktionen. Es gibt keine Perl-Version, für die diese Funktionen standardmäßig aktiviert sind.ruby golfscript.rb foo.gs
ein gültiger Befehl zum Ausführen eines in GolfScript geschriebenen Programmsperl -M5.010 foo.pl
als gültiger Befehl zum Ausführen eines in "Perl 5.10" geschriebenen Programms gelten. Aber solche Argumente gehören wirklich zum Meta, nicht zum Meta hier.)Python 3 - 124 Bytes - 7 Leerzeichen
Code:
Ungolfed:
Gestaltete Version:
quelle
Ruby,
85, 71Schade, dass
IO#raw
das nicht Teil der Standardbibliothek ist.Verbesserung
Dieser beseitigt den Aufruf von Kernel # exit und verwendet globale Variablen, um den Code zu verkürzen.
quelle
Befunge - 21
Ich bin ziemlich zufrieden damit, wie ich gerade über Befunge herausgefunden habe. Wenn es Ihnen nichts ausmacht, in ein Popup-Fenster zu "tippen", können Sie es hier oder hier ausführen, bis ich einen besseren Online-Dolmetscher finde.
quelle
Powershell, 89
quelle
Python 3 - 299
Es ist ein Quine. Verkürzt von 507 durch Verwenden
exec
und Verschieben einiger Anweisungen.quelle
C
211186 BytesMeine Lösung in C mit der Curses-Bibliothek. Es kann länger sein als die andere C-Lösung, aber es ist eine Quine. Obwohl von der Frage nicht verlangt, ist es immer noch ziemlich nett. Es funktioniert auch ganz gut:
Eine lesbarere Version mit einigen Kommentaren und Sachen:
kompilieren mit:
quelle
C -
136 135132 Bytes (nur Windows)Hinweis: Am Ende des Programms befindet sich ein Leerzeichen, das wahrscheinlich nicht angezeigt wird.
Ich kann nicht garantieren, dass dieses Programm auf einem anderen Computer als meinem funktioniert, da es furchtbar hackig ist. Früher wäre es viel einfacher gewesen, wenn alle nur 32-Bit-Computer hatten. Dann brauche ich mir keine Sorgen um
sizeof(int*)
8 zu machen (was es definitiv ist; ich habe es ausgedruckt, um sicherzugehen), währendsizeof(int)
es 4 ist.Glücklicherweise wird der Name der ausführbaren Datei in der ersten Zeichenfolge in argv gespeichert.
Das Setzen eines Zeigers als Argument für eine Funktion bedeutet jedoch, dass ich den Typ ALLER Argumente für die Funktion explizit angeben muss - was bedeutet, dass ichZum Glück habe ich einen Workaround gefunden. Ich hatte das zweite Argument, main,int
zweimal eingeben müsste -, was eine enorme Zeichenverschwendung darstellt.q
nur ein weiteres int. Zu sein. Die Zuweisungq
zu einer Variablen vom Typ hat es dannint**
irgendwie geschafft, alle erforderlichen Bytes vom Stapel zu holen.Es gelang mir nicht, solche Tricks zu finden, um den Rückgabetyp von
fopen
als Zeiger zu interpretieren, ohne die Funktion zu deklarieren.Edit: Bemerkt sollte ich
~fscanf(*v,"%s",b)
statt verwenden,fscanf(*v,"%s",b)>0
da die Rückgabe -1 ist, wenn EOF erreicht ist.quelle
void **v;
) zu deklarieren, anstatt einen Prototyp zu erstellenfopen()
.fopen
. Ich verstehe nicht, warum das Ersetzen von int durch void einen Unterschied machen sollte, da alle Zeiger sowieso die gleiche Größe haben.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(ich hatte als Ersatzgetchar()
fürgetch()
though).*fopen()
statt*fopen(a,b)
?Perl - 87 Bytes
Ich habe in den Regeln nichts darüber gesehen, was zu tun ist, wenn die Datei bis zum Ende gelesen wurde, und sie wartet einfach auf Eingaben, nachdem der letzte Block gedruckt wurde.
quelle
node.js mit LiveScript:
asynchrone Version:
quelle
Cobra - 147
CobraCore.exePath
ist so nützlich!quelle
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Beide 274 :
Ungolfed (Chrom):
Hat zwei Versionen, da Chrome die Pfeilfunktion nicht unterstützt und die Konsole nicht mit derselben Methode gelöscht wird
Der Firefox arbeitet mit Firebug, anscheinend kann die Standard-Entwicklerkonsole nicht aus einem Skript gelöscht werden.
quelle
Groovy - 379
Da es
getch()
in Java und Java-ähnlichen Sprachen wie Groovy kein oder ein gleichwertiges Programm gibt, kann mein Code Tastendrücke nicht verarbeiten. Das ist alles: Dquelle
C 248 Zeichen
Wahres Quine
Funktioniert nur unter Unix, unter Windows würde es mit _getch implementiert.
quelle
HTML und Javascript, 232 Bytes
Das traditionelle Javascript quine, aber modifiziert.
JSFiddle hier .
quelle
SmileBASIC,
7975 BytesEs ist sehr einfach, eine bestimmte Zeile eines Programms in SmileBASIC abzurufen, daher setze ich die Leerzeichen vor jedem Zeilenumbruch.Ich fand es so clever, die Leerzeichen vor jeden Zeilenumbruch zu setzen, aber anscheinend dürfen wir Zeilenumbrüche anstelle von Leerzeichen verwenden ...Erläuterung:
quelle
Haskell
quelle