Kürzester Code in Ihrer Sprache, um eine Zeichenfolge während eines Neustarts beizubehalten

48

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:

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

Dies ist Code-Golf, und Ihre Punktzahl ist die Summe der Bytes aus beiden Programmen.

Jared K
quelle
9
so gerecht echo $@>xund cat xgültig?
Adám
1
Ihre Spezifikation erwähnt nicht die Möglichkeit, mehrere Male zu speichern, aber Sie haben einen Beispielfall, der dies tut. Dürfen wir für jeden Aufruf von eine saubere Umgebung annehmen Store?
Adám
4
@EriktheOutgolfer Warum sollte es nicht gültig sein? Selbst wenn auf Meta eine Lücke diskutiert wird, die eine Herausforderung nicht daran hindert, sie ausdrücklich zuzulassen.
Dylnan
6
Bei Web-Beschränkungen geht es in der Regel darum, Dinge aus dem Web herauszuholen, um nicht mehr an der Erstellung dieser Dinge beteiligt zu sein. In diesem Fall, wenn es im Web ist, liegt es daran, dass Sie die Arbeit gemacht haben, es dort zu platzieren.
Jared K
3
Jemand muss eine Antwort für einen Computer mit Magnetkernspeicher schreiben.
Mark

Antworten:

88

zsh, 4 Bytes

Store: >f(liest aus STDIN und schreibt in eine Datei mit dem Namen f)
Retrieve: <f(schreibt den Inhalt fin STDOUT)

Türknauf
quelle
8
Ich denke, wir haben einen Gewinner.
Adám
@ Adám, es sei denn, es gibt ein Token zum Schreiben von Eingaben in eine Datei in 1 Byte: P
FreezePhoenix
1
@FreezePhoenix Es gibt wahrscheinlich keine, es sei denn, Sie schreiben jetzt eine neue Sprache, die nicht erlaubt ist ...
Chrom
4
@ Chromium Check Z80 Antwort: Einige vorhandene Sprachen können aus einem 0-Byte-Programm schreiben.
Cœur
55

TI-BASIC (Z80), 1 Byte ?

Speichern:  ( Geben Sie einfach die Zeichenfolge ein.)
Abrufen: Ans(Byte 27)

Aber wenn das nicht stimmt:

TI-BASIC (Z80), 7 6 Bytes

-1 danke an Jakob.

Speichern: Prompt Str0(Bytes DD AA 09)
Abrufen: disp Str0(Bytes ED AA 09)

Adam
quelle
1
Sind Sie sicher, dass das 5 Bytes sind?
FreezePhoenix
6
@FreezePhoenix TI-Basic verwendet Token.
Adám
3
Hmm ... Warum nicht Eingaben Ansin dieselbe Variable übernehmen und beibehalten? Ein leeres Speicherprogramm und nur Anszum Abrufen sollte funktionieren: 1 Byte!
Jakob
9
@ Arthur Yep, Ansbleibt 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.
Jakob
2
@JaredK Ich stimme definitiv zu, dass die 1-Byte-Lösung nach Regelmissbrauch riecht (obwohl ich derjenige war, der dies vorgeschlagen hat). Ich würde jedoch sagen, dass das Speicherprogramm beendet wird, da andere Programme danach ausgeführt werden können (obwohl sie den Betrieb der Lösung beeinträchtigen). Meine Interpretation Ihres "objektiven Persistenztests" war, dass die Programme direkt vor und nach dem Aus- und Einschalten ausgeführt werden. Wenn dies nicht der Fall ist, müssen Sie die 1-Byte-Lösung möglicherweise als nicht konkurrierend markieren.
Jakob
23

Browser JS, 44 Bytes

Geschäft :

localStorage.a=prompt()

Abrufen :

