Code le plus court dans votre langue pour la persistance d'une chaîne lors d'un redémarrage


48

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:

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

C'est du code-golf et votre score est la somme des octets des deux programmes.


9
si juste echo $@>xet cat xest valide?
Adám

1
Votre spécification ne mentionne pas la possibilité de stocker plusieurs fois, mais vous avez un exemple de cas qui le fait. Peut-on supposer un environnement propre pour chaque invocation de Store?
Adám

4
@EriktheOutgolfer Pourquoi cela ne serait-il pas valide? Même s'il y a une échappatoire discutée sur la méta, cela n'empêche pas un défi de le permettre spécifiquement.
Dylnan

6
Les restrictions Web visent généralement à tirer des éléments du Web comme une échappatoire pour ne plus être obligés de les créer. Dans ce cas, si c'est sur le Web, c'est parce que vous l'avez mis en place.
Jared K

3
Quelqu'un doit rédiger une réponse pour un ordinateur doté d'une mémoire magnétique.
Marc

Réponses:


88

zsh, 4 octets

Store: >f(lit à partir de STDIN et écrit dans un fichier appelé f)
Récupérer: <f(écrit le contenu de fSTDOUT)


8
Je pense que nous avons un gagnant.
Adám

@ Adám sauf s'il y a un jeton pour écrire l'entrée dans un fichier sur 1 octet: P
FreezePhoenix

1
@FreezePhoenix Il n'y en a probablement pas sauf si vous écrivez une nouvelle langue maintenant qui n'est pas autorisée ...
Chromium

4
@Chromium check Z80 answer: certaines langues existantes peuvent écrire à partir d'un programme de 0 octet.
Cœur

55

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)


1
Êtes-vous sûr que c'est 5 octets?
FreezePhoenix

6
@FreezePhoenix TI-Basic utilise des jetons.
Adám

3
Hmm ... Pourquoi ne pas entrer une entrée Anset la conserver dans la même variable? Un programme de magasin vide et juste Anspour la récupération devrait fonctionner: 1 octet!
Jakob

9
@ Arthur Yep, Anspersiste. 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.
Jakob

2
@ JaredK Je suis tout à fait d'accord pour dire que la solution à un octet sent l'abus des règles (même si c'est moi qui l'ai suggérée). Cependant, je dirais que le programme de magasin se ferme, car d'autres programmes peuvent être exécutés après (bien qu'ils interfèrent avec le fonctionnement de la solution). Mon interprétation de votre "test objectif de persistance" était que les programmes seraient exécutés directement avant et après le cycle d'alimentation. Si cela est inexact, vous pourriez peut-être exiger que la solution à un octet soit marquée comme non compétitive?
Jakob

23

Navigateur JS, 44 octets

Magasin :

localStorage.a=prompt()

Récupérer :

alert(localStorage.a)

Est-ce que prompt()lire STDIN?
pipe le

9
Un navigateur Web graphique a-t-il un STDIN? N ° prompt()ouvre une alerte vous demandant de saisir du texte et renvoie le résultat.
Dev

5
@Dev Bien sûr, un navigateur Web graphique a un STDIN, comme tout autre processus. Si vous ne pouvez pas l'utiliser à partir d'une langue spécifique est une autre question et si la réponse est "Non", alors je peux peut-être l'utiliser pour ce défi.
pipe le

5
@Dev Les méthodes d'E / S par défaut incluent une entrée via une invite d'interface graphique et une sortie via un affichage d'interface graphique . À moins que OP ne veuille remplacer la norme, cela devrait être valide. Je vais clarifier.
Esolanging Fruit

2
J'ai modifié le défi pour autoriser plus d'E / S, mais je ne l'élargis qu'à un sous-ensemble limité des méthodes d'E / S par défaut. Cette réponse est dans mon sous-ensemble si. Je l'aime.
Jared K

19

Shell POSIX sh / bash / ... 8 octets

le magasin:

dd>f

obtenir:

dd<f

2
cat
Bien

12

Python 3 , 46 octets

magasin, 45 octets:

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

Le programme de récupération est construit par la commande store, un fichier nommé f. ( 1 octet pour le nom du fichier )


