El código más corto en su idioma para persistir una cadena en un reinicio

48

Sus programas:

Escribirás dos programas (ambos en el mismo idioma). El programa de almacenamiento toma una cadena de STDIN y la almacena en algún lugar persistente (ver más abajo) y luego sale sin error. El programa de recuperación no toma ninguna entrada, recupera la cadena que estaba almacenada y la imprime en STDOUT.

Prueba objetiva de persistencia:

Debería poder ejecutar el programa de almacenamiento en su máquina local, luego reiniciar su máquina local y luego llamar al programa de recuperación en su máquina local. Puede guardar la cadena como desee (incluso en la web) siempre que pase esta prueba de reinicio.

Casos de prueba:

Almacenamiento y recuperación:

echo foo | Store
Retrieve
foo

Las tiendas repetidas deberían sobrescribirse (como un método set ()):

echo foo | Store
echo bar | Store
Retrieve
bar

La recuperación repetida no es destructiva (como un método get ()):

echo foo | Store
Retrieve
foo
Retrieve
foo

Recuperación antes de cualquier invocación de Almacenamiento:

No necesita preocuparse por esto. Su programa de recuperación puede suponer que el programa de almacenamiento se ha ejecutado en algún momento en el pasado.

Flexibilidad de entrada / salida.

La gente me ha pedido que amplíe esto de estricto STDIN / STDOUT a las reglas estándar de E / S. No puedo porque introduciría demasiadas lagunas. Algunas opciones estándar de E / S ya tienen la entrada almacenada de forma persistente, por ejemplo, "los programas pueden recibir información de un archivo". Me gustaría ser más flexible que simplemente STDIN y STDOUT estrictos, pero sin abrir las compuertas.

Del hilo de reglas estándar de IO estoy seleccionando los que no rompen el desafío:

Si usa una alternativa, debe ser interactiva para el usuario. El usuario no debería tener que hacer ningún otro trabajo además de canalizar su entrada a su programa, escribiéndola en un indicador que proporcione su programa, o escribiendo la entrada como una línea de comando arg de su programa. El usuario no debería tener que hacer nada más que ejecutar su programa de recuperación para ver la salida mostrada en la pantalla o enviada a STDOUT o STDERR.

Suposiciones permitidas:

  • Sus dos programas se ejecutarán en el mismo directorio.
  • Sus programas tienen permisos de lectura y escritura para ese directorio
  • Los archivos que cree sobrevivirán al reinicio (no en un directorio temporal)
  • Se permite una nueva línea final que no era parte de la cadena. Ningún otro espacio en blanco al final

Este es el código de golf, y su puntaje es la suma de bytes de ambos programas.

Jared K
fuente
99
¿Tan justo echo $@>xy cat xválido?
Adám
1
Su especificación no menciona la capacidad de almacenar varias veces, pero tiene un caso de ejemplo que lo hace. ¿Podemos suponer un entorno limpio para cada invocación de Store?
Adám
44
@EriktheOutgolfer ¿Por qué no sería válido? Incluso si hay una laguna discutida en meta que no impide que un desafío lo permita específicamente.
dylnan
66
Las restricciones web generalmente se tratan de extraer cosas de la web como un vacío para evitar hacer el trabajo de crear esas cosas. En este caso, si está en la web es porque hiciste el trabajo de ponerlo allí.
Jared K
3
Alguien necesita escribir una respuesta para una computadora con memoria de núcleo magnético.
Mark

Respuestas:

88

zsh, 4 bytes

Almacenar: >f(lee de STDIN y escribe en un archivo llamado f)
Recuperar: <f(escribe el contenido de fSTDOUT)

Pomo de la puerta
fuente
8
Creo que tenemos un ganador.
Adám
@ Adám a menos que haya un token para escribir la entrada al archivo en 1 byte: P
FreezePhoenix
1
@FreezePhoenix Probablemente no haya ninguno a menos que escriba un nuevo idioma ahora que no está permitido ...
Chromium
44
@Chromium check Z80 respuesta: algunos idiomas existentes pueden escribir desde un programa de 0 bytes.
Cœur
55