alert(localStorage.a)
Esolanging Fruit
quelle
Wird prompt()aus STDIN lesen?
Pipe
9
Hat ein grafischer Webbrowser eine STDIN? Nein prompt()öffnet eine Warnmeldung, in der Sie aufgefordert werden, Text einzugeben, und gibt das Ergebnis zurück.
Dev
5
@Dev Natürlich hat ein grafischer Webbrowser wie jeder andere Prozess eine STDIN. Wenn Sie es in einer bestimmten Sprache nicht verwenden können, ist dies eine andere Frage, und wenn die Antwort "Nein" lautet, kann ich sie möglicherweise für diese Herausforderung verwenden.
Pipe
5
@Dev Die Standard-E / A-Methoden umfassen die Eingabe über die GUI-Eingabeaufforderung und die Ausgabe über die GUI-Anzeige . Sofern OP nicht dazu gedacht ist, den Standard zu überschreiben, sollte dies gültig sein. Ich werde es klären.
Esolanging Fruit
2
Ich habe die Herausforderung bearbeitet, um mehr E / A zuzulassen, aber ich erweitere sie nur auf eine begrenzte Teilmenge der Standard-E / A-Methoden. Diese Antwort befindet sich jedoch in meiner Untergruppe. Ich mag das.
Jared K
19

POSIX-Shell sh / bash / ... 8 Bytes

Geschäft:

dd>f

bekommen:

dd<f
Jofel
quelle
2
Schön, schlägt sogar cat...
cmaster
12

Python 3 , 46 Bytes

Speicher, 45 Bytes:

open(*'fw').write('print(%r)'%open(0).read())

Das Abrufprogramm wird mit dem Befehl store erstellt, einer Datei mit dem Namen f. ( 1 Byte für den Dateinamen )

ovs
quelle
2
Sicher können Sie verwenden input()?
Artemis Fowl
@ArtemisFowl input()empfängt nur bis zur ersten Zeile. open(0).readliest alle STDIN
Jo King
Sie haben wahrscheinlich gepostet, als die Dinge noch nicht eindeutig waren, aber diese Antwort im Ist-Zustand entspricht nicht der aktuellen Spezifikation. Ich wollte ursprünglich, dass die STDIN / STDOUT-Anforderung streng ist, wobei die Standardeinstellungen nicht zulässig sind. Ich habe es erweitert, aber nur auf eine Teilmenge der Standardeinstellungen. Ihr Abrufprogramm muss die Ausgabe weiterhin auf dem Bildschirm anzeigen, wenn es STDOUT nicht verwendet. Wenn ich die vollständigen Standardeinstellungen zulasse, lautet die Lösung für jede Sprache "Eingaben in eine Datei", "Ausgabe in eine Datei", null Byte.
Jared K
@JaredK Ich glaube du verstehst nicht so recht, wie das funktioniert. Das store-Programm liest die Eingabe von STDIN und speichert dann ein Python-Programm, das diese Eingabe druckt f. Beispiel: STORE wird mit einer Eingabe von aufgerufen abc. Es schreibt dann print('abc')an f. Wenn Sie jetzt f(RETRIEVE) aufrufen, wird abcauf STDOUT gedruckt.
Ovs
@JaredK Ich habe Sie in einem Kommentar gefragt, ob es für STORE erlaubt ist, RETRIEVE zu ändern.
Ovs
10

Batch, 16 Bytes

COPY CON A
TYPE A
l4m2
quelle
8

Powershell - 4 Bytes

Lager:

ac

(alternativ auch sc)

Wiederauffinden

gc

Bearbeiten: Ich habe gerade bemerkt, dass die Ausgabe keine Benutzereingaben zulässt ... also springt sie von 4 auf entweder 6 oder 8 Bytes

Lager:

ac f

(alternativ auch sc f) für die 8-Byte-Version

ac

(und fals Pfad angeben ) für die 6-Byte-Version

Wiederauffinden

gc f
Heiko Hatzfeld
quelle
8

Rust, 136 Bytes

Speichern (84 Bytes)

