Seus programas:
Você escreverá dois programas (ambos no mesmo idioma). O programa de armazenamento pega uma sequência de STDIN e a armazena em algum lugar persistente (veja abaixo) e sai sem erro. O programa de recuperação não recebe entrada, recupera a sequência que foi armazenada e a imprime em STDOUT.
Teste objetivo de persistência:
Você deve poder executar o programa de armazenamento em sua máquina local, depois ligar e ligar a máquina local e depois chamar o programa de recuperação em sua máquina local. Você pode esconder a string da maneira que desejar (mesmo na Web), desde que passe no teste de reinicialização.
Casos de teste:
Armazenamento e recuperação:
echo foo | Store
Retrieve
foo
Lojas repetidas devem substituir (como um método set ()):
echo foo | Store
echo bar | Store
Retrieve
bar
A recuperação repetida não é destrutiva (como um método get ()):
echo foo | Store
Retrieve
foo
Retrieve
foo
Recuperação antes de qualquer invocação do Armazenamento:
Você não precisa se preocupar com isso. Seu programa de recuperação pode assumir que o programa de armazenamento foi executado em algum momento no passado.
Flexibilidade de entrada / saída.
As pessoas me pediram para expandir isso de STDIN / STDOUT estrito para as regras de IO padrão. Não posso, porque introduziria muitas brechas. Algumas opções de IO padrão já têm a entrada armazenada de maneira persistente, por exemplo, "programas podem receber entrada de um arquivo". Eu gostaria de ser mais flexível do que apenas STDIN e STDOUT, mas sem abrir as comportas.
No segmento de regras de IO padrão, eu estou escolhendo aqueles que não quebram o desafio:
Os programas podem receber informações por meio de prompts da GUI e de linha de comando, se você desejar
Os programas podem ser exibidos exibindo-os na tela Isso inclui caixas de diálogo da GUI
Os programas podem receber informações via argumentos da linha de comando
Os programas podem ser enviados para STDERR, mas ainda não podem realmente gerar erros.
Se você usar uma alternativa, ela deve ser interativa. O usuário não deveria ter que fazer nenhum outro trabalho além de canalizar a entrada para o seu programa, digitando-a em um prompt fornecido pelo programa ou digitando a entrada como um argumento de linha de comando do seu programa. O usuário não precisa fazer nada além de executar o programa de recuperação para ver a saída exibida na tela ou enviada para STDOUT ou STDERR.
Premissas permitidas:
- Seus dois programas serão executados no mesmo diretório
- Seus programas têm permissões de leitura e gravação para esse diretório
- Os arquivos criados sobreviverão à reinicialização (não em um diretório temporário)
- Uma nova linha à direita que não fazia parte da sequência é permitida. Nenhum outro espaço em branco à direita
echo $@>x
ecat x
é válido?Store
?Respostas:
zsh, 4 bytes
Armazenar:
>f
(lê de STDIN e grava em um arquivo chamadof
)Recuperar:
<f
(grava o conteúdo def
em STDOUT)fonte
TI-BASIC (Z80), 1 byte ?
Armazenar:
(basta digitar a sequência)
Recuperar:
Ans
(byte 27)Mas se isso não for válido:
TI-BASIC (Z80),
76 bytes-1 graças a Jakob.
Armazenar:
Prompt Str0
(bytes DD AA 09)Recuperar:
disp Str0
(bytes ED AA 09)fonte
Ans
e persistir na mesma variável? Um programa de armazenamento vazio e apenasAns
para recuperação deve funcionar: 1 byte!Ans
persiste. De fato, muitos estados persistem, incluindo (acho) todas as variáveis, equações e histórico do usuário. Do ponto de vista do usuário, desligar é basicamente o equivalente da calculadora da TI a um estado de suspensão para um PC, para que não atrapalhe muito.JS do navegador, 44 bytes
Loja :
Recuperar :
fonte
prompt()
ler do STDIN?prompt()
Exibe um alerta que solicita a inserção de texto e retorna o resultado.Shell POSIX sh / bash / ... 8 bytes
loja:
pegue:
fonte
cat
...Python 3 , 46 bytes
armazenamento, 45 bytes:
O programa de recuperação é construído pelo comando loja, um arquivo chamado
f
. ( 1 byte para o nome do arquivo )fonte
input()
?input()
recebe apenas até a primeira nova linha.open(0).read
lê tudo STDINstore
programa-lê a entrada do STDIN e, em seguida, armazena um programa Python que imprime essa entradaf
. Exemplo: STORE é chamado com uma entrada deabc
. Em seguida, escreveprint('abc')
paraf
. Se você ligar agoraf
(RETRIEVE), ele será impressoabc
em STDOUT.Lote, 16 bytes
fonte
Powershell - 4 bytes
Armazenamento:
(alternativa também
sc
)Recuperação
Edit: Acabei de notar que a saída não é permitida nenhuma entrada do usuário ... por isso salta de 4 para 6 ou 8 bytes
Armazenamento:
(alternativa também
sc f
) para a versão de 8 bytes(e especifique
f
como caminho) para a versão de 6 bytesRecuperação
fonte
Ferrugem, 136 bytes
Armazenar (84 bytes)
Recuperar (52 bytes)
Agradecimentos
fonte
use std::{io::*,fs::*}
e, em seguida, usando emwrite
vez destd::fs::write
.write("a",String::from_iter(stdin().chars()))
?chars
desencadeiaerror[E0658]: use of unstable library feature 'io'
uma ferrugem estável.chars()
foi preterido em favor deString::from_utf8(stdin().bytes())
. (Também eu usei os docs noturnos, não tenho certeza se isso é o culpado)bytes()
ouchars()
nenhuma delas era muito curta porque o item do iterador está envolvidoio::Result
.Bater,
12 1110 bytesloja,
7 65 bytes# não há necessidadecat ->f
-
, stdin é o padrão# não há necessidade de espaço,cat >f
>
separa tambémrecuperar, 5 bytes
fonte
-
no programa da loja.>f
. Não tenho certeza se<f
é válido para leitura, no entanto.>f
funciona comoecho '' > f
(esvaziar o arquivo, se existir, criar, se não existir), enquanto<f
parece não funcionar.HP 49G RPL, 48 bytes
Para salvar
:2: A DUP PURGE STO
:, 26,5 bytesPara restaurar
:2: A RCL
:, 21,5 bytesSe pudermos deixar a bateria de reserva, obteremos:
HP 49G RPL, 0 bytes
Para salvar
:, 0 bytes
Para restaurar
:, 0 bytes, uma vez que o HP 49G deixa a pilha intocada nas reinicializações.
fonte
APL (APLX) , 5 bytes
Loja:
⍞⍈1
Recupere:
⍇1
⍞
obter linha da⍈1
gravação stdin para o próximo componente disponível do número de arquivo 1⍇1
leia oprimeiro* último componente do número de arquivo 1* A documentação diz primeiro, mas a experimentação mostra por último .
fonte
bash, 10 bytes (não concorrente)
Os nomes de arquivos Unix podem conter qualquer caractere, exceto
NUL
e/
, e seus nomes podem ter até 255 bytes de comprimento, portanto, será possível armazenar apenas cadeias de caracteres com esse comprimento (considere uma limitação do meio de armazenamento) e que não contenham '/ ' neles. Essa é uma razão pela qual não é concorrente; outra é que isso pressupõe que o diretório em que está sendo executado esteja vazio (ou que saída estranhals
seja permitida). Eu ainda queria postar isso porque parecia uma maneira legal e não óbvia de armazenar informações.Outro na mesma linha, que não teria as mesmas limitações de comprimento e caráter, seria:
3533 bytesIsso permite o
/
caractere na string e suporta muitos outros caracteres (exatamente quantos dependem da implementação).(-2 bytes sobre isso graças ao charlatão @ Vacas)
fonte
s/..//
. Não$
é necessário porque todas as outras linhas são excluídas, portanto, isso só pode ser aplicado à última linha e^
pode ser descartado porque a substituição é aplicada apenas na primeira correspondência."$@"
, não$@
, para evitar queimaduras por espaços em branco,*
,?
, ou~
caracteres.Python 3, 56 bytes
Armazenar (33 bytes)
Recuperar (23 bytes)
Imprime com uma nova linha à direita.
fonte
input()
, em vez deopen(0).read()
e omitirend=
a partir deprint
?input
não foi utilizado, mas omitindoend=
resultaria em uma nova linha que está sendo adicionado ao final da cadeia (ou seja, não a string original) (talvez)input()
?input
, suponho que a string a persistir possa conter novas linhas.Japonês,
4630 bytes-16 bytes graças a Shaggy .
Uma das primeiras vezes que tentei usar o Japt. O JS eval pode às vezes ser inquieto. Usa o navegador
window.localStorage
.Armazenar (16 bytes)
Recuperar (14 bytes)
fonte
setItem
egetItem
completamente comlocalStorage.key
. Definir valor , recuperar valorHaskell, 46 bytes
Armazenar (26 bytes):
Recuperar (20 bytes):
fonte
Ruby (26 bytes)
Conjunto (16 bytes)
Obter (10 bytes)
fonte
MATLAB (30 bytes)
Conjunto (22 bytes)
Pode cortar 4 bytes alterando para
input('')
, mas isso exigirá que a entrada esteja entre aspas simples:'input string'
Obter (8 bytes)
fonte
C (GCC), 98 bytes
Armazenar (46 bytes)
A entrada é via primeiro argumento de linha de comando.
Recuperar (52 bytes)
Inportabilidade
int
.Agradecimentos
fonte
int
pode conter um ponteiro, para que a declaração implícita deint fopen()
funcione. (por exemplo, a maioria dos sistemas de 32 bits ou usegcc -m32
se você estiver no x86-64 para tornar um executável de 32 bits.) E, BTW, tentei usar as chamadas do Linuxsendfile
e docopy_file_range(2)
sistema, mas elas não funcionam para / de um TTY.fputs(fopen())
, eread(open(),buf,-1)
. (A questão agora permite uma arg-linha de comando como entrada.)APL (Dyalog Unicode) , 18 bytes
Loja:
⍞⎕NPUT⎕A 1
Experimente online!Recuperar:
⊃⎕NGET⎕A
Experimente online!⍞
get line from stdin⎕NPUT
coloque-o em um arquivo nativo chamado⎕A
alfabeto maiúsculo1
e sobrescreva se o arquivo existir⊃
a primeira parte (os dados, as próximas partes são do tipo de codificação e final de linha) de⎕NGET
obter o arquivo nativo com⎕A
o alfabeto maiúsculofonte
R (27 bytes)
armazenamento (21 bytes)
carga (6 bytes)
Para que isso funcione, o primeiro script precisa ser chamado com a opção de linha de comando
--save
e o segundo com--restore
(embora no modo interativo isso não seja necessário: essas opções são o padrão).Isso poderia ser reduzido em 7 bytes, não fosse o fato de um bug no R impedir o argumento padrão de
readLine
funcionar no modo não interativo. No modo interactivo, que é não necessário, e a solução, por conseguinte, utiliza apenas 20 bytes .fonte
q
diretamente, com o primeiro programa sendox=scan(); q("y")
o segundox
oucat(x)
dependendo ou quão rigorosos queremos ser sobre como as strings são impressas. Pelas regras habituais de golfe código também deve contar argumentos de linha de comando, de modo add bytes para--save
e--restore
(que minha formulação não precisa)scan
não funciona com conteúdo arbitrário escan(w='character')
é maior quereadLines()
.q
é desnecessário (masq('y')
não funcionaria, você deve soletraryes
). Pensei em usarx
no segundo programa, mas isso violaria os requisitos, tanto quanto eu os entendo.scan(w="")
, não precisa especificar o tipo,scan
deduzirá a partir do tipo de argumento especificado. Para mim, q ("y") funciona como uma saída indutora de economia, mas talvez isso dependa da sua versão do R e, possivelmente, se você estiver usando o Rstudio ou não.scan
: Oh, pura, a documentação não menciona isso! Infelizmentescan
, ainda será realizada uma análise para que isso não funcione com todas as entradas. De qualquer forma,scan('stdin',w='')
passa a ter exatamente o mesmo comprimento quereadLines('stdin')
.q
: R 3.4.4 diz “Erro em q (" y "): valor não reconhecido de 'save'”.Java (JDK 10) , 204 bytes
Aviso: Substitui as preferências que os programas java armazenaram para o seu nome de usuário!
Loja, 94 bytes:
Experimente online!
Recupere 110 bytes:
Experimente online!
Isso funciona usando a entrada como argumento e armazenando-a no repositório de preferências do usuário fornecido pelo java.util.prefs . Ele substitui o nó raiz do usuário para economizar um byte ao nomear um nó. Se você quiser testá-lo de forma não destrutiva, execute-o com um nome de usuário descartável ou altere a chave de "" para o nome do nó.
fonte
z
você deverá removê-la dos programas e do TIO. Considere colocar um aviso na parte superior do envio para avisar as pessoas. Com certeza, o TIO deve ter suas soluções de 94 e 110 bytes.C #, 157 bytes
Conjunto, 74 bytes:
Obter, 83 bytes:
-1 Bytes graças ao VisualMelon
-2 Bytes graças ao LiefdeWen
fonte
"a",
, e eu duvido que isso vai ser batido :)WriteAllLines
e o segundo parâmetroa
Perl 5,
482623 bytesGravação, 20 + 1 (-n) bytes
-3 bytes graças ao mob
Na verdade, não tenho certeza sobre isso, mas atende aos critérios. Para entradas passadas, apenas as opções cli foram contadas, e é com isso que eu vou.
Leitura, 0 + 2 bytes
fonte
-ne
com 1 (também deveria tere
), mas-pe
com 2? Você poderia usar-E
e emsay
vez deprint
.-E
, eu não estava familiarizado com isso. Quanto ao motivo de eu não ter concordado-ne
, é porque, nesse caso, estou na verdade executando a partir de um arquivo. Portanto, parece que,perl -n w.pl
se isso for contra os padrões da comunidade PCG, posso editar minha resposta de acordo.">>","f"
->">>f"
salva 3 charAnexo , 23 + 16 = 39 bytes
Simplesmente escreve STDIN no arquivo
A
e depois lê o arquivoA
.store.@
:retrieve.@
:Testando
fonte
Lua,
575351 bytesArmazenar, 27 bytes
Recuperar, 24 bytes
fonte
RUBI
Armazenar (24 bytes)
Recuperar (16 bytes)
fonte
File.write'a',gets
ep File.read'a'
são um pouco mais curtos;);C (Unix / GNU), 23 + 23 = 46 bytes
Loja,
2723 bytesRecuperar,
2723 bytesIsso basicamente envolve a resposta de Jofel em um programa em C.
Nota: Os
dd
comandos emitem algumas estatísticas parastderr
, portanto, você verá alguma saída adicional quando executá-la ingenuamente no shell. No entanto, uma vez que o desafio só diz que a corda armazenado deve ser apresentado emstdout
, nãostderr
, eu levá-la de que está autorizado a ter saída adicional emstderr
... De qualquer forma, suprimindostderr
saída é tão fácil como a substituiçãodd
comcat
, aumentando a contagem de bytes do dois programas por um, cada um.fonte
int
tipo de retornomain
. No estilo ANSI C antigo,int
é o tipo de retorno padrão.system()
e esqueci-me da demain()
- ai. Obrigado por apontar isso :-)PHP, 26 + 1 + 21 = 48 bytes
Store.php:
Corra com
echo <input> | php -nF Store.php
.Retrieve.php:
Corra com
php -n Retrieve.php
.fonte
C (gcc) ,
7767 + 25 = 92 bytesCompila com apenas alguns avisos no meu gcc.
store.c
Provavelmente posso jogar fora o include, mas não consegui descobrir como. Segfaults se você não passar nada, mas tanto faz.
Peter Cordes: -1
read.c
fonte
int*f=fopen
deve funcionar, ou seja, minta para o seu compilador sobre o tipo de ponteiro. Mas somente se você compilar para um sistema de 32 bits (por exemplo, um ondeint
possa reter um ponteiro, comogcc -m32
, ou apenasgcc
em um sistema totalmente de 32 bits). Você também pode declarar main comomain(int c,char**v)
, ou talvezint**v
porque não esteja fazendo o cancelamento da referência.main(int c,char**v)
trabalhos. Também percebi que posso fazerfputs(v[1],fopen("f","w")
, embora ainda precise de stdio por algum motivo.int
valor de retorno para 32 bits e o estenderá como um ponteiro. Se o retornoFILE*
estiver nos 32 bits baixos, funcionaria, mas não é o caso no Linux x86-64.fopen
manualmente. Indo velha escola com os argumentos poupa alguns bytes também:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
.Lote - 11 bytes
A entrada é recebida como argumento da linha de comando e persiste (com a mensagem de erro criada na tentativa de execução, pois o CMD tenta executar o parâmetro) em
f
.Lote - 7 bytes (não competitivo)
Há uma infinidade de caracteres inválidos em um nome de arquivo, portanto, isso não funcionaria para algumas seqüências de caracteres, mas isso salva um caractere arbitrário no nome do arquivo fornecido pelo parâmetro. Para lê-lo, apenas lista todos os arquivos no diretório, incluindo nossa string.
fonte