您语言中最短的代码,可在重新启动后保留字符串


48

您的程序:

您将编写两个程序(都使用相同的语言)。存储程序从STDIN中获取一个字符串,并将其存储在持久的位置(请参见下文),然后无错误退出。检索程序不输入任何内容,检索存储的字符串,然后将其打印到STDOUT。

持久性的客观测试:

您应该能够在本地计算机上运行存储程序,然后重新启动本地计算机,然后调用本地计算机上的检索程序。只要通过此重新启动测试,就可以随意存储字符串(即使在Web上)。

测试用例:

存储然后检索:

echo foo | Store
Retrieve
foo

重复存储应覆盖(如set()方法):

echo foo | Store
echo bar | Store
Retrieve
bar

重复检索是非破坏性的(例如get()方法):

echo foo | Store
Retrieve
foo
Retrieve
foo

在调用存储之前进行检索:

您无需为此担心。您的检索程序可以假定该存储程序已在过去的某个时间运行。

输入/输出灵活性。

人们要求我将其从严格的STDIN / STDOUT扩展到标准IO规则。我不能,因为这会引入太多漏洞。一些标准IO选项已经以持久方式存储了输入,例如“程序可以从文件中获取输入”。我想比严格的STDIN和STDOUT更灵活,但不要打开闸门。

从标准的IO规则线程中,我正在挑选那些不会克服挑战的规则:

如果使用备用选项,则必须是用户交互的。除了将输入输入到程序中,将其输入程序提供的提示中或将输入作为程序的命令行参数输入之外,用户无需执行任何其他工作。除了运行您的检索程序之外,用户无需执行任何其他操作即可看到屏幕上显示的输出或发送到STDOUT或STDERR的输出。

允许的假设:

  • 您的两个程序将在同一目录中运行
  • 您的程序对该目录具有读写权限
  • 您创建的文件将在重启后保留下来(不在临时目录中)
  • 允许使用不属于字符串的尾随换行符。没有其他尾随空格

这是代码高尔夫球,您的得分是这两个程序的字节总和。


9
所以只是echo $@>xcat x有效?
亚当

1
您的规格没有提及能够多次存储的功能,但是您确实有一个示例案例。我们可以为每次调用假定一个干净的环境Store吗?
亚当

4
@EriktheOutgolfer为什么无效?即使在meta上讨论了一个漏洞,也不能阻止挑战明确允许它。
dylnan '18

6
Web限制通常是关于将内容从网络中拉出作为漏洞,以摆脱创建这些内容的工作。在这种情况下,如果它在网络上,那是因为您做了将其放置在网络上的工作。
Jared K

3
有人需要为具有磁芯内存的计算机编写答案。
标记

Answers:


88

zsh,4个字节