use std::{fs::*,io::*};

||{let mut v=vec![];stdin().read_to_end(&mut v);write("a",v)}

Abrufen (52 Byte)

||print!("{}",std::fs::read_to_string("a").unwrap())

Danksagung

Jakob
quelle
1
Sie können ein Byte speichern, indem Sie den Import in ändern use std::{io::*,fs::*}und writestattdessen verwenden std::fs::write.
Esolanging Fruit
Wie wäre es write("a",String::from_iter(stdin().chars()))?
Bergi
@Bergi Schön. Aber charsTrigger error[E0658]: use of unstable library feature 'io'in einem stabilen Rust.
Jakob
Hm, es scheint chars()zu Gunsten von veraltet zu sein String::from_utf8(stdin().bytes()). (Auch ich habe die nächtlichen Dokumente verwendet, nicht sicher, ob das der Schuldige ist)
Bergi
@Bergi Ich habe ein paar Variationen mit bytes()oder ausprobiert, chars()aber keine davon war sehr kurz, weil das Iterator-Element darin eingeschlossen ist io::Result.
Esolanging Fruit
8

Bash, 12 11 10 Bytes

Geschäft, 7 6 5 Bytes

cat ->f# nicht nötig -, Standard ist stdin

cat >f# kein Platzbedarf, auch >getrennt

cat>f

abrufen, 5 Bytes

cat f
Pelle
quelle
1
Keine Notwendigkeit -im Speicherprogramm.
Konrad Rudolph
2
Auch zwischen "cat" und ">" muss kein Leerzeichen stehen!
Psmears
Sie sollten in der Lage sein, dasselbe wie im zsh-Post für das Schreiben und Verwenden zu tun >f. Ich bin mir jedoch nicht sicher, ob <fes für das Lesen gültig ist.
Allo
@allo Zumindest unter Cygwin >ffunktioniert das so echo '' > f(Leeren der Datei, falls vorhanden, Erstellen, falls nicht), während <fes ein No-Op zu sein scheint.
Sundar
7

HP 49G RPL, 48 Byte

Speichern: :2: A DUP PURGE STO26,5 Byte

Wiederherstellung: :2: A RCL21,5 Byte

Wenn 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.

Jason
quelle
Die Null-Byte-Lösung sollte für eine Vielzahl von Caluclators funktionieren. Ich werde meine 42er rauswerfen, wenn ich nach Hause komme.
SIGSTACKFAULT
Ich denke, Ihre Null-Byte-Lösung und die anderen, die auf Rechnern ausgeführt werden, die sich zerstörungsfrei neu starten lassen, erfüllen nicht zwei Teile der Frage: "Sie werden zwei Programme erstellen." Was Sie haben, ist ein einzelnes Programm, das den Neustart überlebt. Und „Store liest von STDIN und dann beendet , ohne Fehler.“ Ihr Programm wartet immer noch darauf, dass der Benutzer eine Taste drückt. Der Stack und der Ausführungsstatus Ihres Programms können weiterhin geändert werden. Ich denke, das bedeutet, dass es noch läuft und nicht beendet wurde.
Jared K
@JaredK Die Frage stellte nie fest, dass die beiden Programme nicht identisch sein konnten. Was den abschließenden Teil betrifft: Traditionell wird in RPL die Eingabe für Programme auf dem Stapel angegeben. Das ist die Standardeingabe.
Jason
1
Würde der Stack einen Stromzyklus überstehen? Möglicherweise ein leises Ausschalten über die Tasten des Rechners, aber ich schätze, der Akku wird nicht entfernt. Also hängt es vielleicht davon ab, was ein Stromzyklus ist.
Benutzer
1
@user Nein, der Stack überlebt kein Soft- (ON + C) oder Hard-Reset (ON + A + F) (im Gegensatz zum Soft-Power-Off, Right Shift + ON), im Gegensatz zum Speichern in Port 2, bei dem es sich um einen Flash-Speicher handelt ( und überlebt Soft- und Hard-Reset). Da die TI-BASIC-Antwort diese Definition zu verwenden schien, habe ich der Vollständigkeit halber die Stapelantwort eingeschlossen.
Jason
6

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 die erste * letzte Komponente der Datei Nummer 1