2
Vous pouvez sûrement utiliser input()?
Artemis Fowl

@ArtemisFowl input()ne reçoit que jusqu'à la première nouvelle ligne. open(0).readlit tout STDIN
Jo King

Vous avez probablement posté quand les choses étaient encore ambiguës, mais en l'état, cette réponse ne répond pas aux spécifications actuelles. À l'origine, j'avais l'intention que l'exigence STDIN / STDOUT soit stricte, les valeurs par défaut n'étant pas autorisées. Je l'ai développé, mais seulement à un sous-ensemble des valeurs par défaut. Votre programme de récupération, s'il n'utilise pas STDOUT, doit toujours afficher le résultat à l'écran. Si j'autorisais les valeurs par défaut complètes, la solution pour chaque langue serait "prend une entrée dans un fichier", "donne une sortie dans un fichier", zéro octet.
Jared K

@JaredK Je ne pense pas que vous compreniez bien comment cela fonctionne. Le storeprogramme lit l'entrée de STDIN, puis stocke un programme Python qui imprime cette entrée f. Exemple: STORE est appelé avec une entrée de abc. Il écrit ensuite print('abc')à f. Si vous appelez maintenant f(RETRIEVE), il abcs’affiche sur STDOUT.
ovs

@JaredK Je vous ai demandé dans un commentaire s'il était permis à STORE de modifier RETRIEVE.
Ovs


8

Powershell - 4 octets

Espace de rangement:

ac

(alternative aussi sc)

Récupération

gc

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:

ac f

(alternative également sc f) pour la version 8 octets

ac

(et spécifiez fcomme chemin) pour la version à 6 octets

Récupération

gc f

8

Rouille, 136 octets

Magasin (84 octets)

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

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

Récupérer (52 octets)

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

Remerciements


1
Vous pouvez enregistrer un octet en modifiant l'importation en use std::{io::*,fs::*}puis en utilisant à la writeplace de std::fs::write.
Esolanging Fruit

Que diriez- write("a",String::from_iter(stdin().chars()))vous
Bergi

@ Bergi Nice. Mais charsdéclenche error[E0658]: use of unstable library feature 'io'dans la rouille stable.
Jakob

