在多个会话中递增数字


30

晚上好,高尔夫经纪人,

您的任务是代表着名的娱乐巨人Eviltronic Arts。作为其全球奴役和娱乐计划的一部分,他们必须出售尽可能多的SimStation V副本。这意味着该软件必须在启动几次后神秘地停止工作。

您的目标是编写一个计算其运行次数的程序。程序除了将整数写入stdout之外,什么都不做。第一次运行时,它应该返回“ 1”。下一个“ 2”,依此类推。该程序必须至少能够达到数字“ 14”,但没有要求的上限。

但是,您的程序不得写入任何新文件。完全可以访问自身,注册表,甚至是Internet。但是我们的某些用户怀疑新文件,只会覆盖它们!好紧张!击败他们合法购买的软件限制!

该程序不能采用稳定的解释器或外壳程序-如果在运行之间重新启动整个解释器,则该程序必须仍然可以运行。

由于必须尽可能地不可检测,因此将以最短的源代码为准。

祝你好运。娱乐业指望您。


Answers:


21

bash脚本,393721 18

wc -l<$0;echo>>$0

简短而甜蜜,我第一次参加代码高尔夫球比赛:)


1
替换echoid:D
thejh 2013年

它将不必要的输出追加到文件,该文件将重定向到stderr
Rozuur 2013年

??这里没有与stderr交互的东西。但是没错,它会使文件随着时间的推移而变大。
thejh 2013年

可以打到17:;用换行符替换并删除尾随的换行符。它甚至看起来会更好:-)
Tomas

仅脚本的起始大小相关吗?考虑到每次运行都会增加大小。
2014年

18

Python,第4039,38个字符

同样,运行时没有这样的上限:

open(__file__,'a').write("+1");print 1

如您所见,程序的大小逐渐增加,但是原始问题没有这种限制。我相信,所提交程序的大小至关重要


我认为您不需要放a+a应该工作正常。
beary605

@ beary605:谢谢你的提示
作者Abhijit

10

PHP 48字节

<?=$n=1 ;fputs(fopen(__FILE__,c),'<?=$n='.++$n);

一种简单的自我修改方法。运行99次后,它将崩溃。

$ php increment.php
1
$ php increment.php
2
$ php increment.php
3

$ php increment.php
97
$ php increment.php
98
$ php increment.php
99
$ php increment.php
PHP Parse error:  syntax error, unexpected T_STRING, expecting ',' or ';' in increment.php on line 1

单个空格不是不必要的吗?
约翰·德沃夏克

1
@JanDvorak程序中必须有单个空格,否则仅执行10次便会崩溃,这不符合规范。第100次执行后,分号将被覆盖,这会导致语法错误。
2013年

35个字符的PHP解决方案,想击败我吗?:)
Tomas


5

Ruby:31 21个字符

(这是对AbhijitPython解决方案的重写。如果您喜欢基本思想,请像我一样赞成他的回答。)

open($0,?a)<<"+1";p 1

样品运行:

bash-4.2$ ruby increment.rb 
1

bash-4.2$ ruby increment.rb 
2

bash-4.2$ ruby increment.rb 
3