APLX Store-SitzungAPLX-Abrufsitzung

* Die Dokumentation sagt zuerst, aber das Experimentieren zeigt zuletzt .

Adam
quelle
6

Bash, 10 Bytes (nicht konkurrierend)

touch $@
ls

Unix-Dateinamen können mit Ausnahme von NULund 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 von lszulä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:

35 33 Bytes

mkdir -p $@
find|sed '$!d;s/..//'

Dies 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)

Sundar
quelle
1
IIRC, ich glaube, dass eine Gruppe in Berkeley bereits in den 1990er Jahren ein Datenbanksystem erstellt hat, das Tabellenspaltendaten als Dateinamen (bis zu 255 Zeichen) speichert. Ich denke, die Zeilen und Tabellen waren übergeordnete Verzeichnisse.
David R Tribble
In Ihrer 35-Byte-Antwort können Sie die zweite Anweisung in ändern 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.
Kritixi Lithos
@Cowsquack Fertig. Vielen Dank für die Erklärung, warum die Änderung auch funktioniert.
Sundar
Sie verwenden müssen "$@", nicht $@durch Leerzeichen, immer verbrannt zu vermeiden *, ?oder ~Zeichen.
Anders Kaseorg
5

Python 3, 56 Bytes

Speichern (33 Bytes)

open(*'aw').write(open(0).read())

Abrufen (23 Byte)

print(open('a').read())

Druckt mit einem nachgestellten Zeilenumbruch.

Jakob
quelle
warum nicht input()statt open(0).read()und auslassen end=aus print?
MoxieBall
@MoxieBall Nicht sicher, warum inputnicht verwendet, aber das Weglassen end=würde dazu führen, dass eine neue Zeile am Ende der Zeichenfolge (dh nicht der ursprünglichen Zeichenfolge) hinzugefügt wird (möglicherweise)
NickA
@ Nicka Es sieht so aus, als würde eine neue Zeile in der Frage gedruckt, also denke ich nicht , dass das eine Rolle spielen sollte ...
MoxieBall
Bin ich verrückt geworden oder ist 23 + 33 = 56 (nicht 54)? Auch warum nicht nutzen input()?
Artemis Fowl
1
@ArtemisFowl Guter Fang. Was inputgehe ich davon aus, dass die Zeichenfolge Zeilenumbrüche enthalten bestehen bleiben kann.
Jakob
4

Japt, 46 30 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)

Ox`lo¯lSÈSge.P=U

Abrufen (14 Byte)

Ox`lo¯lSÈSge.P
LegionMammal978
quelle
+1, weil ich als Erster etwas anderes als die Standarddatei IO verwende. Ich mag es.
Jared K
1
Willkommen bei Japt! :)
Shaggy
1
Übrigens können Sie umgehen setItemund getItemkomplett mit localStorage.key. Wert setzen , Wert abrufen
Shaggy
@ Shaggy Danke! Ihr vermeidet auch die seltsameren Steuerzeichen.
LegionMammal978
4

Haskell, 46 Bytes

Speichern (26 Bytes):

getContents>>=writeFile"t"

Abrufen (20 Byte):

readFile"t">>=putStr
nimi
quelle
3

Rubin (26 Bytes)

Set (16 Bytes)

IO.write'a',gets

Get (10 Bytes)

IO.read'a'
DarkWiiPlayer
quelle
3

MATLAB (30 Bytes)

Set (22 Bytes)

a=input('','s');save a

Kann durch Ändern von in 4 Byte sparen input(''), erfordert jedoch Eingaben in einfachen Anführungszeichen:'input string'