Hm, il semble chars()est déconseillé en faveur de String::from_utf8(stdin().bytes()). (J'ai aussi utilisé les docs nocturnes, pas sûr que ce soit le coupable)
Bergi

@ Bergi j'ai essayé quelques variantes avec bytes()ou chars()mais aucune d'entre elles n'était très courte car l'élément itérateur est encapsulé io::Result.
Esolanging Fruit

8

Frapper, 12 11 10 octets

le magasin, 7 6 5 octets

cat ->f# pas besoin de -, stdin est la valeur par défaut

cat >f# pas besoin d'espace, >sépare aussi

cat>f

récupérer, 5 octets

cat f

1
Pas besoin de -dans le programme de magasin.
Konrad Rudolph

2
Pas besoin d'espace entre "chat" et ">" non plus!
psmears

Vous devriez pouvoir faire la même chose que dans le post zsh pour l'écriture et l'utilisation >f. Je ne sais pas si <fest valide pour la lecture, cependant.
allo

@allo Au moins sur Cygwin, >ffonctionne comme echo '' > f(vider le fichier s'il existe, créer s'il ne fonctionne pas), alors que cela <fsemble être un no-op.
dimanche

7

HP 49G RPL, 48 octets

Pour enregistrer :2: A DUP PURGE STO:, 26,5 octets

Pour restaurer :2: A RCL:, 21,5 octets

Si 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 solution zéro octet devrait fonctionner pour une variété de calculateurs. Je vais casser mes 42s quand je rentre à la maison.
SIGSTACKFAULT

Je pense que votre solution zéro octet, ainsi que les autres solutions exécutées sur des calculatrices qui redémarrent de manière non destructive, ne répondent pas à deux aspects de la question: "Vous créerez deux programmes." Ce que vous avez est un programme unique qui survit au redémarrage. Et « magasin STDIN et sort sans erreur. » Votre programme attend toujours que l'utilisateur appuie sur une touche. La pile et l'état d'exécution de votre programme sont toujours modifiables. Je pense que cela signifie qu'il fonctionne toujours et qu'il n'est pas sorti.
Jared K

@ JaredK La question n'a jamais stipulé que les deux programmes ne pourraient pas être identiques. En ce qui concerne la partie existante: traditionnellement, dans RPL, l’entrée des programmes est donnée sur la pile. C'est l'entrée standard.
Jason

1
La pile survivrait-elle à un cycle d'alimentation? Peut-être une mise hors tension progressive via les boutons de la calculatrice, mais je suppose que je ne supprime pas la batterie. Alors peut-être que cela dépend de ce qu'est un cycle d'alimentation.
utilisateur

1
@user Non, la pile ne survit pas au soft (ON + C) ni à la réinitialisation matérielle (ON + A + F) (distincte de la mise hors tension logicielle désactivée, Shift droit + ON), contrairement au stockage dans le port 2, qui est la mémoire flash ( et survit à la réinitialisation logicielle et matérielle). Étant donné que la réponse TI-BASIC semblait utiliser cette définition, j'ai inclus la réponse de pile pour une complétude.
Jason

6

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 le premier * dernier composant du fichier numéro 1

Session de magasin APLXSession de récupération APLX

* La documentation dit en premier, mais l'expérimentation montre la dernière .


6

bash, 10 octets (non compétitif)

touch $@
ls

Les noms de fichiers Unix peuvent contenir n’importe quel caractère sauf NULet /, 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-ci lsest 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:

35 33 octets

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

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


1
IIRC, je crois qu’un groupe de Berkeley avait déjà créé, dans les années 90, un système de base de données qui stockait les données de colonnes de table sous forme de noms de fichiers (jusqu’à 255 caractères). Je pense que les lignes et les tables étaient des répertoires parents.
David R Tribble

Dans votre réponse de 35 octets, vous pouvez modifier le deuxième relevé en 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.
Kritixi Lithos

@Cowsquack Fait. Merci d’avoir expliqué pourquoi le changement fonctionne également.
dimanche - Réintégrer Monica le

Vous devez utiliser "$@", non $@, pour éviter de vous faire brûler par des espaces *, des ?, ou des ~caractères.
Anders Kaseorg

5

Python 3, 56 octets

Magasin (33 octets)

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

Récupérer (23 octets)

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

Imprime avec une nouvelle ligne.


pourquoi pas input()au lieu de open(0).read()et omettre end=de print?
MoxieBall

@MoxieBall Vous ne savez pas trop pourquoi input, mais l'omission end=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)

@ NickA Il semble qu'une nouvelle ligne soit imprimée dans la question, de toute façon, donc je ne pense pas que cela devrait
compter

Suis-je devenu fou ou est-ce que 23 + 33 = 56 (et non 54)? Aussi pourquoi ne pas utiliser input()?
Artemis Fowl

1
@ArtemisFowl Bonne prise. En ce qui concerne input, je suppose que la chaîne à conserver peut contenir des nouvelles lignes.
Jakob

4

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

Ox`lo¯lSÈSge.P=U

Récupérer (14 octets)

Ox`lo¯lSÈSge.P

+1 pour avoir été le premier à utiliser autre chose qu'un fichier IO standard, j'aime bien.
Jared K

1
Bienvenue chez Japt! :)
Shaggy

1
Par ailleurs, vous pouvez contourner setItemet getItemcomplètement avec localStorage.key. Définir la valeur , récupérer la valeur
Shaggy

@Shaggy Merci! Le vôtre évite également les caractères de contrôle plus étranges.
LegionMammal978

4

Haskell, 46 octets

Magasin (26 octets):

getContents>>=writeFile"t"

Récupérer (20 octets):

readFile"t">>=putStr

3

Ruby (26 octets)

Set (16 octets)

IO.write'a',gets

Obtenir (10 octets)

IO.read'a'

3

MATLAB (30 octets)

Ensemble (22 octets)

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

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)

load a;a

3

C (GCC), 98 octets

Magasin (46 octets)

La saisie s'effectue via le premier argument de la ligne de commande.

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