TI-BASIC (Z80), 1 byte ?

Almacenar:  (solo ingrese la cadena)
Recuperar: Ans(byte 27)

Pero si eso no es válido:

TI-BASIC (Z80), 7 6 bytes

-1 gracias a Jakob.

Almacenar: Prompt Str0(bytes DD AA 09)
Recuperar: disp Str0(bytes ED AA 09)

Adán
fuente
1
¿Estás seguro de que son 5 bytes?
FreezePhoenix
66
@FreezePhoenix TI-Basic utiliza tokens.
Adám
3
Hmm ... ¿Por qué no tomar entrada Ansy persistir en la misma variable? Un programa de tienda vacío y solo Anspara recuperar debería funcionar: ¡1 byte!
Jakob
99
@ Arthur Sí, Anspersiste. De hecho, persiste una gran cantidad de estados, incluyendo (creo) todas las variables, ecuaciones e historial del usuario. Desde la perspectiva del usuario, apagado es básicamente el equivalente de la calculadora TI de un estado de suspensión para una PC, por lo que no interrumpe mucho.
Jakob
2
@JaredK Definitivamente estoy de acuerdo en que la solución de 1 byte huele a abuso de reglas (aunque yo fui quien lo sugirió). Sin embargo, yo diría que el programa de la tienda se cierra, ya que otros programas pueden ejecutarse después (aunque interfieren con el funcionamiento de la solución). Mi interpretación de su "prueba objetiva de persistencia" fue que los programas se ejecutarían directamente antes y después del ciclo de encendido. Si eso es incorrecto, ¿tal vez podría requerir que la solución de 1 byte se marque como no competitiva?
Jakob
23

Navegador JS, 44 bytes

Tienda :

localStorage.a=prompt()

Recuperar :

alert(localStorage.a)
Fruta Esolanging
fuente
¿ prompt()Leerá de STDIN?
tubería
99
¿Un navegador web gráfico tiene un STDIN? No. prompt()aparece una alerta que le pide que ingrese texto y devuelve el resultado.
Dev
55
@Dev Por supuesto, un navegador web gráfico tiene un STDIN, como cualquier otro proceso. Si no puede usarlo desde un idioma específico es otra pregunta y si la respuesta es "No", entonces tal vez pueda usarse en este desafío.
tubería
55
@Dev Los métodos de E / S predeterminados incluyen la entrada a través del indicador de la GUI y la salida a través de la pantalla de la GUI . A menos que OP pretendiera anular el estándar, esto debería ser válido. Lo aclararé.
Esolanging Fruit
2
He editado el desafío para permitir más IO, pero solo lo estoy expandiendo a un subconjunto limitado de los métodos de IO predeterminados. Sin embargo, esta respuesta está dentro de mi subconjunto. Me gusta.
Jared K
19

POSIX shell sh / bash / ... 8 bytes

Tienda:

dd>f

obtener:

dd<f
jofel
fuente
2
Nice one, beats even cat...
cmaster
12

Python 3 , 46 bytes

tienda, 45 bytes:

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

El programa de recuperación es creado por el comando store, un archivo llamado f. ( 1 byte para el nombre del archivo )

ovs
fuente
2
¿Seguramente puedes usar input()?
Artemis Fowl
@ArtemisFowl input()solo recibe hasta la primera línea nueva. open(0).readlee todo STDIN
Jo King
Probablemente publicaste cuando las cosas aún eran ambiguas, pero tal como está esta respuesta no cumple con las especificaciones actuales. Originalmente pretendía que el requisito STDIN / STDOUT fuera estricto, con valores predeterminados no permitidos. Lo he expandido, pero solo a un subconjunto de los valores predeterminados. Su programa de recuperación, si no usa STDOUT, aún necesita mostrar la salida en la pantalla. Si permitiera los valores predeterminados completos, la solución para cada idioma sería 'toma entrada en un archivo', 'da salida en un archivo', cero bytes.
Jared K
@JaredK No creo que entiendas cómo funciona esto. El storeprograma lee la entrada de STDIN y luego almacena un programa Python que imprime esta entrada f. Ejemplo: STORE se llama con una entrada de abc. Luego escribe print('abc')a f. Si ahora llama f(RECUPERAR), se imprime abcen STDOUT.
ovs
@JaredK Le pregunté en un comentario si estaba permitido que STORE modificara RETRIEVE.
ovs
10