Get (8 Bytes)

load a;a
Der 18. Oktober ist der Tag der Stille auf SE
quelle
3

C (GCC) 98 Bytes

Speichern (46 Bytes)

Die Eingabe erfolgt über das erste Befehlszeilenargument.

main(c,v)char**v;{fputs(v[1],fopen("a","w"));}

Abrufen (52 Byte)

c,d;r(){for(d=open("a",0);read(d,&c,1);)putchar(c);}

Unportabilität

  • Erfordert, dass mehrere Zeigertypen passen int.

Danksagung

Jakob
quelle
1
Dies erfordert eine C-Implementierung, in intder ein Zeiger enthalten sein kann, damit die implizite Deklaration von int fopen()funktioniert. (z. B. die meisten 32-Bit-Systeme, oder verwenden gcc -m32Sie x86-64, um eine 32-Bit-ausführbare Datei zu erstellen .) Übrigens habe ich versucht, Linux- sendfileund copy_file_range(2)Systemaufrufe zu verwenden, aber sie funktionieren nicht mit einem TTY.
Peter Cordes
1
Da Sie Funktionen schreiben, keine Programme, können Sie möglicherweise die Verwendung der Eingabezeichenfolge als eine Funktion begründen, die arg fputs(fopen())und zulässt read(open(),buf,-1). (Die Frage erlaubt jetzt ein Kommandozeilenargument als Eingabe.)
Peter Cordes
Die Linux-Splice-Funktion kopiert von einer Pipe in eine Datei (und umgekehrt). Wenn es sich bei stdin / out um Pipes handelt, wird ein Funktionsaufruf auf Kosten weiterer Parameter gespeichert.
CSM
2

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" ein 1 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ßbuchstaben

Adam
quelle
2

R (27 Bytes)

speichern (21 Bytes)

x=readLines('stdin')

Laden (6 Bytes)

cat(x)

Damit dies funktioniert, muss das erste Skript mit der Befehlszeilenoption --saveund 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 readLinevon im nicht interaktiven Modus arbeitet. Im interaktiven Modus ist dies nicht erforderlich und die Lösung verwendet daher nur 20 Byte .

Konrad Rudolph
quelle
1
Ich denke, es wäre viel effizienter, qdirekt zu verwenden , wobei das erste Programm x=scan(); q("y")und das zweite Programm entweder xoder davon cat(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 --saveund hinzu --restore(was meine Formulierung nicht benötigt)
JDL
@JDL scanfunktioniert nicht für beliebige Inhalte und scan(w='character')ist länger als readLines(). qist unnötig ( q('y')würde aber nicht funktionieren, man muss es buchstabieren yes). Ich habe darüber nachgedacht, nur xdas zweite Programm zu verwenden, aber dies würde die Anforderungen verletzen, soweit ich sie verstehe.
Konrad Rudolph
1
Wenn Sie den Typ verwenden können scan(w=""), müssen Sie ihn nicht buchstabieren. scanDies 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.
JDL
@JDL scan: Oh, ordentlich, die Dokumentation erwähnt das nicht! Leider scanwird 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 wie readLines('stdin'). q: R 3.4.4 sagt “Fehler in q (" y "): nicht erkannter Wert von 'save'”.
Konrad Rudolph
Ah, es ist eine Rstudio-Sache - ich habe es in Rstudio und separat am Terminal ausprobiert und es hat nur in Rstudio funktioniert.
JDL
2

Java (JDK 10) , 204 Bytes

Warnung: Überschreibt alle Einstellungen, die Java-Programme für Ihren Benutzernamen gespeichert haben!

Speicher, 94 Bytes:

interface S{static void main(String[]a){java.util.prefs.Preferences.userRoot().put("",a[0]);}}

Probieren Sie es online!

110 Bytes abrufen:

interface R{static void main(String[]a){System.out.print(java.util.prefs.Preferences.userRoot().get("",""));}}

Probieren Sie es online!

java S foo
java R
foo

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.

Jared K
quelle
Gute Idee! Da Sie Java 10 verwenden, können Sie diese verkürzen, indem Sie sie zu Lambda-Ausdrücken machen. Auch wenn Ihre Byteanzahl nicht umfasst 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.
Jakob
Vielen Dank! Ich habe Ihre Änderungsvorschläge gemacht. Ich bin nicht sicher, aber ich glaube nicht, dass Lambda-Ausdrücke die benutzerdefinierten E / A-Regeln für diese Frage erfüllen können.
Jared K
D'oh. Du hast recht, das habe ich vergessen.
Jakob
2

157 Bytes

Set, 74 Bytes:

class P{static void Main(string[]a){System.IO.File.WriteAllLines("a",a);}}

Get, 83 Bytes:

class P{static void Main(){System.Console.Write(System.IO.File.ReadAllText("a"));}}

-1 Bytes dank VisualMelon
-2 Bytes dank LiefdeWen

Rasnagul
quelle
Entfernen Sie dieses Leerzeichen nach "a",, und ich bezweifle, dass dies geschlagen wird :)
VisualMelon
Sie können ein weiteres Byte speichern, indem Sie WriteAllLinesund den zweiten Parameter verwendena
LiefdeWen
2

