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:
Los programas pueden recibir información a través de indicaciones de la GUI y de la línea de comandos si lo desea
Los programas pueden aparecer mostrándolos en la pantalla Esto incluye cuadros de diálogo de GUI
Los programas pueden recibir información a través de argumentos de línea de comandos
Los programas pueden salir a STDERR pero aún no pueden arrojar errores.
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
echo $@>x
ycat x
válido?Store
?Respuestas:
zsh, 4 bytes
Almacenar:
>f
(lee de STDIN y escribe en un archivo llamadof
)Recuperar:
<f
(escribe el contenido def
STDOUT)fuente
TI-BASIC (Z80), 1 byte ?
Almacenar:
(solo ingrese la cadena)
Recuperar:
Ans
(byte 27)Pero si eso no es válido:
TI-BASIC (Z80),
76 bytes-1 gracias a Jakob.
Almacenar:
Prompt Str0
(bytes DD AA 09)Recuperar:
disp Str0
(bytes ED AA 09)fuente
Ans
y persistir en la misma variable? Un programa de tienda vacío y soloAns
para recuperar debería funcionar: ¡1 byte!Ans
persiste. 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.Navegador JS, 44 bytes
Tienda :
Recuperar :
fuente
prompt()
Leerá de STDIN?prompt()
aparece una alerta que le pide que ingrese texto y devuelve el resultado.POSIX shell sh / bash / ... 8 bytes
Tienda:
obtener:
fuente
cat
...Python 3 , 46 bytes
tienda, 45 bytes:
El programa de recuperación es creado por el comando store, un archivo llamado
f
. ( 1 byte para el nombre del archivo )fuente
input()
?input()
solo recibe hasta la primera línea nueva.open(0).read
lee todo STDINstore
programa lee la entrada de STDIN y luego almacena un programa Python que imprime esta entradaf
. Ejemplo: STORE se llama con una entrada deabc
. Luego escribeprint('abc')
af
. Si ahora llamaf
(RECUPERAR), se imprimeabc
en STDOUT.Lote, 16 bytes
fuente
Powershell - 4 bytes
Almacenamiento:
(alternativa también
sc
)Recuperación
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:
(alternativa también
sc f
) para la versión de 8 bytes(y especificar
f
como ruta) para la versión de 6 bytesRecuperación
fuente
Óxido, 136 bytes
Almacenar (84 bytes)
Recuperar (52 bytes)
Expresiones de gratitud
fuente
use std::{io::*,fs::*}
y luego usando enwrite
lugar destd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
desencadenaerror[E0658]: use of unstable library feature 'io'
en óxido estable.chars()
está en desuso a favor deString::from_utf8(stdin().bytes())
. (También usé los documentos nocturnos, no estoy seguro de si ese es el culpable)bytes()
ochars()
pero ninguna de ellas fue muy corta porque el elemento iterador está envueltoio::Result
.Golpetazo,
12 1110 bytesTienda,
7 65 bytes# no es necesariocat ->f
-
, stdin es predeterminado# no necesita espacio, también secat >f
>
separarecuperar, 5 bytes
fuente
-
en el programa de la tienda.>f
. Sin<f
embargo, no estoy seguro de si es válido para leer.>f
funciona comoecho '' > f
(vaciar el archivo si existe, crear si no existe), mientras que<f
parece ser un no-op.HP 49G RPL, 48 bytes
Para guardar:
:2: A DUP PURGE STO
26,5 bytesPara restaurar:
:2: A RCL
21,5 bytesSi 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.
fuente
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 elprimer* último componente del archivo número 1* La documentación dice primero pero la experimentación muestra lo último .
fuente
bash, 10 bytes (no competitivos)
Los nombres de archivo de Unix pueden contener cualquier carácter, excepto
NUL
y/
, 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 quels
se 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:
3533 bytesEsto 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)
fuente
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."$@"
, no$@
, para evitar quemaduras por espacios en blanco,*
,?
, o~
caracteres.Python 3, 56 bytes
Almacenar (33 bytes)
Recuperar (23 bytes)
Imprime con una nueva línea final.
fuente
input()
en lugar deopen(0).read()
y omitirend=
deprint
?input
no 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)input()
?input
, supongo que la cadena a persistir puede contener nuevas líneas.Japt,
4630 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)
Recuperar (14 bytes)
fuente
setItem
ygetItem
completamente conlocalStorage.key
. Establecer valor , recuperar valorHaskell, 46 bytes
Tienda (26 bytes):
Recuperar (20 bytes):
fuente
Rubí (26 bytes)
Conjunto (16 bytes)
Obtener (10 bytes)
fuente
MATLAB (30 bytes)
Conjunto (22 bytes)
Puede reducir 4 bytes cambiando a
input('')
, pero esto requerirá que la entrada esté entre comillas simples:'input string'
Obtener (8 bytes)
fuente
C (GCC), 98 bytes
Almacenar (46 bytes)
La entrada es a través del primer argumento de línea de comando.
Recuperar (52 bytes)
Falta de portabilidad
int
.Expresiones de gratitud
fuente
int
pueda contener un puntero, para que la declaración implícita deint fopen()
funcione. (por ejemplo, la mayoría de los sistemas de 32 bits, o utilícelogcc -m32
si está en x86-64 para hacer un ejecutable de 32 bits). Y, por cierto, intenté usar Linuxsendfile
ycopy_file_range(2)
llamadas al sistema, pero no funcionan desde / hacia un TTY.fputs(fopen())
, yread(open(),buf,-1)
. (La pregunta ahora permite una línea de comando arg como entrada.)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úsculas1
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úsculasfuente
R (27 bytes)
tienda (21 bytes)
carga (6 bytes)
Para que esto funcione, el primer script debe invocarse con la opción de línea de comando
--save
y 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
readLine
funcione en modo no interactivo. En el modo interactivo, es que no es necesario, y la solución, por tanto, sólo utiliza 20 bytes .fuente
q
directamente, con el primer programax=scan(); q("y")
y el segundo,x
ocat(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--save
y--restore
(que mi formulación no necesita)scan
no funciona para contenidos arbitrarios, yscan(w='character')
es más largo quereadLines()
.q
es innecesario (peroq('y')
no funcionaría, tienes que deletrearloyes
). Pensé en usarlox
en el segundo programa, pero esto violaría los requisitos, por lo que yo entiendo.scan(w="")
, no necesita deletrear el tipo,scan
lo 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.scan
: ¡Oh, bien, la documentación no menciona esto! Desafortunadamentescan
, 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 quereadLines('stdin')
.q
: R 3.4.4 dice "Error en q (" y "): valor no reconocido de 'guardar'”.Java (JDK 10) , 204 bytes
Advertencia: ¡ Sobrescribe las preferencias que haya almacenado cualquier programa Java para su nombre de usuario!
Tienda, 94 Bytes:
Pruébalo en línea!
Recupere 110 bytes:
Pruébalo en línea!
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.
fuente
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.C #, 157 bytes
Conjunto, 74 bytes:
Obtenga 83 bytes:
-1 Bytes gracias a VisualMelon
-2 Bytes gracias a LiefdeWen
fuente
"a",
, y dudo que esto sea mejor :)WriteAllLines
y el segundoa
Perl 5,
482623 bytesEscritura, 20 + 1 (-n) bytes
-3 bytes gracias a la mafia
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
fuente
-ne
con 1 (también debería tener une
), pero-pe
con 2? Podrías usar-E
y ensay
lugar deprint
.-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 queperl -n w.pl
si esto va en contra de los estándares de la comunidad PCG, puedo editar mi respuesta en consecuencia.">>","f"
->">>f"
ahorra 3 charAgregado , 23 + 16 = 39 bytes
Simplemente escribe STDIN en el archivo
A
, luego lee el archivoA
.store.@
:retrieve.@
:Pruebas
fuente
Lua,
575351 bytesTienda, 27 bytes
Recuperar, 24 bytes
fuente
RUBÍ
Almacenar (24 bytes)
Recuperar (16 bytes)
fuente
File.write'a',gets
yp File.read'a'
son un poco más cortos;)C (Unix / GNU), 23 + 23 = 46 bytes
Tienda,
2723 bytesRecuperar,
2723 bytesEsto básicamente envuelve la respuesta de jofel en un programa en C.
Nota: Los
dd
comandos generan algunas estadísticasstderr
, 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 enstdout
, nostderr
, lo tomo que se le permite tener salida adicional enstderr
... De todos modos, la supresión destderr
la producción es tan fácil como cambiardd
concat
, el aumento de la cantidad de bytes de la dos programas por uno, cada uno.fuente
int
tipo de retornomain
. En el antiguo estilo ANSI Cint
es el tipo de retorno predeterminado.system()
y me olvidé de eso demain()
- ay. Gracias por señalarlo :-)PHP, 26 + 1 + 21 = 48 bytes
Store.php:
Corre con
echo <input> | php -nF Store.php
.Retrieve.php:
Corre con
php -n Retrieve.php
.fuente
C (gcc) ,
7767 + 25 = 92 bytesCompila con solo algunas advertencias en mi gcc.
store.c
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
fuente
int*f=fopen
deberí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 dondeint
puede contener un puntero, comogcc -m32
, o simplementegcc
en un sistema completo de 32 bits). También puede declarar main comomain(int c,char**v)
, o tal vezint**v
porque no está desreferenciando.main(int c,char**v)
trabajos. También me di cuenta de que puedo hacerlofputs(v[1],fopen("f","w")
, aunque todavía necesita stdio por alguna razón.int
valor de retorno a 32 bits, luego lo extenderá como un puntero. Si el retornoFILE*
está en los 32 bits bajos, funcionaría, pero ese no es el caso en Linux x86-64.fopen
manualmente. Yendo de la vieja escuela con los argumentos ahorra algunos bytes demasiado:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Lote: 11 bytes
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)
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.
fuente