Lote, 16 bytes

COPY CON A
TYPE A
l4m2
fuente
8

Powershell - 4 bytes

Almacenamiento:

ac

(alternativa también sc)

Recuperación

gc

Editar: Acabo de notar que la salida no tiene permitida ninguna entrada del usuario ... por lo que salta de 4 a 6 u 8 bytes

Almacenamiento:

ac f

(alternativa también sc f) para la versión de 8 bytes

ac

(y especificar fcomo ruta) para la versión de 6 bytes

Recuperación

gc f
Heiko Hatzfeld
fuente
8

Óxido, 136 bytes

Almacenar (84 bytes)

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

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

Recuperar (52 bytes)

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

Expresiones de gratitud

Jakob
fuente
1
Puede guardar un byte cambiando la importación a use std::{io::*,fs::*}y luego usando en writelugar de std::fs::write.
Esolanging Fruit
¿Qué tal write("a",String::from_iter(stdin().chars()))?
Bergi
@Bergi Nice. Pero se charsdesencadena error[E0658]: use of unstable library feature 'io'en óxido estable.
Jakob
Hm, parece que chars()está en desuso a favor de String::from_utf8(stdin().bytes()). (También usé los documentos nocturnos, no estoy seguro de si ese es el culpable)
Bergi
@Bergi Intenté algunas variaciones con bytes()o chars()pero ninguna de ellas fue muy corta porque el elemento iterador está envuelto io::Result.
Esolanging Fruit
8

Golpetazo, 12 11 10 bytes

Tienda, 7 6 5 bytes

cat ->f# no es necesario -, stdin es predeterminado

cat >f# no necesita espacio, también se >separa

cat>f

recuperar, 5 bytes

cat f
Pelle
fuente
1
No es necesario -en el programa de la tienda.
Konrad Rudolph el
2
¡Tampoco es necesario el espacio entre "gato" y ">"!
psmears
Debería poder hacer lo mismo que en la publicación de zsh para escribir y usar >f. Sin <fembargo, no estoy seguro de si es válido para leer.
allo
@allo Al menos en Cygwin, >ffunciona como echo '' > f(vaciar el archivo si existe, crear si no existe), mientras que <fparece ser un no-op.
sundar - Restablecer Monica
7

HP 49G RPL, 48 bytes

Para guardar: :2: A DUP PURGE STO26,5 bytes

Para restaurar: :2: A RCL21,5 bytes

Si podemos dejar la batería de respaldo, obtenemos:

HP 49G RPL, 0 bytes

Para guardar: 0 bytes

Para restaurar: 0 bytes, ya que el HP 49G deja la pila intacta en los reinicios.

Jason
fuente
La solución de cero bytes debería funcionar para una variedad de caluclators. Sacaré mis 42 cuando llegue a casa.
SIGSTACKFAULT
Creo que su solución de cero bytes, y las otras que se ejecutan en calculadoras que se reinician de manera no destructiva, no cumplen con dos partes de la pregunta: "Hará dos programas". Lo que tienes es un único programa que sobrevive al reinicio. Y "Almacenar lecturas de STDIN y luego salir sin error". Su programa todavía está esperando que el usuario presione una tecla. La pila y el estado de ejecución de su programa siguen siendo mutables. Creo que eso significa que todavía se está ejecutando y no ha salido.
Jared K
@JaredK La pregunta nunca estipuló que los dos programas no podían ser idénticos. En cuanto a la parte que sale: tradicionalmente en RPL la entrada a los programas se da en la pila. Esa es la entrada estándar.
Jason
1
¿Sobreviviría la pila a un ciclo de energía? Tal vez un apagado suave a través de los botones de la calculadora, pero supongo que no quito la batería. Entonces, tal vez depende de qué es un ciclo de energía.
usuario
1
@usuario No, la pila no sobrevive al reinicio por software (ENCENDIDO + C) o al reinicio por hardware (ENCENDIDO + A + F) (distinto del apagado automático, desplazamiento derecho + ENCENDIDO), a diferencia del almacenamiento en el puerto 2, que es la memoria flash ( y sobrevive reinicio suave y duro). Como la respuesta de TI-BASIC parecía usar esa definición, incluí la respuesta de la pila para completarla.
Jason
6