Récupérer (52 octets)

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

L'inviolabilité

  • Nécessite que plusieurs types de pointeurs soient intégrés int.

Remerciements


1
Cela nécessite une implémentation en C intpouvant contenir un pointeur, pour que la déclaration implicite de int fopen()fonctionne. (par exemple , la plupart des systèmes 32 bits, ou l' utilisation gcc -m32si vous êtes sur x86-64 pour faire un exécutable 32 bits.) Et BTW, j'ai essayé d' utiliser de Linux sendfileet des copy_file_range(2)appels système, mais ils ne travaillent pas à / d'un ATS.
Peter Cordes

1
Puisque vous écrivez des fonctions, pas des programmes, vous pourriez peut-être justifier de prendre la chaîne de saisie comme une fonction permettant à fputs(fopen()), et read(open(),buf,-1). (La question autorise maintenant un argument de ligne de commande comme entrée.)
Peter Cordes

La fonction «splice» de Linux copie un tuyau dans un fichier (et inversement). Si stdin / out sont des pipes, alors cela sauvera un appel de fonction, au détriment de plus de paramètres.
CSM

2

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 majuscule 1 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 majuscule


2

R (27 octets)

magasin (21 octets)

x=readLines('stdin')

charge (6 octets)

cat(x)

Pour que cela fonctionne, le premier script doit être appelé avec l'option de ligne de commande --saveet 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 readLinede fonctionner en mode non interactif. En mode interactif, cela n’est pas nécessaire et la solution n’utilise donc que 20 octets .


1
Je pense que ce serait beaucoup plus efficace d'utiliser qdirectement, avec le premier programme x=scan(); q("y")et le second soit xou cat(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 --saveet --restore(ce dont ma formulation n’a pas besoin)
JDL

@JDL scanne fonctionne pas pour des contenus arbitraires et scan(w='character')est plus long que readLines(). qest inutile (mais q('y')ne fonctionnerait pas, vous devez l'épeler yes). Je pensais juste à utiliser xdans le deuxième programme mais cela violerait les exigences, pour autant que je les comprenne.
Konrad Rudolph

1
vous pouvez utiliser scan(w=""), vous n'avez pas besoin de préciser le type, scanle 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.
JDL

@JDL scan: Oh, chouette , la documentation ne le mentionne pas! Malheureusement scan, 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 que readLines('stdin'). q: R 3.4.4 dit “Erreur dans q (" y "): valeur non reconnue de" sauvegarder "".
Konrad Rudolph

Ah, c'est une chose de Rstudio - je l'ai essayé dans Rstudio et séparément au terminal et cela n'a fonctionné que dans Rstudio.
JDL

2

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:

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

Essayez-le en ligne!

Récupérer 110 octets:

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

Essayez-le en ligne!

java S foo
java R
foo

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.


Bonne idée! Puisque vous utilisez Java 10, vous pouvez les raccourcir en leur faisant des expressions lambda. De plus, si votre nombre d'octets ne comprend pas, zvous 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.
Jakob

Merci! J'ai fait vos modifications suggérées. Je ne suis pas certain mais je ne pense pas que les expressions lambda puissent répondre aux règles IO personnalisées pour cette question.
Jared K

D'oh. Tu as raison, j'ai oublié ça.
Jakob

2

C #, 157 octets

Ensemble, 74 octets:

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

Obtenez 83 octets:

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

-1 octet grâce à VisualMelon
-2 octets grâce à LiefdeWen


Supprimez cet espace après "a",, et je doute que cela soit battu :)
VisualMelon

Vous pouvez enregistrer un autre octet en utilisant WriteAllLineset le second a
paramètre

2

Perl 5, 48 26 23 octets

Write, 20 + 1 (-n) octets

-3 octets grâce à la mob

open f,">>f";print f

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

perl -pe "" f

1
Pourquoi avez-vous marqué -neavec 1 (il devrait en avoir un eaussi), mais -peavec 2? Vous pouvez utiliser -Eet sayau lieu de print.
simbabque

Merci de me l'avoir fait savoir -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 que perl -n w.plsi cela va à l’encontre des standards de la communauté PCG, je peux modifier ma réponse en conséquence.
Geoffrey H.

Non ça va. Nous ajoutons un malus pour les arguments supplémentaires en ligne de commande, donc ça va.
simbabque

2
">>","f"-> ">>f"enregistre 3 caractères
mob

1

Attaché , 23 + 16 = 39 octets

Il suffit d’écrire STDIN dans un fichier A, puis de le lire A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Essai

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

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

1

Lua, 57 53 51 octets

Magasin, 27 octets

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

Récupérer, 24 octets

print(io.open"x":read())

1

RUBIS

Magasin (24 octets)

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

Récupérer (16 octets)

p File.read('a')

4
La question demande de stocker les entrées de STDIN, pas les arguments
Ferrybig

Depuis, j'ai édité pour permettre aux alternants IO, y compris les arguments.
Jared K

1
File.write'a',getset p File.read'a'sont un peu plus courts;)
DarkWiiPlayer