存储:(>f从STDIN读取并写入一个名为的文件f
检索:(<f将的内容写入fSTDOUT)


8
我认为我们有一个赢家。
ADAM

@Adám,除非有令牌将输入的内容写入1个字节中:P
FreezePhoenix

1
@FreezePhoenix除非您现在写一种不被允许的新语言,否则可能没有任何人……
Chromium

4
@Chromium check Z80答案:某些现有语言可以从0字节的程序编写。
心教堂

55

TI-BASIC(Z80),1 个字节

存储:( 只需输入字符串)
检索:(Ans字节27)

但是,如果那是无效的:

TI-BASIC(Z80),7 6 字节

-1感谢雅各布。

存储:(Prompt Str0字节DD AA 09)
检索:(disp Str0字节ED AA 09)


1
您确定这是5个字节吗?
FreezePhoenix

6
@FreezePhoenix TI-Basic使用令牌。
亚当

3
嗯...为什么不接受输入Ans并将其保留在同一变量中?一个空的存储程序,仅Ans用于检索应该起作用:1个字节!
雅各布

9
@Arthur Yep,Ans坚持。实际上,许多状态仍然存在,包括(我认为)所有用户变量,方程式和历史记录。从用户的角度来看,断电基本上相当于TI计算器的PC睡眠状态,因此不会造成太大干扰。
雅各布

2
@JaredK我绝对同意1字节的解决方案散发出规则滥用的味道(即使我是建议这样做的人)。但是,我会说存储程序退出了,因为其他程序可以在它之后运行(尽管它们会干扰解决方案的运行)。我对您的“持久性的客观测试”的解释是,这些程序将在关机后再开机之前直接运行。如果那是不正确的,也许您可​​能需要将1字节的解决方案标记为不竞争?
雅各布

23

浏览器JS,44个字节

店铺

localStorage.a=prompt()

检索

alert(localStorage.a)

prompt()从STDIN读取吗?
管道

9
图形Web浏览器是否具有STDIN?否。会prompt()弹出一个警报,要求您输入文本,并返回结果。
Dev

5
@Dev当然,图形Web浏览器也具有STDIN,就像其他进程一样。如果您不能通过特定语言使用它,这是另一个问题,并且答案为“否”,那么我也许可以在此挑战中使用它。
管道

5
@Dev默认的I / O方法包括通过GUI提示符输入通过GUI显示输出。除非OP打算超越该标准,否则这应该是有效的。我会澄清。
Esolanging Fruit '18

2
我已经编辑了允许更多IO的挑战,但是我只是将其扩展到默认IO方法的有限子集。这个答案虽然在我的子集中。我喜欢。
Jared K

19

POSIX shell sh / bash / ... 8字节

商店:

dd>f

得到:

dd<f

2
好人,甚至击败cat...
cmaster

12

Python 3,46个字节

存储,45个字节:

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

检索程序由store命令(名为的文件)构建f。(文件名1个字节


2
当然可以使用input()吗?
Artemis Fowl

@ArtemisFowl input()仅收到第一条换行符。open(0).read读取所有标准输入的
乔金

您可能在事情仍然不明确的时候发布了,但是这个答案不符合当前的规范。我最初打算对STDIN / STDOUT进行严格的规定,不允许使用默认值。我已经扩展了它,但是仅扩展到默认值的一部分。您的检索程序,如果不使用STDOUT,则仍需要在屏幕上显示输出。如果允许全部默认值,则每种语言的解决方案都是“在文件中输入”,“在文件中输出”,零字节。
Jared K

@JaredK我认为您不太了解它的工作原理。- store程序从STDIN读取输入,然后存储一个Python程序,在中打印此输入f。示例:使用输入调用STORE abc。然后将它写入print('abc')f。如果现在调用f(RETRIEVE),它将打印abc到STDOUT。
ovs

@JaredK我在评论中询问您,是否允许STORE修改RETRIEVE。
ovs


8

Powershell-4字节

存储:

ac

(也可以sc

恢复

gc

编辑:我只是注意到输出不允许任何用户输入...因此它从4跳到6或8个字节

存储:

ac f

(也可以选择sc f)8字节版本

ac

(并指定f为路径)6字节版本

恢复

gc f

8

锈,136字节

存储(84字节)

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

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

检索(52个字节)

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

致谢


1
您可以通过将导入更改为use std::{io::*,fs::*},然后使用write代替来保存一个字节std::fs::write
Esolanging Fruit '18

怎么write("a",String::from_iter(stdin().chars()))
Bergi

@贝尔吉尼斯。但是chars会触发error[E0658]: use of unstable library feature 'io'稳定的Rust。
雅各布

嗯,似乎chars()已不赞成String::from_utf8(stdin().bytes())。(我也使用了每晚的文档,不确定是不是罪魁祸首)
Bergi,

@Bergi我尝试使用bytes()或进行了一些变体,chars()但由于迭代器项被包装在中,因此它们都不是很短io::Result
硕果累累'18

8

重击 12 11 10字节

商店, 7 6 5字节

cat ->f#不需要-,默认为stdin

cat >f#不需要空间,也可以>分开

cat>f

检索,5个字节

cat f

1
无需-在商店程序中。
康拉德·鲁道夫

2
也不用在“ cat”和“>”之间留空格!
psmears '18年

您应该能够像在zsh文章中一样进行编写和使用>f。我不确定是否<f可以阅读。
allo

@allo至少在Cygwin上,其>f工作方式类似于echo '' > f(清空文件(如果存在),创建文件(如果不存在)),而这<f似乎是无操作的。
sundar

7

HP 49G RPL,48字节

保存::2: A DUP PURGE STO,26.5字节

恢复::2: A RCL,21.5字节

如果我们可以留在备用电池中,则会得到:

HP 49G RPL,0个字节

保存:,0个字节

要恢复:0个字节,因为HP 49G在重新启动后不会影响堆栈。


零字节解决方案应适用于各种计算器。我到家时会摔倒42岁的孩子。
SIGSTACKFAULT

我认为您的零字节解决方案以及其他在无损重启计算机上运行的解决方案,都无法满足问题的两个部分:“您将创建两个程序。” 您所拥有的是一个可以在重新启动后幸存下来的程序。并且“ Store从STDIN读取,然后无错误退出。” 您的程序仍在等待用户按下键。程序的堆栈和执行状态仍然可变。我认为这意味着它仍在运行,并且尚未退出。
Jared K

@JaredK这个问题从未规定两个程序不能完全相同。至于结束部分:传统上,在RPL中,程序的输入是在堆栈上给出的。这标准输入。
杰森

1
堆栈可以在关机后再开机吗?也许可以通过计算器的按钮进行软关机,但是我想可能不会取出电池。因此,也许取决于重新启动的时间。
用户

1
@用户否,堆栈无法通过软(ON + C)或硬复位(ON + A + F)(不同于软关机,向右Shift + ON)保留,与存储在端口2中不同,端口2是闪存(并在软重置和硬重置中幸存下来)。由于TI-BASIC答案似乎使用了该定义,因此我将堆栈答案包括在内以确保完整性。
杰森

6

APL(APLX),5 个字节

商店:⍞⍈1
检索:⍇1

 从stdin获取行
⍈1 写入文件编号1的下一个可用组件

⍇1 读取文件编号1 的第一个 *最后一个部分

APLX Store会话APLX检索会话

*文档首先说,但实验最后显示。


6

bash,10字节(无竞争)

touch $@
ls

Unix文件名可以包含NUL和以外的任何字符/,并且它们的名称最长可以为255个字节,因此它只能存储不超过该长度的字符串(考虑到存储介质的限制),并且不包含'/ ' 在他们中。这是不竞争的一个原因,另一个原因是假定运行它的目录为空(或ls允许输出无关的信息)。我仍然想发布此信息,因为这似乎是一种很酷且不明显的信息存储方式。

具有相同长度和字符限制的另一个类似原因是:

35 33字节

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

这允许/字符串中的字符,并支持更多的字符(确切的数量取决于实现)。

(-2字节感谢@Cows嘎嘎声)


1
IIRC,我相信伯克利的一个小组早在1990年代就创建了一个数据库系统,该系统将表列数据存储为文件名(最多255个字符)。我认为行和表是父目录。
David R Tribble

在35字节的答案中,您可以将第二条语句更改为s/..//。该$不是必需的,因为所有其他行都被删除所以这只能申请到最后一行,并且^可以丢弃,因为替代仅在第一场比赛上。
Kritixi Lithos '18

@Cowsquack完成。感谢您解释为什么更改也有效。
sundar

您需要使用"$@",不$@,以避免空白,引火上身*?~字符。
安德斯·卡塞格

5

Python 3,56个字节

存储(33字节)

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

检索(23个字节)

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

用尾随换行符打印。


为什么不input()代替open(0).read(),并忽略end=print
MoxieBall

@MoxieBall不确定为什么input不使用它,但是省略end=会导致在字符串的末尾添加新行(即,不是原始字符串)(也许)
NickA

@NickA无论如何,看起来换行符似乎已经印在问题中,所以我认为这不重要...
MoxieBall

我发疯了还是23 + 33 = 56(不是54)?还为什么不使用input()
Artemis Fowl

1
@ArtemisFowl好收获。至于input,我假设要保留的字符串可能包含换行符。
雅各布

4

Japt,46个 30字节

-16个字节,感谢Shaggy

我尝试使用Japt的第一次。JS评估有时可能很烦躁。使用浏览器的window.localStorage

存储(16字节)

Ox`lo¯lSÈSge.P=U

检索(14个字节)

Ox`lo¯lSÈSge.P

+1是第一个使用我喜欢的标准文件IO以外的东西的人。
Jared K

1
欢迎来到Japt!:)
Shaggy

1
顺便说一句,您可以完全绕过setItem和。设定值取回值getItemlocalStorage.key
毛茸茸的

@粗野的谢谢!您还避免使用怪异的控制字符。
LegionMammal978

4

Haskell,46个字节

存储(26个字节):

getContents>>=writeFile"t"

检索(20个字节):

readFile"t">>=putStr

3

红宝石(26字节)

设置(16字节)

IO.write'a',gets

获取(10字节)

IO.read'a'

3

MATLAB(30字节)

设置(22字节)

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

可以通过更改为来减少4个字节input(''),但这将要求输入使用单引号引起来:'input string'

获取(8个字节)

load a;a

3

C(GCC),98个字节

存储(46字节)

通过第一个命令行参数输入。

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

检索(52个字节)

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

不可移植性

  • 要求几种指针类型适合int

致谢


1
这需要一个C实现,其中int可以包含一个指针,以使隐式声明int fopen()起作用。(例如,大多数32位系统,或者gcc -m32如果您使用的是x86-64 ,则使用它来制作32位可执行文件。)顺便说一句,我尝试使用Linux sendfilecopy_file_range(2)系统调用,但是它们不适用于TTY。
彼得·科德斯

1
由于您是在编写函数而不是程序,因此也许可以证明将输入字符串作为函数arg允许使用fputs(fopen())read(open(),buf,-1)。(问题现在允许使用命令行arg作为输入。)
Peter Cordes,

Linux的“拼接”功能从管道复制到文件(反之亦然)。如果stdin / out是管道,则它将保存函数调用,但要花更多的参数。
CSM

2

APL(Dyalog Unicode),18字节

商店:⍞⎕NPUT⎕A 1 在线尝试!
检索:⊃⎕NGET⎕A 在线尝试!

 从stdin获取行,
⎕NPUT 将其放入名为
⎕A 大写字母 的本机文件中1 ,如果文件存在则覆盖


⎕NGET 获取本机文件
⎕A 的大写字母 的第一部分(数据,下一部分是编码和行尾类型)


2

R(27个字节)

存储(21个字节)

x=readLines('stdin')

加载(6个字节)

cat(x)

为此,第一个脚本需要使用命令行选项调用,第二个脚本需要--save使用--restore(虽然在交互模式下,这不是必需的:这些选项是默认选项)。

如果不是因为R中的错误阻止默认参数readLine在非交互模式下工作,则可以将其缩短7个字节。在交互模式下,没有必要,因此解决方案仅使用20个字节


1
我认为q直接使用会更有效,第一个程序是x=scan(); q("y")第二个程序,x或者cat(x)取决于我们希望如何严格地打印字符串。按照通常的代码高尔夫球规则,您还必须计算命令行参数,因此为--save和添加字节--restore(我的公式不需要)
JDL

@JDL scan不适用于任意内容,并且scan(w='character')比更长readLines()q是不必要的(但q('y')不起作用,您必须拼写yes)。我考虑过仅x在第二个程序中使用,但据我了解,这将违反要求。
康拉德·鲁道夫

1
您可以使用scan(w=""),而无需拼写出类型,scan它将根据指定的参数类型进行推断。对我来说,q(“ y”)可以起到节省存储的作用,但这可能取决于您的R版本,以及是否使用Rstudio。
JDL

@JDL scan:噢,整洁,文档中没有提到这一点!不幸的是scan仍然会执行一些解析,因此这不适用于所有输入。无论如何,scan('stdin',w='')碰巧与的长度完全相同readLines('stdin')q:R 3.4.4说“ q(“ y”)错误:'save'无法识别的值”。
康拉德·鲁道夫

嗯,这是Rstudio的东西-我在Rstudio中以及在终端上分别尝试过,并且仅在Rstudio中有效。
JDL

2

Java(JDK 10),204字节

警告:覆盖所有Java程序为您的用户名存储的所有首选项!

存储,94字节:

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

在线尝试!

检索110个字节:

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

在线尝试!

java S foo
java R
foo

通过将输入作为arg并将其存储在java.util.prefs提供的用户首选项后备存储中,可以工作。它会覆盖用户的根节点,以在命名节点时节省一个字节。如果要进行非破坏性测试,请使用一次性用户名运行它,或将密钥从“”更改为节点名称。


好主意!由于您使用的是Java 10,因此可以通过使它们成为lambda表达式来缩短它们。另外,如果字节数不包括在内z,则应将其从程序和TIO中删除。请考虑在提交内容的顶部放置警告,而不是警告人们。确保TIO应该具有94字节和110字节的解决方案。
雅各布

谢谢!我做了您建议的修改。我不确定,但我认为lambda表达式不能满足此问题的自定义IO规则。
Jared K

天啊 没错,我忘记了这一点。
雅各布

2

C#,157字节

设置74字节

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

获取83字节:

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

-1字节归因于VisualMelon
-2字节归因于LiefdeWen


之后删除该空间"a",,我怀疑这会被打败:)
VisualMelon

您可以使用WriteAllLines和第二个参数来保存另一个字节a
LiefdeWen

2

Perl 5,48 26 23字节

写20 + 1(-n)个字节

-3字节归功于mob

open f,">>f";print f

我实际上不确定这一点,但符合标准。对于过去的条目,仅计算了cli选项,所以这就是我要处理的内容。

读取,0 + 2字节

perl -pe "" f

1
为什么您得分-ne为1(应该也得分e),但得分-pe为2?您可以使用-Esay代替print
simbabque

谢谢您让我知道-E,我对此并不熟悉。至于为什么我不喜欢-ne,那是因为对于那个,我实际上是从一个文件运行的。因此,看起来perl -n w.pl如果这违反了PCG社区标准,我可以相应地编辑答案。
Geoffrey H.

不,还好。我们为额外的命令行参数添加了malus,所以很好。
simbabque

2
">>","f"-> ">>f"保存3个字符
暴民

1

附件,23 + 16 = 39字节

只需将STDIN写入文件A,然后读取文件A

store.@

$A&FileWrite!AllInput[]

retrieve.@

Echo!FileRead!$A

测试中

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字节

存储,27字节

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

检索,24个字节

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

1

红宝石

存储 (24个字节)

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

检索 (16个字节)

p File.read('a')

4
这个问题要求存储来自STDIN的输入,而不是参数
Ferrybig '18

此后,我进行了编辑,以允许IO替代包括参数。
Jared K

1
File.write'a',getsp File.read'a'

1

C(Unix / GNU),23 + 23 = 46字节

存储,27 23字节

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

检索27 23字节

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

这基本上将jofel的答案包装到C程序中。

注意:这些dd命令stderr会将一些统计信息输出到,因此,当您在shell中天真地运行它时,您将看到一些其他输出。然而,由于面临的挑战只是说存储的字符串必须提交上stdout,不stderr,我认为它是允许有额外的输出stderr...无论如何,抑制stderr输出是如更换容易ddcat,增加的字节数两个程序各一个。


根据您的编译器,您也许还可以从中删除int返回类型main。旧的ANSI C样式int是默认的返回类型。
雅各布

@Jakob啊,当然可以。我有意识地依赖于-ouch的隐式声明,system()而忘记了它main()。感谢您指出:-)
cmaster

