여러 세션에 걸쳐 숫자 증가


30

좋은 저녁 골프 요원,

당신의 임무는 악명 높은 엔터테인먼트 거인 Eviltronic Arts를 대표하는 것입니다. 세계 노예화와 오락을위한 사악한 계획의 일환으로 가능한 한 SimStation V 사본을 판매해야합니다. 이것은 소프트웨어가 몇 번 시작된 후에 신비하게 작동을 멈춰야한다는 것을 의미합니다.

귀하의 목표는 실행 횟수를 계산하는 프로그램을 작성하는 것입니다. 프로그램은 다른 것을 수행하지 말고 정수를 stdout에 기록하십시오. 처음 실행될 때 "1"을 반환해야합니다. 다음 "2"등등. 프로그램은 최소한 숫자 "14"에 도달 할 수 있어야하지만 필요한 상한은 없습니다.

그러나 프로그램이 새 파일을 쓰면 안됩니다. 자체, 레지스트리 또는 인터넷에 액세스해도 괜찮습니다. 그러나 일부 사용자는 새 파일이 의심스럽고 덮어 쓰게됩니다. 신경! 합법적으로 구매 한 소프트웨어의 한계를 극복하십시오!

프로그램은 안정적인 인터프리터 또는 쉘을 가정 할 수 없습니다. 프로그램은 전체 인터프리터 나 쉘 컴퓨터를 실행하는 동안 재시작하면 여전히 작동해야합니다.

가능한 한 감지 할 수 없어야 가장 짧은 소스 코드가 승리합니다.

행운을 빌어 요원 엔터테인먼트 산업은 당신을 믿고 있습니다.


답변:


21

bash 스크립트, 39 , 37 , 21 18

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

짧고 달콤한 코드 골프 첫 제출 :)


1
교체 echoid: D
thejh

불필요한 출력을 파일에 추가합니다. 파일에 stderr로 리디렉션됩니다
Rozuur

응? stderr와 상호 작용하는 것은 없습니다. 그러나 시간이 지남에 따라 파일 크기가 커집니다.
thejh 2015 년

17 시까 지 골프를 타실 수 있습니다 :; 개행으로 교체 하고 후행 개행을 제거하십시오. 훨씬 더 멋지게 보일 것입니다 :-)
Tomas

스크립트의 시작 크기 만 관련이 있습니까? 이것은 매 실행마다 크기가 증가한다는 것을 고려하십시오.
unclemeat

18

파이썬, 40 , 39 , 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

단일 공백이 필요하지 않습니까?
John Dvorak

1
@JanDvorak 프로그램에서 단일 공백이 필요합니다. 그렇지 않으면 사양을 충족하지 않는 10 번의 실행 후 충돌이 발생합니다. 100 번째 실행 후 세미콜론을 덮어 쓰면 구문 오류가 발생합니다.
primo

35 문자에 대한 PHP 솔루션을 얻었 습니다. 나를 이길 원하십니까? :)
Tomas


5

루비 : 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
,?

도 데이터 파일을 닫는 좋은 예전 습관… :( 감사합니다, @steenslag.
manatwork

5

* sh, 17

curl -L x.co/z7Uk

지금까지 다른 기존 솔루션과 다른 접근 방식 인 웹 서비스를 사용합니다. 제한 : 내 컴퓨터의 메모리.


자바 스크립트, 40

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

프로그램으로 간주되지는 않지만 어쨌든 길다. 로컬 파일의 Firefox에서는 작동하지 않습니다. 제한 : 2 ^ 31.


alert(localStorage.a=~~localStorage.a+1)자바 스크립트 프로그램을 말하기 (41) 기술적으로 만 (33)이 될 것입니다 스크립트 태그없이 것
데이비드 멀더

@DavidMulder 아, 맞다
복사

2
아래로 33 :alert((l=localStorage).a=~~l.a+1)
nitro2k01

@ nitro2k01 : 나는 잘못된 물건, 33 나는 O : (41)에 대해 한 말이었다 원인을 복사 보인다 스크립트 태그를 포함하여 같은 일을 그냥 오랫동안의 원인 ~ (물론, 내가 경고하기 전에 decleration했다 : a=localStorage;alert(a.b=~~a.b+1)당신 생각 D
David Mulder

1
@WallyWest 아니, 그것은 반전과 인권 침해 자바 스크립트의 이상한 형 변환 규칙 비트 단위로 사실입니다
복사

4

PHP 31 37

자체 수정. 단항으로 계산됩니다. 텍스트 편집기가 도움이되지 않도록주의하고 1 뒤에 줄 바꿈 문자를 삽입하십시오. PHP <5.3.2에서만 종료됩니다. 아니면 파일 디스크립터를 유출하는 것이 허용됩니까?

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

원본 버전 (36 자), 모든 PHP 버전 :

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

2
"단일로 계산"... 오랫동안 본 최고의 골프 ​​해킹!
lochok

나는 당신에게 도전합니다. 35 문자에 대한 PHP 솔루션 , 그리고 십진수입니다 :)
Tomas

1
와우, 네가 네 자신의 방법으로 나를 때렸다는 것을 알았다! 축하합니다! :-) 그리고 내 방법의 개선에 감사드립니다. 나는 그것을 나의 대답에 포함 시켰고 그것에 대한 크레딧을 주었다.
Tomas

@Tomas 나는 당신에게 신용해야합니다. 당신이 나에게 도전하지 않았다면, 나는이 답변을 다시 보지 않았을 것입니다.
Tim Seguine

팀, 그것은 서로 도전하는 기쁨과 흥분입니다! :)
Tomas 2019

2

파이썬, 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에서는 인터프리터가 사용하는 토크 나이저를 ;:함수 로 사용할 수 있으므로 xJ 코드가 ;:x포함 된 경우 J 토큰이 포함됩니다.

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

그래서:

  • echo m=.1: m1로 설정 하고 화면에 씁니다.
  • 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();

업데이트 해 주신 Tim에게 감사합니다! 내 오래된 해결책 :

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

문제는 즉 $_SESSION[A]이다 ""- 빈 문자열 - 첫 번째 반복에서, 그러나로 session_start()반환 한, 당신은 그것을 추가 할 수 있으며 한 번에 두 개 또는 세 개의 파리를 죽일!

올바른 구문의 솔루션 (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

하스켈-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>nul. 2>nul이 스크립트는 스크립트를 포함하는 파일의 이름을 변경하므로 cmd가 더 이상 스크립트를 볼 수 없어 (EOF에 도달하기 전에) 오류를 리턴하므로 stderr을 nul로 리디렉션합니다.The batch file cannot be found.

스크립트를 연속적으로 호출 할 때마다 1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...


이 아이디어를 바탕으로 단항 계산에 대한 PHP 답변의 변형을 수행 할 수 있으며 이보다 더 짧은 것으로 생각합니다.
Tim Seguine

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

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와 같은 짧은 이름을 사용할 수 있습니다.
NotALie입니다.

공백도 제거해야합니다.
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 runtime 2.10.8.1-5ubuntu2로 테스트


1
실제로-나는했다. "프로그램은 최소한 숫자 14에 도달 할 수 있어야합니다"
lochok

이제 255 번 작동합니다.
user3188175

1

파워 쉘, 47 바이트

스크립트 이름이 있다고 가정 a.ps1

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

스크립트는 자체가 교체 덮어 쓰게됩니다 0에 첫 번째 줄에 1, 2, 3등.

또한 두 인스턴스를 replaceing하여 다른 8 바이트를 절약 할 수 a.ps11와라는 이름의 파일로 스크립트를 저장 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]$t0$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 바이트

짧막 한 농담:

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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.