Perl 5, 48 26 23 Bytes

Schreiben Sie 20 + 1 (-n) Bytes

-3 Bytes dank Mob

open f,">>f";print f

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

perl -pe "" f
Geoffrey H.
quelle
1
Warum hast du -nemit 1 punkten (es sollte auch eine ehaben), aber -pemit 2? Sie könnten -Eund sayanstelle von verwenden print.
Simbabque
Vielen Dank, dass Sie mich darüber informiert haben -E, ich kannte mich damit nicht aus. Was den Grund angeht, warum ich nicht mitgegangen -nebin, weil ich für diesen Fall tatsächlich von einer Datei aus laufe. So würde es aussehen perl -n w.plWenn dies geht gegen PCG Community Standards aber kann ich meine Antwort entsprechend bearbeiten.
Geoffrey H.
Nein, alles in Ordnung. Wir fügen einen Malus für zusätzliche Kommandozeilenargumente hinzu, es ist also in Ordnung.
Simbabque
2
">>","f"-> ">>f"spart 3 char
mob
1

Attache , 23 + 16 = 39 Bytes

Schreibt einfach STDIN in die Datei Aund liest dann die Datei A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Testen

C:\Users\conorob\Programming\attache (master -> origin)
λ echo testing | attache store.@

C:\Users\conorob\Programming\attache (master -> origin)
λ attache retrieve.@
testing
Conor O'Brien
quelle
1

Lua, 57 53 51 Bytes

Speicher, 27 Bytes

io.open("x","w"):write(...)

Abrufen von 24 Byte

print(io.open"x":read())
Lycea
quelle
1

RUBIN

Speichern (24 Bytes)

File.write('a', ARGV[0])

Abrufen (16 Byte)

p File.read('a')
Gregory
quelle
4
Die Frage fragt nach der Speicherung der Eingabe von STDIN, nicht die Argumente
Ferrybig
Ich habe seitdem bearbeitet, um IO-Alternativen einschließlich Argumente zuzulassen.
Jared K
1
File.write'a',getsund p File.read'a'sind ein bisschen kürzer;)
DarkWiiPlayer
1

C (Unix / GNU), 23 + 23 = 46 Bytes

Speicher, 27 23 Bytes

main(){system("dd>f");}

Abrufen, 27 23 Bytes

main(){system("dd<f");}

Dies schließt die Antwort von jofel in ein C-Programm ein.