1

PHP,26 + 1 + 21 = 48字节

Store.php:

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

用运行echo <input> | php -nF Store.php

Retrieve.php:

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

用运行php -n Retrieve.php


1

C(gcc)77 67 + 25 = 92字节

在我的gcc上仅编译了一些警告。

store.c

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

可能可以打入包含,但我不知道如何。Segfaults,如果您不传递任何内容,而是传递任何内容。

彼得·科德斯(Peter Cordes):-1

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

int*f=fopen应该可以工作,即对编译器说谎有关指针类型。但是仅当您针对32位系统进行编译时(即可以在其中int容纳指针的地方,例如gcc -m32,或仅gcc在完整的32位系统上)。您也可以将main声明为main(int c,char**v),或者可能int**v是因为您没有取消引用。
彼得·科德斯

main(int c,char**v)作品。我也意识到我可以做到fputs(v[1],fopen("f","w"),尽管出于某种原因它仍然需要stdio。
SIGSTACKFAULT

如果您编译32位可执行文件,它应该可以工作。对于x86-64,编译器会将截断int值截断为32位,然后将其符号扩展为指针。如果返回的FILE*是低32位,则可以使用,但是在x86-64 Linux上不是这样。
彼得·科德斯

如果您使用的系统中所有指针的大小均相等(很有可能),则可以通过fopen手动声明来避免包含。带参数去上学也节省了一些字节:*fopen();main(c,v)int**v;{fputs(v[1],fopen("f","w"));}
gastropner

1

批处理-11字节

%12>f
type f

输入作为命令行参数接收,并在中保留(由于CMD尝试执行参数,因此在执行尝试时会创建错误消息)f


批处理-7字节(非竞争性)

'>%1
dir

文件名中有很多无效字符,因此这对于某些字符串不起作用,但这实际上将任意字符保存到参数给定的文件名中。要读取它,它仅列出目录中的所有文件,包括我们的字符串。


1
您的解决方案似乎在STDOUT上输出,这是有效的。STDERR只是另一种选择,不是必需的。输入周围的引号不会阻止它竞争。唯一的问题是是否应将它们计入您的字节数。我认为不是,因为它们不是特定于此问题的。对于批处理而言,它们看起来像是用于命令行arg的标准样板,与需要标准命令行标志的语言没有太大区别。也许其他具有批处理知识的人会喜欢上它。现在暂时不要将它们放在字节数内。欢迎来到Code Golf!:)
Jared K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.