Vos programmes:
Vous allez écrire deux programmes (les deux dans la même langue). Le programme de stockage extrait une chaîne de STDIN d'une chaîne persistante (voir ci-dessous), puis se ferme sans erreur. Le programme de récupération ne prend aucune entrée, récupère la chaîne qui a été stockée et l’imprime sur STDOUT.
Test objectif de persistance:
Vous devriez pouvoir exécuter le programme de stockage sur votre ordinateur local, puis redémarrer votre ordinateur local, puis appeler le programme d'extraction sur votre ordinateur local. Vous pouvez cacher la chaîne comme vous le souhaitez (même sur le Web) tant que vous passez ce test de redémarrage.
Cas de test:
Stockage puis récupération:
echo foo | Store
Retrieve
foo
Les magasins répétés doivent écraser (comme une méthode set ()):
echo foo | Store
echo bar | Store
Retrieve
bar
La récupération répétée est non destructive (comme une méthode get ()):
echo foo | Store
Retrieve
foo
Retrieve
foo
Récupération avant toute invocation de stockage:
Vous n'avez pas besoin de vous inquiéter à ce sujet. Votre programme de récupération peut supposer que le programme de stockage a été exécuté à un moment donné dans le passé.
Flexibilité d'entrée / sortie.
Les gens m'ont demandé de développer cela de strict STDIN / STDOUT aux règles IO standard. Je ne peux pas parce que cela introduirait trop d'échappatoires. Certaines options IO standard ont déjà l’entrée stockée de manière persistante, par exemple "les programmes peuvent prendre l’entrée d’un fichier". Je voudrais être plus flexible que simplement STDIN et STDOUT, mais sans ouvrir les vannes.
Dans le fil standard des règles IO, je choisis ceux qui ne relèveront pas le défi:
Les programmes peuvent recevoir des entrées via des invites graphiques et des invites de ligne de commande si vous le souhaitez.
Les programmes peuvent sortir en l'affichant à l'écran Cela inclut les dialogues d'interface graphique
Les programmes peuvent prendre des entrées via des arguments en ligne de commande
Les programmes peuvent sortir sur STDERR mais ne peuvent toujours pas générer d' erreurs.
Si vous utilisez une alternative, elle doit être interactive avec l'utilisateur. L'utilisateur ne devrait pas avoir à effectuer d'autres tâches que celle de transférer son entrée dans votre programme, de le saisir dans une invite fournie par votre programme ou de saisir une entrée en tant qu'argument de ligne de commande de votre programme. L'utilisateur ne devrait pas avoir à faire autre chose que d'exécuter votre programme de récupération pour voir la sortie affichée à l'écran ou envoyée à STDOUT ou à STDERR.
Hypothèses autorisées:
- Vos deux programmes seront exécutés dans le même répertoire
- Vos programmes ont des autorisations en lecture-écriture pour ce répertoire
- Les fichiers que vous créez survivront au redémarrage (pas dans un répertoire temporaire)
- Une nouvelle ligne finale qui ne faisait pas partie de la chaîne est autorisée. Aucun autre espace de fuite
echo $@>x
etcat x
est valide?Store
?Réponses:
zsh, 4 octets
Store:
>f
(lit à partir de STDIN et écrit dans un fichier appeléf
)Récupérer:
<f
(écrit le contenu def
STDOUT)la source
TI-BASIC (Z80), 1 octet ?
Store:
(entrez simplement la chaîne)
Récupérer:
Ans
(octet 27)Mais si cela n'est pas valide:
TI-BASIC (Z80),
7 à6 octets-1 merci à Jakob.
Store:
Prompt Str0
(octets DD AA 09)Récupérer:
disp Str0
(octets ED AA 09)la source
Ans
et la conserver dans la même variable? Un programme de magasin vide et justeAns
pour la récupération devrait fonctionner: 1 octet!Ans
persiste. En fait, de nombreux états persistent, y compris (je pense) toutes les variables utilisateur, les équations et l’historique. Du point de vue de l'utilisateur, le mode hors tension est l'équivalent de l'état de veille d'un ordinateur sur la calculatrice TI, de sorte qu'il n'interfère pas beaucoup.Navigateur JS, 44 octets
Magasin :
Récupérer :
la source
prompt()
lire STDIN?prompt()
ouvre une alerte vous demandant de saisir du texte et renvoie le résultat.Shell POSIX sh / bash / ... 8 octets
le magasin:
obtenir:
la source
cat
Python 3 , 46 octets
magasin, 45 octets:
Le programme de récupération est construit par la commande store, un fichier nommé
f
. ( 1 octet pour le nom du fichier )la source
input()
?input()
ne reçoit que jusqu'à la première nouvelle ligne.open(0).read
lit tout STDINstore
programme lit l'entrée de STDIN, puis stocke un programme Python qui imprime cette entréef
. Exemple: STORE est appelé avec une entrée deabc
. Il écrit ensuiteprint('abc')
àf
. Si vous appelez maintenantf
(RETRIEVE), ilabc
s’affiche sur STDOUT.Lot, 16 octets
la source
Powershell - 4 octets
Espace de rangement:
(alternative aussi
sc
)Récupération
Edit: je viens de remarquer que la sortie n’est autorisée dans aucune entrée utilisateur ... elle passe donc de 4 à 6 ou 8 octets
Espace de rangement:
(alternative également
sc f
) pour la version 8 octets(et spécifiez
f
comme chemin) pour la version à 6 octetsRécupération
la source
Rouille, 136 octets
Magasin (84 octets)
Récupérer (52 octets)
Remerciements
la source
use std::{io::*,fs::*}
puis en utilisant à lawrite
place destd::fs::write
.write("a",String::from_iter(stdin().chars()))
vouschars
déclencheerror[E0658]: use of unstable library feature 'io'
dans la rouille stable.chars()
est déconseillé en faveur deString::from_utf8(stdin().bytes())
. (J'ai aussi utilisé les docs nocturnes, pas sûr que ce soit le coupable)bytes()
ouchars()
mais aucune d'entre elles n'était très courte car l'élément itérateur est encapsuléio::Result
.Frapper,
12 1110 octetsle magasin,
7 65 octets# pas besoin decat ->f
-
, stdin est la valeur par défaut# pas besoin d'espace,cat >f
>
sépare aussirécupérer, 5 octets
la source
-
dans le programme de magasin.>f
. Je ne sais pas si<f
est valide pour la lecture, cependant.>f
fonctionne commeecho '' > f
(vider le fichier s'il existe, créer s'il ne fonctionne pas), alors que cela<f
semble être un no-op.HP 49G RPL, 48 octets
Pour enregistrer
:2: A DUP PURGE STO
:, 26,5 octetsPour restaurer
:2: A RCL
:, 21,5 octetsSi nous pouvons laisser dans la batterie de secours, nous obtenons:
HP 49G RPL, 0 octet
Pour enregistrer:
0 octet
Pour restaurer
:, 0 octet, car la HP 49G laisse la pile intacte lors des redémarrages.
la source
APL (APLX) , 5 octets
Magasin:
⍞⍈1
Récupérer:
⍇1
⍞
récupère la ligne de stdin⍈1
write au prochain composant disponible du fichier n ° 1⍇1
lire lepremier* dernier composant du fichier numéro 1* La documentation dit en premier, mais l'expérimentation montre la dernière .
la source
bash, 10 octets (non compétitif)
Les noms de fichiers Unix peuvent contenir n’importe quel caractère sauf
NUL
et/
, et leurs noms peuvent aller jusqu’à 255 octets , ce qui permet de ne stocker que les chaînes jusqu’à cette longueur (considérez qu’il s’agit d’une limitation du support de stockage), et ne contiennent pas '/ 'en eux. C'est une des raisons pour lesquelles il s'agit d'une concurrence, une autre est que cela suppose que le répertoire sur lequel il est exécuté est vide (ou que la sortie superflue de celle-cils
est autorisée). Je voulais toujours poster ceci parce que cela semblait juste une façon cool et non évidente de stocker des informations.Un autre exemple similaire, qui n'aurait pas la même longueur ni les mêmes limites de caractères, serait:
3533 octetsCela autorise le
/
caractère dans la chaîne et supporte beaucoup plus de caractères (exactement combien dépend de l'implémentation).(-2 octets sur ceci grâce à @Cows Quack)
la source
s/..//
. Le$
n'est pas obligatoire car toutes les autres lignes sont supprimées. Cela ne peut donc s'appliquer qu'à la dernière ligne et le^
peut être supprimé car la substitution n'est appliquée que lors de la première correspondance."$@"
, non$@
, pour éviter de vous faire brûler par des espaces*
, des?
, ou des~
caractères.Python 3, 56 octets
Magasin (33 octets)
Récupérer (23 octets)
Imprime avec une nouvelle ligne.
la source
input()
au lieu deopen(0).read()
et omettreend=
deprint
?input
, mais l'omissionend=
entraînerait l'ajout d'une nouvelle ligne à la fin de la chaîne (c'est-à-dire, pas la chaîne d'origine) (peut-être)input()
?input
, je suppose que la chaîne à conserver peut contenir des nouvelles lignes.Japt,
4630 octets-16 octets grâce à Shaggy .
Une des premières fois que j'ai essayé d'utiliser Japt. Le JS eval peut parfois être agité. Utilise le navigateur
window.localStorage
.Magasin (16 octets)
Récupérer (14 octets)
la source
setItem
etgetItem
complètement aveclocalStorage.key
. Définir la valeur , récupérer la valeurHaskell, 46 octets
Magasin (26 octets):
Récupérer (20 octets):
la source
Ruby (26 octets)
Set (16 octets)
Obtenir (10 octets)
la source
MATLAB (30 octets)
Ensemble (22 octets)
Vous pouvez supprimer 4 octets en remplaçant par
input('')
, mais cela nécessitera que les entrées soient entre guillemets simples:'input string'
Obtenir (8 octets)
la source
C (GCC), 98 octets
Magasin (46 octets)
La saisie s'effectue via le premier argument de la ligne de commande.
Récupérer (52 octets)
L'inviolabilité
int
.Remerciements
la source
int
pouvant contenir un pointeur, pour que la déclaration implicite deint fopen()
fonctionne. (par exemple , la plupart des systèmes 32 bits, ou l' utilisationgcc -m32
si vous êtes sur x86-64 pour faire un exécutable 32 bits.) Et BTW, j'ai essayé d' utiliser de Linuxsendfile
et descopy_file_range(2)
appels système, mais ils ne travaillent pas à / d'un ATS.fputs(fopen())
, etread(open(),buf,-1)
. (La question autorise maintenant un argument de ligne de commande comme entrée.)APL (Dyalog Unicode) , 18 octets
Magasin:
⍞⎕NPUT⎕A 1
essayez-le en ligne!Récupérer:
⊃⎕NGET⎕A
essayez-le en ligne!⍞
récupère la ligne de stdin et la⎕NPUT
met dans un fichier natif appelé⎕A
alphabet majuscule1
et écrase si le fichier existe⊃
la première partie (les données, les parties suivantes sont codées et les types de fin de ligne) pour⎕NGET
obtenir le fichier natif⎕A
l'alphabet majusculela source
R (27 octets)
magasin (21 octets)
charge (6 octets)
Pour que cela fonctionne, le premier script doit être appelé avec l'option de ligne de commande
--save
et le second avec--restore
(bien que ce ne soit pas nécessaire en mode interactif: ces options sont les options par défaut).Cela pourrait être raccourci de 7 octets sans le fait qu’un bogue dans R empêche l’argument par défaut
readLine
de fonctionner en mode non interactif. En mode interactif, cela n’est pas nécessaire et la solution n’utilise donc que 20 octets .la source
q
directement, avec le premier programmex=scan(); q("y")
et le second soitx
oucat(x)
selon la rigueur avec laquelle nous voulons être sur la façon dont les chaînes sont imprimées. Selon les règles habituelles du code de golf, vous devez également compter les arguments de ligne de commande. Ajoutez donc des octets pour--save
et--restore
(ce dont ma formulation n’a pas besoin)scan
ne fonctionne pas pour des contenus arbitraires etscan(w='character')
est plus long quereadLines()
.q
est inutile (maisq('y')
ne fonctionnerait pas, vous devez l'épeleryes
). Je pensais juste à utiliserx
dans le deuxième programme mais cela violerait les exigences, pour autant que je les comprenne.scan(w="")
, vous n'avez pas besoin de préciser le type,scan
le déduira du type d'argument spécifié. Pour moi, q ("y") fonctionne comme une sauvegarde, mais cela dépend peut-être de votre version de R et éventuellement de l'utilisation de Rstudio ou non.scan
: Oh, chouette , la documentation ne le mentionne pas! Malheureusementscan
, certaines analyses seront toujours exécutées, cela ne fonctionnera donc pas avec toutes les entrées. Quoi qu'il en soit,scan('stdin',w='')
se trouve être exactement la même longueur quereadLines('stdin')
.q
: R 3.4.4 dit “Erreur dans q (" y "): valeur non reconnue de" sauvegarder "".Java (JDK 10) , 204 octets
Avertissement: écrase toutes les préférences que tous les programmes java ont stockées pour votre nom d'utilisateur!
Magasin, 94 octets:
Essayez-le en ligne!
Récupérer 110 octets:
Essayez-le en ligne!
Cela fonctionne en prenant l'entrée comme argument et en la stockant dans le magasin de sauvegarde des préférences utilisateur fourni par java.util.prefs . Il écrase le nœud racine de l'utilisateur pour enregistrer un octet lors de l'attribution d'un nom à un nœud. Si vous souhaitez le tester de manière non désestructrice, exécutez-le à partir d'un nom d'utilisateur jetable ou remplacez la clé par "" par un nom de nœud.
la source
z
vous devez le supprimer des programmes et du TIO. Envisagez plutôt de placer un avertissement en haut de la soumission pour avertir les gens. Bien sûr, le TIO devrait avoir vos solutions de 94 et 110 octets.C #, 157 octets
Ensemble, 74 octets:
Obtenez 83 octets:
-1 octet grâce à VisualMelon
-2 octets grâce à LiefdeWen
la source
"a",
, et je doute que cela soit battu :)WriteAllLines
et le seconda
Perl 5,
482623 octetsWrite, 20 + 1 (-n) octets
-3 octets grâce à la mob
En fait, je ne suis pas certain de cela, mais cela répond aux critères. Pour les entrées passées, seules les options de la CLI ont été comptées, c'est donc ce que je vais faire.
Lecture, 0 + 2 octets
la source
-ne
avec 1 (il devrait en avoir une
aussi), mais-pe
avec 2? Vous pouvez utiliser-E
etsay
au lieu deprint
.-E
, je ne connaissais pas celui-là. Quant à la raison pour laquelle je ne suis pas allé avec-ne
, c'est parce que pour celui-ci, je cours en fait à partir d'un fichier. Donc, il semblerait queperl -n w.pl
si cela va à l’encontre des standards de la communauté PCG, je peux modifier ma réponse en conséquence.">>","f"
->">>f"
enregistre 3 caractèresAttaché , 23 + 16 = 39 octets
Il suffit d’écrire STDIN dans un fichier
A
, puis de le lireA
.store.@
:retrieve.@
:Essai
la source
Lua,
575351 octetsMagasin, 27 octets
Récupérer, 24 octets
la source
RUBIS
Magasin (24 octets)
Récupérer (16 octets)
la source
File.write'a',gets
etp File.read'a'
sont un peu plus courts;)C (Unix / GNU), 23 + 23 = 46 octets
Store,
2723 octetsRécupérer,
2723 octetsCeci englobe fondamentalement la réponse de jofel dans un programme C.
Remarque: Les
dd
commandes génèrent des statistiques dans la commandestderr
. Vous verrez donc une sortie supplémentaire lorsque vous l'exécuterez naïvement dans le shell. Cependant, étant donné que le défi indique uniquement que la chaîne stockée doit être présentéestdout
, nonstderr
, je suppose qu'il est autorisé à avoir une sortie supplémentaire surstderr
... Quoi qu'il en soit, la suppression de lastderr
sortie est aussi simple que le remplacementdd
parcat
, deux programmes par un, chacun.la source
int
type de retour demain
. Dans l'ancien style ANSI C,int
le type de retour par défaut.system()
et ofmain()
ouch. Merci de nous l'avoir signalé :-)PHP, 26 + 1 + 21 = 48 octets
Store.php:
Courez avec
echo <input> | php -nF Store.php
.Retrieve.php:
Courez avec
php -n Retrieve.php
.la source
C (gcc) ,
7767 + 25 = 92 octetsCompile avec seulement quelques avertissements sur mon gcc.
store.c
Peut probablement jouer au golf, mais je ne savais pas comment. Segfaults si vous ne passez rien, mais peu importe.
Peter Cordes: -1
read.c
la source
int*f=fopen
devrait fonctionner, c'est-à-dire mentir à votre compilateur sur le type de pointeur. Mais uniquement si vous compilez pour un système 32 bits (c'est-à-dire un systèmeint
pouvant contenir un pointeur, par exemplegcc -m32
, ou uniquementgcc
un système entièrement 32 bits). Vous pouvez également déclarer main en tant quemain(int c,char**v)
, ou peutint**v
- être parce que vous ne déréférenciez pas.main(int c,char**v)
travaux Je me suis aussi rendu compte que je pouvais le fairefputs(v[1],fopen("f","w")
, même s’il avait toujours besoin de la stdio pour une raison quelconque.int
valeur de retour à 32 bits, puis étendra le signe en tant que pointeur. Si le renduFILE*
est dans les 32 bits les plus bas, cela fonctionnerait, mais ce n'est pas le cas sous Linux x86-64.fopen
manuellement. Aller vieille école avec les arguments permet d' économiser quelques octets trop:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Lot - 11 octets
L'entrée est reçue sous forme d'argument de ligne de commande et persiste (avec le message d'erreur créé lors de la tentative d'exécution, puisque CMD tente d'exécuter le paramètre) dans
f
.Lot - 7 octets (non compétitif)
Un nom de fichier contient une pléthore de caractères non valides. Par conséquent, cela ne fonctionnerait pas pour certaines chaînes, mais cela sauvegarderait essentiellement un caractère arbitraire dans le nom de fichier indiqué par le paramètre. Pour le lire, il ne fait que répertorier tous les fichiers du répertoire, y compris notre chaîne.
la source