Hinweis: Der ddBefehl gibt einige Statistiken an aus stderr, 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 muss stdout, nicht stderr, nehme ich an, dass zusätzliche Ausgabe zulässig ist stderr... Wie auch immer, das Unterdrücken der stderrAusgabe ist so einfach wie das Ersetzen dddurch catund Erhöhen der Bytezahl von Zwei Programme nacheinander.

cmaster
quelle
Abhängig von Ihrem Compiler können Sie möglicherweise auch den intRückgabetyp von entfernen main. Im alten ANSI C-Stil intist dies der Standardrückgabetyp.
Jakob
@ Jakob Ah, ja, natürlich. Ich habe mich bewusst auf die implizite Erklärung system()von main()- autsch verlassen und diese vergessen . Vielen Dank für den Hinweis :-)
cmaster
1

PHP, 26 + 1 + 21 = 48 Bytes

Store.php:

<?fputs(fopen(s,w),$argn);

Laufen Sie mit echo <input> | php -nF Store.php.

Retrieve.php:

<?=fgets(fopen(s,r));

Laufen Sie mit php -n Retrieve.php.

Titus
quelle
1

C (gcc) , 7767 + 25 = 92 Bytes

Kompiliert mit nur wenigen Warnungen auf meinem GCC.

store.c

#include<stdio.h>
main(int c,char**v){fputs(v[1],fopen("f","w"));}

Kann wahrscheinlich Golf spielen, aber ich konnte nicht herausfinden, wie. Segfaults, wenn Sie nichts weitergeben, aber was auch immer.

Peter Cordes: -1

read.c

main(){system("cat f");}
SIGSTACKFAULT
quelle
int*f=fopensollte funktionieren, dh lüge deinem Compiler über den Zeigertyp. Aber nur, wenn Sie für ein 32-Bit-System kompilieren (dh eines, in dem intein Zeiger enthalten sein kann gcc -m32, oder nur gccfür ein 32-Bit-System). Sie können main auch als deklarieren main(int c,char**v)oder möglicherweise, int**vweil Sie nicht dereferenzieren.
Peter Cordes
Das main(int c,char**v)funktioniert. Mir wurde auch klar, dass ich das kann fputs(v[1],fopen("f","w"), obwohl es aus irgendeinem Grund immer noch stdio braucht.
SIGSTACKFAULT
Es sollte funktionieren, wenn Sie eine ausführbare 32-Bit-Datei kompilieren. Bei x86-64 schneidet der Compiler den intRückgabewert auf 32 Bit ab und erweitert ihn durch Vorzeichen als Zeiger. Wenn das zurückgegebene FILE*Bit auf den niedrigen 32-Bit-Werten liegt, würde es funktionieren, aber das ist unter x86-64 Linux nicht der Fall.
Peter Cordes
Wenn Sie sich in einem System befinden, in dem alle Zeiger gleich groß sind (ziemlich wahrscheinlich), können Sie das Einschließen vermeiden, indem Sie sie fopenmanuell deklarieren . Gehen der alten Schule mit den Argumenten spart einige Bytes zu: *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
Gastropner
1

Batch - 11 Bytes

%12>f
type f

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)

'>%1
dir

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.

GetHacked
quelle
1
Ihre Lösung scheint auf STDOUT auszugeben, was gültig ist. STDERR ist nur eine weitere Option, die nicht erforderlich ist. Die Anführungszeichen um die Eingabe hindern sie nicht daran, miteinander zu konkurrieren. Die Frage ist nur, ob sie in Ihrer Byteanzahl gezählt werden sollen. Ich denke nicht, da sie nicht spezifisch für die Frage sind. Sie scheinen wie ein Standard-Boilerplate für Batch zu sein, um ein Befehlszeilenargument zu verwenden, was sich nicht so sehr von Sprachen unterscheidet, die Standardbefehlszeilenflags benötigen. Vielleicht meldet sich jemand anderes mit Batch-Kenntnissen. Lassen Sie ihn vorerst aus der Byte-Anzahl heraus. Willkommen bei Code Golf! :)
Jared K