1
使用<<您可以保存一些字符:`open($ 0,?a)<<“ + 1”; p 1 \`
steenslag 2013年

h 在保证数据文件的好老习惯得到关闭... :(谢谢,@steenslag。
manatwork

5

* sh,17岁

curl -L x.co/z7Uk

使用Web服务,是迄今为止与其他现有解决方案不同的方法。限制:我的机器的内存。


JavaScript,40岁

alert(localStorage.a=~~localStorage.a+1)

几乎不算一个程序,但是反正它很长。在Firefox中的本地文件中不起作用。上限:2 ^ 31。


为什么不alert(localStorage.a=~~localStorage.a+1)41和从技术上讲JavaScript程序将没有脚本标签,而脚本标签只有33
David Mulder 2013年

@DavidMulder哦,对了
复制

2
降至33:alert((l=localStorage).a=~~l.a+1)
nitro2k01 2013年

@ nitro2k01:似乎我复制了错误的内容,原因是我正在谈论的33是O :) 41是包括脚本标签的同一件事〜(好吧,我在警报之前进行了清理,因为它很长:a=localStorage;alert(a.b=~~a.b+1)尽管您的看起来更好:D
David Mulder 2013年

1
@WallyWest Nope,实际上是按位反转并滥用JavaScript的怪异类型转换规则
复制

4

PHP 31 37个字符

自我修改。它算一元。请注意,您的文本编辑器不会尝试提供帮助,并在1之后插入换行符。它仅在PHP <5.3.2中有效(正确),因为它依赖php在关闭时关闭打开的文件描述符。还是泄漏文件描述符是可以接受的?

<?fputs(fopen(__FILE__,a),1)?>1

原始版本(36个字符),所有PHP版本:

<?file_put_contents(__FILE__,1,8)?>1

2
“它很重要” ...我已经看了很长时间的最佳高尔夫技巧!
lochok 2014年

我挑战你。PHP解决方案,用于35个字符,它使用十进制:)
Tomas

1
哇,我看到您用自己的方法殴打了我!恭喜你!:-)并感谢我方法的改进。我已将其包括在我的答案中,并为此表示赞赏。
Tomas

@Tomas我欠你信用。如果您没有挑战我,我将不会再看这个答案。
Tim Seguine 2014年

蒂姆,这正是彼此挑战的乐趣和兴奋!:)
Tomas

2

Python,50岁

n=1;
print n
open(__file__,'r+').write("n="+`n+1`)

它使用与primo答案相同的方法,并且在第100次运行时类似崩溃。


2

J(58)

您需要将其作为脚本运行,显然它无法从J命令行运行。

echo m=.1
exit(;:^:_1(<":m+1)(<3)};:1!:1[k)1!:2[k=.1{ARGV

在J中,解释器使用的令牌生成器可用作;:函数,因此,如果x包含J代码,则;:x包含J令牌,即:

    ;: 'echo 1 2 3+4 5 6'
+----+-----+-+-----+
|echo|1 2 3|+|4 5 6|
+----+-----+-+-----+

所以:

  • echo m=.1:设置m为1,并将其写入屏幕
  • k=.1{ARGV:将第二个元素存储在中的ARGV(脚本名称)中k
  • ... 1!:2[k:将以下字符串写入文件k
  • ;:1!:1[k:读取k,当前脚本和标记化
  • (<":m+1)(<3)}:用的字符串表示形式替换第三个标记 m + 1
  • ;:^:_1:反向运行令牌生成器,生成一个字符串
  • exit:退出解释器(即使运行脚本,它本身也不这样做)

2

PHP,34 33个字符

<?=$_SESSION[A]+=session_start();

感谢蒂姆的更新!我的旧解决方案:

<?=session_start()+$_SESSION[A]++;

问题是,$_SESSION[A]""-空字符串-在第一次迭代中,但作为session_start()回报1,您可以将其添加和一次性杀死两个或三个苍蝇!

具有正确语法(35个字符)的解决方案:

<?=session_start()+$_SESSION[A]++?>

由于两个原因,我将稍作判断。“但是,您的程序不得写入任何新文件。”:我不确定这对解决方案是否不是问题,因为打开会话会创建一个临时文件。默认会话gc也会在24分钟后发生。那真的算作“多个会话”吗?也许OP可以发表评论。
Tim Seguine 2014年

蒂姆,该程序未写入任何文件。我对口译员的工作不承担任何责任。就像HTML页面不负责浏览器在缓存中创建某些文件,sql查询不负责在磁盘上创建临时表等。至于超时,它没有在规则中指定:)无论如何,我不是确定为什么,但是在我的机器上,计数器仍然可以保持几个小时以上!!!
Tomas

是的,这就是为什么我说我将等着看OP的想法。您肯定会发现一个非常灰色的区域。您不需要关闭php标签btw。因此您的34个字符的版本就足够了。我有一个改进的想法,但是我需要先对其进行测试。
Tim Seguine 2014年

好吧,我将其减少到33个字符。我敢你做得更好。;)
Tim Seguine 2014年

@TimSeguine Aaaah,你的语气有多变!:-) 现在您不必太在意我的帖子中的规则了!:-D
Tomas

2

Haskell-36个字节

main=do appendFile"a.hs""+1";print$1

只需将其添加+1到源文件的末尾(假定为)即可a.hs。该.hs扩展在ghc和ghci中都是必需的。



1

批次-41

给定示例用例,我可能不会认为该技术是可行的-它重命名了包含脚本的.bat文件-

@set/aa=%~n0+1
@echo %a%&@ren %0 %a%.bat

将其保存到名为0.bat- 的文件中,然后使用调用0.bat 2>nul2>nul将stderr重定向到nul是必要的,因为此脚本将重命名包含该脚本的文件,一旦这样做,cmd显然将不再能看到该脚本(在到达EOF之前),并且将返回错误The batch file cannot be found.

脚本的每个连续调用当然必须是 1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...


基于这个想法,您可以对一元计数中的php答案做一个变体,我认为它比这更短。
Tim Seguine '18年

1

mIRC脚本,28/22字节

如果放在“别名”选项卡中,则“别名”可以省略,占22个字节。

alias x inc %i | echo -ag %i

1

Python,49个48个字符

我意识到,由于,这在Windows上将仅为48个字符\r\n。否则应为49。

n=1

print n;print>>open(__file__,'r+'),"n=",n+1

@grc廉价窃取该方法


1

C,190个字符。仅适用于Win NT

#include <stdio.h>
int main(int c,char *v[]){
char f[100];sprintf(f,"%s:s",v[0]);
if (FILE *fp=fopen(f,"r"))fscanf(fp,"%d",&c);
FILE *fp=fopen(f,"w");printf("%d",c-1);fprintf(fp,"%d",++c);
}

我认为它的工作方式非常简单,但是如果需要,我仍然可以添加一个解释:-)
Abhijit 2013年

1

C#,142个字符

int v=(Microsoft.Win32.Registry.CurrentUser.GetValue("c") as int?)??0+1;Console.Write(v);Microsoft.Win32.Registry.CurrentUser.SetValue("c",v);

您可以使用较短的名称(例如z),这样可以减少一些字符。
不是。

您还应该删除空格。
Timtech

1
不必每次都调用长的API名称,而是将其存储在变量中,例如:var a = Microsoft.Win32.Registry.CurrentUser; a.GetValue(); a.SetValue();
Xantix

1

Tcl,63或73个字节

  • 有了一些网络服务,它就是73:

    package require http
    puts [set [http::geturl http://example.com/c](data)]
    
  • 修改自身为63:

    proc a a {puts [string le $a]};puts -nonewline [open $argv0 a] a; a a
    

1

C# - 201 239 234个字符

在前255次工作,然后换为0。在第一次执行时不会输出任何内容。

namespace System.IO{class s{static void Main (string[]a){char f='|';if(f!='|'){Console.Write (255);}string p=Reflection.Assembly.GetCallingAssembly().Location;byte[]d=File.ReadAllBytes(p);d[769]++;d[780]++;File.WriteAllBytes(p,d);}}}

另存为Main.cs,使用

gmcs Main.cs

使用gmcs 2.10.8.1和Mono运行时2.10.8.1-5ubuntu2进行了测试


1
其实-我做到了。“程序必须至少能够达到数字14”
lochok

现在可以使用255次。
user3188175 2014年

1

Powershell,47字节

假设脚本已命名 a.ps1

0
[int]$n,$t=(gc a.ps1)[0..1];,(++$n),$t>a.ps1

该脚本将覆盖自身替换0与在第一行123等等。

也可以通过a.ps1替换1和的两个实例并将脚本另存为文件名来节省另外8个字节,1尽管这对我来说有点遥不可及。

如果文件未另存为“ a.ps1”,则用第二行替换。

[int]$n,$t=(gc($s=$MyInvocation.MyCommand.Name))[0..1];,(++$n),$t>$s

0 在第一行初始化计数

换行符提供了将文件一分为二的最简单方法

[int]$n,$t=(gc a.ps1)[0..1]

这将获取文件'a.ps1'并将其作为行数组读取,然后我们使用进行遍历,[0..1]并将其设置$n为分别转换为[int]and 的变量$t,以使0第一行上的$n和和'第二行变成$t

,(++$n),$t>a.ps1

这使用,1,2数组表示法创建了一个由两个元素组成的数组,一个是存储在$n预递增中的数字,并通过使用隐式括号输出到stdout,第二个是文件中文本的第二行,然后输出将其保存到名为“ a.ps1”的文件中

由于输入和输出都是字符串数组,因此所需的格式设置最少,并且几乎所有内容都由解释器承担。


1

Zsh(无coreutils),32个字节

a=`<$0`
<<<$[$#a/2-15]
>>$0<<<:

(请注意尾随换行符)使用脚本的长度。在每次调用时,上面显示的最后一行将在脚本的后面加上:(与相同true)和换行符,因此是/2

在线尝试!


0

锈/货物脚本,283字节

Oneliner:

use std::fs::File;use std::io::Write;fn main(){let c=     0; let mut v = vec![];::std::io::Read::read_to_end(&mut File::open("w").unwrap(),&mut v);let mut q=&mut File::create("w").unwrap();q.write(&v[..53]);q.write(format!("{:6}",c+1).as_bytes());q.write(&v[59..]);println!("{}",c);}

另存为w并运行cargo-script

$ cargo-script script w
   Compiling w v0.1.0 (file:///home/vi/.cargo/script-cache/file-w-b4d6541706fabb11)
    (warnings skipped...)
    Finished release [optimized] target(s) in 1.47 secs
0
$ cargo-script script w
    (compilation output skipped)
1
$ cargo-script script w
...
2
$ cargo-script script w 2> /dev/null
3
$ cargo-script script w 2> /dev/null
4
$ cargo-script script w 2> /dev/null
5
$ cargo-script script w 2> /dev/null
6
$ cargo-script script w 2> /dev/null
7
$ cargo-script script w 2> /dev/null
8
$ cargo-script script w 2> /dev/null
9
$ cargo-script script w 2> /dev/null
10
$ cargo-script script w 2> /dev/null
11

不要迭代太快否则会卡住

部分未打高尔夫球:

use std::fs::File;use std::io::Write;fn main(){let c=     0;
    let mut v = vec![];
    ::std::io::Read::read_to_end(&mut File::open("w").unwrap(),&mut v);
    let mut q = &mut File::create("w").unwrap();
    q.write(&v[..53]);
    q.write(format!("{:6}",c+1).as_bytes());
    q.write(&v[59..]);
    println!("{}", c);
}

将在99999之后中断;


0

GNU sed,13 + 1(n标志)= 14个字节

$=;$eecho>>s

运行: sed -nf ss

假设源文件名为s。代码后需要尾随换行符,该换行符以字节总数计。说明:

$=           # print the number of lines of the input file
$eecho>>s    # a shell echo call that appends an empty line to the source file 's'
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.