Ihre Programme:
Sie schreiben zwei Programme (beide in derselben Sprache). Das Speicherprogramm nimmt eine Zeichenfolge aus STDIN und speichert sie an einem persistenten Ort (siehe unten). Anschließend wird es ohne Fehler beendet. Das Abrufprogramm nimmt keine Eingabe vor, ruft den gespeicherten String ab und druckt ihn an STDOUT aus.
Objektiver Persistenztest:
Sie sollten in der Lage sein, das Speicherprogramm auf Ihrem lokalen Computer auszuführen, den lokalen Computer aus- und wieder einzuschalten und dann das Abrufprogramm auf Ihrem lokalen Computer aufzurufen. Sie können den String so lange aufbewahren, wie Sie möchten (auch im Internet), bis Sie diesen Neustarttest bestanden haben.
Testfälle:
Speicherung und Wiederauffindung:
echo foo | Store
Retrieve
foo
Wiederholte Speicher sollten überschreiben (wie bei einer set () -Methode):
echo foo | Store
echo bar | Store
Retrieve
bar
Wiederholtes Abrufen ist nicht destruktiv (wie eine get () - Methode):
echo foo | Store
Retrieve
foo
Retrieve
foo
Abruf vor jedem Aufruf von Storage:
Sie brauchen sich darüber keine Sorgen zu machen. Ihr Abrufprogramm kann davon ausgehen, dass das Speicherprogramm zu einem bestimmten Zeitpunkt in der Vergangenheit ausgeführt wurde.
Flexibilität bei Ein- und Ausgängen.
Die Leute haben mich gebeten, dies von strengen STDIN / STDOUT auf die Standard-IO-Regeln zu erweitern. Ich kann nicht, weil es zu viele Schlupflöcher einführen würde. Bei einigen Standard-E / A-Optionen ist die Eingabe bereits dauerhaft gespeichert, z. B. "Programme können Eingaben aus einer Datei übernehmen". Ich möchte flexibler sein als nur STDIN und STDOUT, aber ohne die Schleusen zu öffnen.
Aus dem Standard-Thread für E / A-Regeln nehme ich diejenigen heraus, die die Herausforderung nicht brechen:
Programme können Eingaben über GUI-Eingabeaufforderungen und Befehlszeilenaufforderungen vornehmen, wenn Sie dies wünschen
Programme können durch Anzeigen auf dem Bildschirm ausgegeben werden. Dies schließt GUI-Dialoge ein
Programme können Eingaben über Befehlszeilenargumente annehmen
Programme werden möglicherweise in STDERR ausgegeben, können jedoch keine Fehler auslösen.
Wenn Sie eine Alternative verwenden, muss diese benutzerinteraktiv sein. Der Benutzer sollte keine andere Arbeit ausführen müssen, als seine Eingaben in Ihr Programm weiterzuleiten, sie in eine Eingabeaufforderung einzugeben, die Ihr Programm bereitstellt, oder Eingaben als Befehlszeilenargument Ihres Programms einzugeben. Der Benutzer sollte nichts anderes tun müssen, als das Abrufprogramm auszuführen, um die Ausgabe auf dem Bildschirm anzuzeigen oder an STDOUT oder STDERR zu senden.
Zulässige Annahmen:
- Ihre beiden Programme werden im selben Verzeichnis ausgeführt
- Ihre Programme haben Lese- und Schreibrechte für dieses Verzeichnis
- Von Ihnen erstellte Dateien überstehen den Neustart (nicht in einem temporären Verzeichnis)
- Eine abschließende Zeile, die nicht Teil der Zeichenfolge war, ist zulässig. Kein anderes Leerzeichen
echo $@>x
undcat x
gültig?Store
?Antworten:
zsh, 4 Bytes
Store:
>f
(liest aus STDIN und schreibt in eine Datei mit dem Namenf
)Retrieve:
<f
(schreibt den Inhaltf
in STDOUT)quelle
TI-BASIC (Z80), 1 Byte ?
Speichern:
( Geben Sie einfach die Zeichenfolge ein.)
Abrufen:
Ans
(Byte 27)Aber wenn das nicht stimmt:
TI-BASIC (Z80),
76 Bytes-1 danke an Jakob.
Speichern:
Prompt Str0
(Bytes DD AA 09)Abrufen:
disp Str0
(Bytes ED AA 09)quelle
Ans
in dieselbe Variable übernehmen und beibehalten? Ein leeres Speicherprogramm und nurAns
zum Abrufen sollte funktionieren: 1 Byte!Ans
bleibt bestehen. Tatsächlich bleibt eine Menge Zustand bestehen, einschließlich (glaube ich) aller Benutzervariablen, Gleichungen und des Verlaufs. Aus der Sicht des Benutzers entspricht das Ausschalten im Grunde dem TI-Rechner eines Ruhezustands für einen PC, sodass es nicht viel stört.Browser JS, 44 Bytes
Geschäft :
Abrufen :
quelle
prompt()
aus STDIN lesen?prompt()
öffnet eine Warnmeldung, in der Sie aufgefordert werden, Text einzugeben, und gibt das Ergebnis zurück.POSIX-Shell sh / bash / ... 8 Bytes
Geschäft:
bekommen:
quelle
cat
...Python 3 , 46 Bytes
Speicher, 45 Bytes:
Das Abrufprogramm wird mit dem Befehl store erstellt, einer Datei mit dem Namen
f
. ( 1 Byte für den Dateinamen )quelle
input()
?input()
empfängt nur bis zur ersten Zeile.open(0).read
liest alle STDINstore
-Programm liest die Eingabe von STDIN und speichert dann ein Python-Programm, das diese Eingabe drucktf
. Beispiel: STORE wird mit einer Eingabe von aufgerufenabc
. Es schreibt dannprint('abc')
anf
. Wenn Sie jetztf
(RETRIEVE) aufrufen, wirdabc
auf STDOUT gedruckt.Batch, 16 Bytes
quelle
Powershell - 4 Bytes
Lager:
(alternativ auch
sc
)Wiederauffinden
Bearbeiten: Ich habe gerade bemerkt, dass die Ausgabe keine Benutzereingaben zulässt ... also springt sie von 4 auf entweder 6 oder 8 Bytes
Lager:
(alternativ auch
sc f
) für die 8-Byte-Version(und
f
als Pfad angeben ) für die 6-Byte-VersionWiederauffinden
quelle
Rust, 136 Bytes
Speichern (84 Bytes)
Abrufen (52 Byte)
Danksagung
quelle
use std::{io::*,fs::*}
undwrite
stattdessen verwendenstd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
Triggererror[E0658]: use of unstable library feature 'io'
in einem stabilen Rust.chars()
zu Gunsten von veraltet zu seinString::from_utf8(stdin().bytes())
. (Auch ich habe die nächtlichen Dokumente verwendet, nicht sicher, ob das der Schuldige ist)bytes()
oder ausprobiert,chars()
aber keine davon war sehr kurz, weil das Iterator-Element darin eingeschlossen istio::Result
.Bash,
12 1110 BytesGeschäft,
7 65 Bytes# nicht nötigcat ->f
-
, Standard ist stdin# kein Platzbedarf, auchcat >f
>
getrenntabrufen, 5 Bytes
quelle
-
im Speicherprogramm.>f
. Ich bin mir jedoch nicht sicher, ob<f
es für das Lesen gültig ist.>f
funktioniert das soecho '' > f
(Leeren der Datei, falls vorhanden, Erstellen, falls nicht), während<f
es ein No-Op zu sein scheint.HP 49G RPL, 48 Byte
Speichern:
:2: A DUP PURGE STO
26,5 ByteWiederherstellung:
:2: A RCL
21,5 ByteWenn wir in der Pufferbatterie belassen können, erhalten wir:
HP 49G RPL, 0 Byte
Speichern:
0 Bytes
So stellen Sie
Folgendes wieder her:, 0 Byte, da der Stapel beim HP 49G nach einem Neustart unberührt bleibt.
quelle
APL (APLX) , 5 Bytes
Speichern:
⍞⍈1
Abrufen:
⍇1
⍞
Holen Sie sich die Zeile von stdin⍈1
write zur nächsten verfügbaren Komponente der Datei Nummer 1⍇1
Lesen Sie dieerste* letzte Komponente der Datei Nummer 1* Die Dokumentation sagt zuerst, aber das Experimentieren zeigt zuletzt .
quelle
Bash, 10 Bytes (nicht konkurrierend)
Unix-Dateinamen können mit Ausnahme von
NUL
und beliebige Zeichen enthalten/
, und ihre Namen können bis zu 255 Byte lang sein, sodass nur Zeichenfolgen bis zu dieser Länge gespeichert werden können (dies ist eine Einschränkung des Speichermediums). ' in ihnen. Dies ist einer der Gründe, warum dies nicht konkurriert. Ein anderer Grund ist, dass das Verzeichnis, in dem es ausgeführt wird, leer ist (oder dass eine externe Ausgabe vonls
zulässig ist). Ich wollte das immer noch posten, weil es einfach eine coole und nicht offensichtliche Art war, Informationen zu speichern.Eine andere in ähnlicher Weise, die nicht die gleichen Längen- und Zeichenbeschränkungen hätte, wäre:
3533 BytesDies ermöglicht das
/
Zeichen in der Zeichenfolge und unterstützt viel mehr Zeichen (wie viele genau von der Implementierung abhängen).(-2 Bytes dazu dank @Cows quack)
quelle
s/..//
. Das$
ist nicht erforderlich, da alle anderen Zeilen gelöscht werden, sodass dies nur für die letzte Zeile gilt, und das^
kann gelöscht werden, da die Ersetzung nur für die erste Übereinstimmung angewendet wird."$@"
, nicht$@
durch Leerzeichen, immer verbrannt zu vermeiden*
,?
oder~
Zeichen.Python 3, 56 Bytes
Speichern (33 Bytes)
Abrufen (23 Byte)
Druckt mit einem nachgestellten Zeilenumbruch.
quelle
input()
stattopen(0).read()
und auslassenend=
ausprint
?input
nicht verwendet, aber das Weglassenend=
würde dazu führen, dass eine neue Zeile am Ende der Zeichenfolge (dh nicht der ursprünglichen Zeichenfolge) hinzugefügt wird (möglicherweise)input()
?input
gehe ich davon aus, dass die Zeichenfolge Zeilenumbrüche enthalten bestehen bleiben kann.Japt,
4630 Bytes-16 Bytes dank Shaggy .
Eines der ersten Male habe ich versucht, Japt zu verwenden. Die JS-Bewertung kann manchmal zappelig sein. Verwendet den Browser
window.localStorage
.Speichern (16 Bytes)
Abrufen (14 Byte)
quelle
setItem
undgetItem
komplett mitlocalStorage.key
. Wert setzen , Wert abrufenHaskell, 46 Bytes
Speichern (26 Bytes):
Abrufen (20 Byte):
quelle
Rubin (26 Bytes)
Set (16 Bytes)
Get (10 Bytes)
quelle
MATLAB (30 Bytes)
Set (22 Bytes)
Kann durch Ändern von in 4 Byte sparen
input('')
, erfordert jedoch Eingaben in einfachen Anführungszeichen:'input string'
Get (8 Bytes)
quelle
C (GCC) 98 Bytes
Speichern (46 Bytes)
Die Eingabe erfolgt über das erste Befehlszeilenargument.
Abrufen (52 Byte)
Unportabilität
int
.Danksagung
quelle
int
der ein Zeiger enthalten sein kann, damit die implizite Deklaration vonint fopen()
funktioniert. (z. B. die meisten 32-Bit-Systeme, oder verwendengcc -m32
Sie x86-64, um eine 32-Bit-ausführbare Datei zu erstellen .) Übrigens habe ich versucht, Linux-sendfile
undcopy_file_range(2)
Systemaufrufe zu verwenden, aber sie funktionieren nicht mit einem TTY.fputs(fopen())
und zulässtread(open(),buf,-1)
. (Die Frage erlaubt jetzt ein Kommandozeilenargument als Eingabe.)APL (Dyalog Unicode) , 18 Byte
Laden:
⍞⎕NPUT⎕A 1
Online ausprobieren!Abrufen:
⊃⎕NGET⎕A
Probieren Sie es online!⍞
get line from stdin⎕NPUT
fügt es in eine native Datei mit dem Namen "⎕A
Uppercase Alphabet" ein1
und überschreibt, falls die Datei existiert⊃
Der erste Teil (die Daten, die nächsten Teile sind Codierung und Zeilenende-Typ)⎕NGET
der nativen Datei erhält⎕A
das Großbuchstabenquelle
R (27 Bytes)
speichern (21 Bytes)
Laden (6 Bytes)
Damit dies funktioniert, muss das erste Skript mit der Befehlszeilenoption
--save
und das zweite mit aufgerufen werden--restore
(obwohl dies im interaktiven Modus nicht erforderlich ist: Diese Optionen sind die Standardeinstellungen).Dies könnte um 7 Bytes verkürzt werden, wenn nicht ein Fehler in R verhindert, dass das Standardargument
readLine
von im nicht interaktiven Modus arbeitet. Im interaktiven Modus ist dies nicht erforderlich und die Lösung verwendet daher nur 20 Byte .quelle
q
direkt zu verwenden , wobei das erste Programmx=scan(); q("y")
und das zweite Programm entwederx
oder davoncat(x)
abhängen, wie streng wir beim Drucken von Zeichenfolgen sein wollen. Nach den üblichen Codegolfregeln müssen Sie auch Befehlszeilenargumente zählen, also fügen Sie Bytes für--save
und hinzu--restore
(was meine Formulierung nicht benötigt)scan
funktioniert nicht für beliebige Inhalte undscan(w='character')
ist länger alsreadLines()
.q
ist unnötig (q('y')
würde aber nicht funktionieren, man muss es buchstabierenyes
). Ich habe darüber nachgedacht, nurx
das zweite Programm zu verwenden, aber dies würde die Anforderungen verletzen, soweit ich sie verstehe.scan(w="")
, müssen Sie ihn nicht buchstabieren.scan
Dies wird aus der Art des angegebenen Arguments abgeleitet. Bei mir funktioniert q ("y") als sicherungsbedingter Abbruch, aber vielleicht hängt das von Ihrer Version von R ab und möglicherweise davon, ob Sie Rstudio verwenden oder nicht.scan
: Oh, ordentlich, die Dokumentation erwähnt das nicht! Leiderscan
wird immer noch eine Analyse durchgeführt, sodass dies nicht bei allen Eingaben funktioniert. Wie dem auch sei,scan('stdin',w='')
zufällig genau die gleiche Länge wiereadLines('stdin')
.q
: R 3.4.4 sagt “Fehler in q (" y "): nicht erkannter Wert von 'save'”.Java (JDK 10) , 204 Bytes
Warnung: Überschreibt alle Einstellungen, die Java-Programme für Ihren Benutzernamen gespeichert haben!
Speicher, 94 Bytes:
Probieren Sie es online!
110 Bytes abrufen:
Probieren Sie es online!
Dies funktioniert, indem Eingaben als Argument genommen und in dem von java.util.prefs bereitgestellten Backing-Store für Benutzereinstellungen gespeichert werden . Der Stammknoten des Benutzers wird überschrieben, um beim Benennen eines Knotens ein Byte zu sparen. Wenn Sie es zerstörungsfrei testen möchten, führen Sie es entweder mit einem Einweg-Benutzernamen aus oder ändern Sie den Schlüssel von "" in einen Knotennamen.
quelle
z
, sollten Sie es aus den Programmen und dem TIO entfernen. Stellen Sie stattdessen eine Warnung oben in die Übermittlung, um die Leute zu warnen. Auf jeden Fall sollte der TIO über Ihre 94- und 110-Byte-Lösungen verfügen.157 Bytes
Set, 74 Bytes:
Get, 83 Bytes:
-1 Bytes dank VisualMelon
-2 Bytes dank LiefdeWen
quelle
"a",
, und ich bezweifle, dass dies geschlagen wird :)WriteAllLines
und den zweiten Parameter verwendena
Perl 5,
482623 BytesSchreiben Sie 20 + 1 (-n) Bytes
-3 Bytes dank Mob
Da bin ich mir eigentlich nicht sicher, aber es erfüllt die Kriterien. Bei früheren Einsendungen wurden nur die CLI-Optionen gezählt.
Lesen Sie 0 + 2 Bytes
quelle
-ne
mit 1 punkten (es sollte auch einee
haben), aber-pe
mit 2? Sie könnten-E
undsay
anstelle von verwendenprint
.-E
, ich kannte mich damit nicht aus. Was den Grund angeht, warum ich nicht mitgegangen-ne
bin, weil ich für diesen Fall tatsächlich von einer Datei aus laufe. So würde es aussehenperl -n w.pl
Wenn dies geht gegen PCG Community Standards aber kann ich meine Antwort entsprechend bearbeiten.">>","f"
->">>f"
spart 3 charAttache , 23 + 16 = 39 Bytes
Schreibt einfach STDIN in die Datei
A
und liest dann die DateiA
.store.@
:retrieve.@
:Testen
quelle
Lua,
575351 BytesSpeicher, 27 Bytes
Abrufen von 24 Byte
quelle
RUBIN
Speichern (24 Bytes)
Abrufen (16 Byte)
quelle
File.write'a',gets
undp File.read'a'
sind ein bisschen kürzer;)C (Unix / GNU), 23 + 23 = 46 Bytes
Speicher,
2723 BytesAbrufen,
2723 BytesDies schließt die Antwort von jofel in ein C-Programm ein.
Hinweis: Der
dd
Befehl gibt einige Statistiken an ausstderr
, sodass Sie zusätzliche Ausgaben sehen, wenn Sie ihn naiv in der Shell ausführen. Da die Abfrage jedoch nur besagt, dass der gespeicherte String angezeigt werden mussstdout
, nichtstderr
, nehme ich an, dass zusätzliche Ausgabe zulässig iststderr
... Wie auch immer, das Unterdrücken derstderr
Ausgabe ist so einfach wie das Ersetzendd
durchcat
und Erhöhen der Bytezahl von Zwei Programme nacheinander.quelle
int
Rückgabetyp von entfernenmain
. Im alten ANSI C-Stilint
ist dies der Standardrückgabetyp.system()
vonmain()
- autsch verlassen und diese vergessen . Vielen Dank für den Hinweis :-)PHP, 26 + 1 + 21 = 48 Bytes
Store.php:
Laufen Sie mit
echo <input> | php -nF Store.php
.Retrieve.php:
Laufen Sie mit
php -n Retrieve.php
.quelle
C (gcc) ,
7767+ 25 = 92 BytesKompiliert mit nur wenigen Warnungen auf meinem GCC.
store.c
Kann wahrscheinlich Golf spielen, aber ich konnte nicht herausfinden, wie. Segfaults, wenn Sie nichts weitergeben, aber was auch immer.
Peter Cordes: -1
read.c
quelle
int*f=fopen
sollte funktionieren, dh lüge deinem Compiler über den Zeigertyp. Aber nur, wenn Sie für ein 32-Bit-System kompilieren (dh eines, in demint
ein Zeiger enthalten sein kanngcc -m32
, oder nurgcc
für ein 32-Bit-System). Sie können main auch als deklarierenmain(int c,char**v)
oder möglicherweise,int**v
weil Sie nicht dereferenzieren.main(int c,char**v)
funktioniert. Mir wurde auch klar, dass ich das kannfputs(v[1],fopen("f","w")
, obwohl es aus irgendeinem Grund immer noch stdio braucht.int
Rückgabewert auf 32 Bit ab und erweitert ihn durch Vorzeichen als Zeiger. Wenn das zurückgegebeneFILE*
Bit auf den niedrigen 32-Bit-Werten liegt, würde es funktionieren, aber das ist unter x86-64 Linux nicht der Fall.fopen
manuell deklarieren . Gehen der alten Schule mit den Argumenten spart einige Bytes zu:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Batch - 11 Bytes
Die Eingabe wird als Befehlszeilenargument empfangen und bleibt bestehen (mit der Fehlermeldung, die beim Ausführungsversuch erzeugt wird, da CMD versucht, den Parameter auszuführen)
f
.Batch - 7 Bytes (nicht wettbewerbsfähig)
Ein Dateiname enthält eine Vielzahl ungültiger Zeichen, sodass dies bei einigen Zeichenfolgen nicht funktioniert. Auf diese Weise wird jedoch im Wesentlichen ein beliebiges Zeichen in dem durch den Parameter angegebenen Dateinamen gespeichert. Zum Lesen werden nur alle Dateien im Verzeichnis aufgelistet, einschließlich unserer Zeichenfolge.
quelle