APL (APLX) , 5 bytes

Tienda: ⍞⍈1
Recuperar:⍇1

 obtener línea de
⍈1 escritura estándar al siguiente componente disponible del archivo número 1

⍇1 lea el primer * último componente del archivo número 1

Sesión de la tienda APLXSesión de recuperación de APLX

* La documentación dice primero pero la experimentación muestra lo último .

Adán
fuente
6

bash, 10 bytes (no competitivos)

touch $@
ls

Los nombres de archivo de Unix pueden contener cualquier carácter, excepto NULy /, y sus nombres pueden tener hasta 255 bytes de longitud, por lo que solo podrá almacenar cadenas de esa longitud (considere que es una limitación del medio de almacenamiento) y que no contengan '/ ' en ellos. Esa es una razón por la que esto no compite, otra es que esto supone que el directorio en el que se ejecuta está vacío (o que lsse permite una salida extraña de ). Todavía quería publicar esto porque parecía una forma genial y no obvia de almacenar información.

Otro en una línea similar, que no tendría las mismas limitaciones de longitud y carácter sería:

35 33 bytes

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

Esto permite el /carácter en la cadena y admite muchos más caracteres (exactamente cuántos depende de la implementación).

(-2 bytes en esto gracias a @Cows quack)

sundar - Restablecer a Monica
fuente
1
IIRC, creo que un grupo en Berkeley creó una vez un sistema de base de datos en la década de 1990 que almacenaba los datos de la columna de la tabla como nombres de archivo (hasta 255 caracteres). Creo que las filas y las tablas eran directorios principales.
David R Tribble
En su respuesta de 35 bytes, puede cambiar la segunda declaración a s/..//. No $se requiere porque todas las demás líneas se eliminan, por lo que esto solo se puede aplicar a la última línea y ^se puede descartar porque la sustitución solo se aplica en la primera coincidencia.
Kritixi Lithos
@Cowsquack Hecho. Gracias por explicar por qué el cambio también funciona.
sundar - Restablecer Monica
Es necesario utilizar "$@", no $@, para evitar quemaduras por espacios en blanco, *, ?, o ~caracteres.
Anders Kaseorg
5

Python 3, 56 bytes

Almacenar (33 bytes)

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

Recuperar (23 bytes)

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

Imprime con una nueva línea final.

Jakob
fuente
por qué no input()en lugar de open(0).read()y omitir end=de print?
MoxieBall
@MoxieBall No estoy seguro de por qué inputno se usó, pero si se omite, end=se agregará una nueva línea al final de la cadena (es decir, no la cadena original) (tal vez)
@NickA Parece que se imprime una nueva línea en la pregunta, de todos modos, así que no creo que eso deba importar ...
MoxieBall
¿Me he vuelto loco o 23 + 33 = 56 (no 54)? Además, ¿por qué no usar input()?
Artemis Fowl
1
@ArtemisFowl Buena captura. En cuanto a input, supongo que la cadena a persistir puede contener nuevas líneas.
Jakob
4

Japt, 46 30 bytes

-16 bytes gracias a Shaggy .

Una de las primeras veces que intenté usar Japt. La evaluación JS puede ser inquieta a veces. Utiliza el navegador window.localStorage.

Almacenar (16 bytes)

Ox`lo¯lSÈSge.P=U

Recuperar (14 bytes)

Ox`lo¯lSÈSge.P
LegionMammal978
fuente
+1 por ser el primero en usar algo distinto al archivo estándar IO Me gusta.
Jared K
1
Bienvenido a Japt! :)
Shaggy
1
Por cierto, puede omitir setItemy getItemcompletamente con localStorage.key. Establecer valor , recuperar valor
Shaggy
@ Shaggy Gracias! El tuyo también evita los personajes de control más extraños.
LegionMammal978
4