1

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

Store, 27 23 octets

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

Récupérer, 27 23 octets

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

Ceci englobe fondamentalement la réponse de jofel dans un programme C.

Remarque: Les ddcommandes génèrent des statistiques dans la commande stderr. 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ée stdout, non stderr, je suppose qu'il est autorisé à avoir une sortie supplémentaire sur stderr... Quoi qu'il en soit, la suppression de la stderrsortie est aussi simple que le remplacement ddpar cat, deux programmes par un, chacun.


Selon votre compilateur, vous pourrez peut-être également supprimer le inttype de retour de main. Dans l'ancien style ANSI C, intle type de retour par défaut.
Jakob

@ Jakob Ah, oui, bien sûr. Je me suis appuyé consciemment sur la déclaration implicite de system()et of main()ouch. Merci de nous l'avoir signalé :-)
cmaster

1

PHP, 26 + 1 + 21 = 48 octets

Store.php:

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

Courez avec echo <input> | php -nF Store.php.

Retrieve.php:

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

Courez avec php -n Retrieve.php.


1

C (gcc) , 77 67 + 25 = 92 octets

Compile avec seulement quelques avertissements sur mon gcc.

store.c

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

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

main(){system("cat f");}

int*f=fopendevrait 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ème intpouvant contenir un pointeur, par exemple gcc -m32, ou uniquement gccun système entièrement 32 bits). Vous pouvez également déclarer main en tant que main(int c,char**v), ou peut int**v- être parce que vous ne déréférenciez pas.
Peter Cordes

Les main(int c,char**v)travaux Je me suis aussi rendu compte que je pouvais le faire fputs(v[1],fopen("f","w"), même s’il avait toujours besoin de la stdio pour une raison quelconque.
SIGSTACKFAULT

Cela devrait fonctionner si vous compilez un exécutable 32 bits. Pour x86-64, le compilateur tronquera la intvaleur de retour à 32 bits, puis étendra le signe en tant que pointeur. Si le rendu FILE*est dans les 32 bits les plus bas, cela fonctionnerait, mais ce n'est pas le cas sous Linux x86-64.
Peter Cordes

Si vous êtes sur un système où tous les pointeurs sont de taille égale (plutôt probable), vous pouvez éviter l'inclusion en déclarant fopenmanuellement. Aller vieille école avec les arguments permet d' économiser quelques octets trop: *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
gastropner

1

Lot - 11 octets

%12>f
type f

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)

'>%1
dir

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.


1
Votre solution semble sortir sur STDOUT, qui est valide. STDERR est juste une autre option, non requise. Les citations autour de l’entrée ne l’empêchent pas de se faire concurrence. La seule question est de savoir si elles doivent être comptées dans votre nombre d'octets. Je ne le pense pas, car ils ne sont pas spécifiques à la question. Cela ressemble à un standard habituel pour que Batch accepte un argument de ligne de commande, qui n’est pas si différent des langues qui nécessitent des indicateurs de ligne de commande standard. Peut-être que quelqu'un d'autre connaissant Batch interviendra. Pour l'instant, laissez-les en dehors du nombre d'octets. Bienvenue chez Code Golf! :)
Jared K
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.