Haskell, 46 bytes

Tienda (26 bytes):

getContents>>=writeFile"t"

Recuperar (20 bytes):

readFile"t">>=putStr
nimi
fuente
3

Rubí (26 bytes)

Conjunto (16 bytes)

IO.write'a',gets

Obtener (10 bytes)

IO.read'a'
DarkWiiPlayer
fuente
3

MATLAB (30 bytes)

Conjunto (22 bytes)

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

Puede reducir 4 bytes cambiando a input(''), pero esto requerirá que la entrada esté entre comillas simples:'input string'

Obtener (8 bytes)

load a;a
Oct18 es día de silencio en SE
fuente
3

C (GCC), 98 bytes

Almacenar (46 bytes)

La entrada es a través del primer argumento de línea de comando.

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

Recuperar (52 bytes)

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

Falta de portabilidad

  • Requiere que encajen varios tipos de punteros int.

Expresiones de gratitud

Jakob
fuente
1
Esto requiere una implementación en C donde intpueda contener un puntero, para que la declaración implícita de int fopen()funcione. (por ejemplo, la mayoría de los sistemas de 32 bits, o utilícelo gcc -m32si está en x86-64 para hacer un ejecutable de 32 bits). Y, por cierto, intenté usar Linux sendfiley copy_file_range(2)llamadas al sistema, pero no funcionan desde / hacia un TTY.
Peter Cordes
1
Como está escribiendo funciones, no programas, tal vez podría justificar tomar la cadena de entrada como una función arg permitiendo fputs(fopen()), y read(open(),buf,-1). (La pregunta ahora permite una línea de comando arg como entrada.)
Peter Cordes
La función de 'empalme' de Linux copia de una tubería a un archivo (y viceversa). Si stdin / out son canalizaciones, guardará una llamada de función, a expensas de más parámetros.
CSM
2

APL (Dyalog Unicode) , 18 bytes

Tienda: ¡ ⍞⎕NPUT⎕A 1 Pruébelo en línea!
Recuperar: ¡ ⊃⎕NGET⎕A Pruébelo en línea!

 obtener línea de stdin
⎕NPUT póngalo en un archivo nativo llamado
⎕A alfabeto en mayúsculas 1 y sobrescriba si el archivo existe

 la primera parte (los datos, las siguientes partes son codificación y tipo de final de línea) de
⎕NGET obtener el archivo nativo
⎕A del alfabeto en mayúsculas

Adán
fuente
2

R (27 bytes)

tienda (21 bytes)

x=readLines('stdin')

carga (6 bytes)

cat(x)

Para que esto funcione, el primer script debe invocarse con la opción de línea de comando --savey el segundo con --restore(aunque en modo interactivo esto no es necesario: estas opciones son las predeterminadas).

Esto podría acortarse en 7 bytes si no fuera por el hecho de que un error en R impide que el argumento predeterminado de readLinefuncione en modo no interactivo. En el modo interactivo, es que no es necesario, y la solución, por tanto, sólo utiliza 20 bytes .

Konrad Rudolph
fuente
1
Creo que sería mucho más eficiente usarlo qdirectamente, con el primer programa x=scan(); q("y")y el segundo, xo cat(x)dependiendo de cuán estrictos queramos ser sobre cómo se imprimen las cadenas. Según las reglas de golf de código habituales, también debe contar los argumentos de la línea de comandos, así que agregue bytes para --savey --restore(que mi formulación no necesita)
JDL
@JDL scanno funciona para contenidos arbitrarios, y scan(w='character')es más largo que readLines(). qes innecesario (pero q('y')no funcionaría, tienes que deletrearlo yes). Pensé en usarlo xen el segundo programa, pero esto violaría los requisitos, por lo que yo entiendo.
Konrad Rudolph el
1
puede usar scan(w=""), no necesita deletrear el tipo, scanlo inferirá del tipo de argumento especificado. Para mí, q ("y") funciona como un cierre que induce el ahorro, pero tal vez eso dependa de su versión de R, y posiblemente de si está utilizando Rstudio o no.
JDL
@JDL scan: ¡Oh, bien, la documentación no menciona esto! Desafortunadamente scan, aún se realizará un análisis, por lo que esto no funcionará con todas las entradas. De todos modos, scan('stdin',w='')pasa a ser exactamente la misma longitud que readLines('stdin'). q: R 3.4.4 dice "Error en q (" y "): valor no reconocido de 'guardar'”.
Konrad Rudolph el
Ah, es una cosa de Rstudio: lo probé en Rstudio y por separado en el terminal y solo funcionó en Rstudio.
JDL
2

Java (JDK 10) , 204 bytes

Advertencia: ¡ Sobrescribe las preferencias que haya almacenado cualquier programa Java para su nombre de usuario!

Tienda, 94 Bytes:

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

Pruébalo en línea!

Recupere 110 bytes:

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

Pruébalo en línea!

java S foo
java R
foo

Esto funciona tomando la entrada como un argumento y almacenándola en el almacén de respaldo de preferencias del usuario provisto por java.util.prefs . Sobrescribe el nodo raíz del usuario para guardar un byte al nombrar un nodo. Si desea probarlo de manera no destructiva, ejecútelo desde un nombre de usuario desechable o cambie la clave de "" a un nombre de nodo.

Jared K
fuente
¡Buena idea! Como está utilizando Java 10, puede acortarlos convirtiéndolos en expresiones lambda. Además, si su recuento de bytes no incluye z, debe eliminarlo de los programas y del TIO. Considere colocar una advertencia en la parte superior de la presentación para advertir a las personas. Seguro que el TIO debe tener sus soluciones de 94 y 110 bytes.
Jakob
¡Gracias! Hice tus ediciones sugeridas. No estoy seguro, pero no creo que las expresiones lambda puedan cumplir con las reglas personalizadas de IO para esta pregunta.
Jared K
D'oh Tienes razón, me olvidé de eso.
Jakob
2

C #, 157 bytes

Conjunto, 74 bytes:

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

Obtenga 83 bytes:

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

-1 Bytes gracias a VisualMelon
-2 Bytes gracias a LiefdeWen

raznagul
fuente
Quite ese espacio después "a",, y dudo que esto sea mejor :)
VisualMelon
Puede guardar otro byte usando WriteAllLinesy el segundo a
parámetro
2

Perl 5, 48 26 23 bytes

Escritura, 20 + 1 (-n) bytes

-3 bytes gracias a la mafia

open f,">>f";print f

En realidad, no estoy seguro de esto, pero cumple con los criterios. Para entradas pasadas, solo se contaron las opciones cli, así que eso es lo que voy a hacer.

Lectura, 0 + 2 bytes

perl -pe "" f
Geoffrey H.
fuente
1
¿Por qué anotaste -necon 1 (también debería tener un e), pero -pecon 2? Podrías usar -Ey en saylugar de print.
simbabque
Gracias por informarme -E, no estaba familiarizado con eso. En cuanto a por qué no fui -ne, es porque para eso, en realidad estoy corriendo desde un archivo. Entonces, parecería que perl -n w.plsi esto va en contra de los estándares de la comunidad PCG, puedo editar mi respuesta en consecuencia.
Geoffrey H.
No, esta bien. Agregamos un malus para argumentos de línea de comando adicionales, por lo que está bien.
simbabque
2
">>","f"-> ">>f"ahorra 3 char
mob
1

Agregado , 23 + 16 = 39 bytes

Simplemente escribe STDIN en el archivo A, luego lee el archivo A.

store.@:

$A&FileWrite!AllInput[]

retrieve.@:

Echo!FileRead!$A

Pruebas

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

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

Lua, 57 53 51 bytes

Tienda, 27 bytes

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

Recuperar, 24 bytes

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

RUBÍ

Almacenar (24 bytes)

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

Recuperar (16 bytes)

p File.read('a')
Gregory
fuente
44
La pregunta es para el almacenamiento de entrada de STDIN, no los argumentos
Ferrybig
Desde entonces he editado para permitir alternativas IO incluyendo argumentos.
Jared K
1
File.write'a',getsy p File.read'a'son un poco más cortos;)
DarkWiiPlayer
1

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

Tienda, 27 23 bytes

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

Recuperar, 27 23 bytes

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

Esto básicamente envuelve la respuesta de jofel en un programa en C.

Nota: Los ddcomandos generan algunas estadísticas stderr, por lo que verá algunos resultados adicionales cuando lo ejecute ingenuamente en el shell. Sin embargo, ya que el desafío sólo dice que la cadena almacenada debe ser presentada en stdout, no stderr, lo tomo que se le permite tener salida adicional en stderr... De todos modos, la supresión de stderrla producción es tan fácil como cambiar ddcon cat, el aumento de la cantidad de bytes de la dos programas por uno, cada uno.

cmaster
fuente
Dependiendo de su compilador, también puede eliminar el inttipo de retorno main. En el antiguo estilo ANSI C intes el tipo de retorno predeterminado.
Jakob
@Jakob Ah, sí, por supuesto. Confié conscientemente en la declaración implícita de system()y me olvidé de eso de main()- ay. Gracias por señalarlo :-)
cmaster
1

PHP, 26 + 1 + 21 = 48 bytes

Store.php:

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

Corre con echo <input> | php -nF Store.php.

Retrieve.php:

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

Corre con php -n Retrieve.php.

Titus
fuente
1

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

Compila con solo algunas advertencias en mi gcc.

store.c

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

Probablemente pueda incluir el golf, pero no pude entender cómo. Segfaults si no le pasa nada, pero lo que sea.

Peter Cordes: -1

leer.c

main(){system("cat f");}
SIGSTACKFAULT
fuente
int*f=fopendebería funcionar, es decir, mentirle al compilador sobre el tipo de puntero. Pero solo si compila para un sistema de 32 bits (es decir, uno donde intpuede contener un puntero, como gcc -m32, o simplemente gccen un sistema completo de 32 bits). También puede declarar main como main(int c,char**v), o tal vez int**vporque no está desreferenciando.
Peter Cordes
Los main(int c,char**v)trabajos. También me di cuenta de que puedo hacerlo fputs(v[1],fopen("f","w"), aunque todavía necesita stdio por alguna razón.
SIGSTACKFAULT
Debería funcionar si compila un ejecutable de 32 bits. Para x86-64, el compilador truncará el intvalor de retorno a 32 bits, luego lo extenderá como un puntero. Si el retorno FILE*está en los 32 bits bajos, funcionaría, pero ese no es el caso en Linux x86-64.
Peter Cordes
Si está en un sistema donde todos los punteros son del mismo tamaño (más bien probable), puede evitar la inclusión declarando fopenmanualmente. Yendo de la vieja escuela con los argumentos ahorra algunos bytes demasiado: *fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}.
Gastropner
1

Lote: 11 bytes

%12>f
type f

La entrada se recibe como un argumento de línea de comandos y persiste (con el mensaje de error creado al intentar la ejecución, ya que CMD intenta ejecutar el parámetro) en f.


Lote: 7 bytes (no competitivo)

'>%1
dir

Hay una gran cantidad de caracteres no válidos en un nombre de archivo, por lo que esto no funcionaría para algunas cadenas, pero esto esencialmente guarda un carácter arbitrario en el nombre de archivo dado por el parámetro. Para leerlo, solo enumera todos los archivos en el directorio, incluida nuestra cadena.

GetHacked
fuente
1
Su solución parece salir en STDOUT, que es válida. STDERR es solo otra opción, no requerida. Las citas alrededor de la entrada no impiden que compita. La única pregunta es si deben contarse en su recuento de bytes. Creo que no, ya que no son específicos de la pregunta. Parecen una plantilla estándar para que Batch tome una línea de comando arg, que no es tan diferente de los idiomas que necesitan banderas de línea de comando estándar. Quizás alguien más con conocimiento de Batch intervenga. Por ahora, déjelos fuera del recuento de bytes. ¡Bienvenido a Code Golf! :)
Jared K