複数のセッションでの番号の増分


30

グッドイブニングゴルフエージェント、

あなたの使命は、悪名高いエンターテイメントの巨人Eviltronic Artsを代表しています。世界の奴隷化と娯楽のための悪質な計画の一環として、彼らはできるだけ多くのSimStation Vのコピーを販売しなければなりません。これは、数回起動した後、ソフトウェアが不思議なことに動作を停止しなければならないことを意味します。

目標は、実行された回数をカウントするプログラムを作成することです。プログラムは、整数をstdoutに書き込む以外は何もしません。初めて実行されたときは、「1」を返します。次の「2」など。プログラムは、少なくとも数値「14」に到達できる必要がありますが、必要な上限はありません。

ただし、プログラムは新しいファイルを書き込まないでください。自分自身、レジストリ、またはインターネットにアクセスすることもできます。しかし、一部のユーザーは新しいファイルを疑っており、単にそれらを上書きするだけです!神経!合法的に購入したソフトウェアの制限を破ります!

プログラムは、安定したインタープリターまたはシェルを想定できません-インタープリター全体がシェル実行中にコンピューターが再起動された場合、プログラムは引き続き動作する必要があります。

できるだけ検出できないようにする必要があるため、最短のソースコードが優先されます。

幸運のエージェント。エンターテインメント業界はあなたを頼りにしています。


回答:


21

bashスクリプト、393721 18

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

短くて甘い、コードゴルフの私の最初の提出:)


1
交換するechoidD:
thejh

不必要な出力をファイルに追加し、stderrにリダイレクトされます
-Rozuur

え?ここにはstderrと相互作用するものは何もありません。しかし、正しいことは、ファイルが時間とともに大きくなることです。
thejh

17までゴルフできます:;を改行で置き換え、末尾の改行を削除します。見た目も良くなります:
トマス14

スクリプトの開始サイズのみが関連していますか?これは実行ごとにサイズが大きくなることを考慮してください。
unclemeat

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回目の実行後、セミコロンが上書きされ、構文エラーが発生します。
primo



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

ど データファイルを確実に閉じるという古き良き習慣…:(@ 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になりますスクリプトタグなしになります
デヴィッド・モルダー

@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
デビッドモルダー

1
@WallyWestいや、それは実際にはビット単位の反転や虐待のJavaScriptの奇妙な型変換ルールだ
コピー

4

PHP 31 37文字

自己修正。単項でカウントされます。テキストエディタが役に立たず、1の後に改行文字を挿入しないように注意してください。シャットダウン時にPHPに依存して開いているファイル記述子を閉じるため、PHP <5.3.2でのみ(正常に)動作します。または、ファイル記述子をリークすることは許容されますか?

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

元のバージョン(36文字)、すべてのPHPバージョン:

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

2
「単項で数える」...長い間見た中で最高のゴルフハック!
lochok 14年

私はあなたに挑戦します。35文字のPHPソリューション、およびそれは10進数です:)
トマス14

1
うわー、あなたはあなたがあなた自身の方法で私を打ち負かしたのを見ます!おめでとうございます!:-)そして、私の方法の改善に感謝します。私はそれを私の答えに含め、あなたにその功績をあげました。
トマス14

@トーマス私はあなたにクレジットを借りています。あなたが私に挑戦していなかったなら、私は再びこの答えを見なかっただろう。
ティムセギーン14

ティム、それはまさにお互いに挑戦する喜びと興奮です!:)
トマス14

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では、インタープリターが使用するトークナイザーは;:関数として使用できるため、xJコードが;:x含まれる場合、Jトークンが含まれます。

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

そう:

  • echo m=.1m1に設定し、画面に書き込みます
  • k=.1{ARGV:2番目の要素をARGV(スクリプト名)に保存しkます。
  • ... 1!:2[k:次の文字列をファイルに書き込みますk
  • ;:1!:1[k:read k、現在のスクリプト、およびtokenize
  • (<":m+1)(<3)}:3番目のトークンを次の文字列表現で置き換えます m + 1
  • ;:^:_1:トークナイザーを逆に実行して、文字列を生成します
  • exit:インタプリタを終了します(スクリプトを実行してもそれ自体は行いません)

2

PHP、34 33文字

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

更新してくれたTimに感謝します!私の古い解決策:

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

問題は、最初の反復で$_SESSION[A]""空の文字列session_start()ですが、1 が返されると、それを追加して1ショットで2つまたは3つのハエを殺すことができるということです!

正しい構文のソリューション(35文字):

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

私は2つの理由で少しの間判決を下します。「ただし、プログラムは新しいファイルを書き込まないでください。」:セッションを開くと一時ファイルが作成されるため、これがこのソリューションにとって問題でないかどうかはわかりません。また、デフォルトのセッションgcは24分後に発生します。それは本当に「複数のセッションにわたる」としてカウントされますか?OPがコメントできるかもしれません。
ティムセギーン14

ティム、プログラムはファイルを書きません。私は通訳が何をするかについて責任を負いません。HTMLページがブラウザがキャッシュにいくつかのファイルを作成する責任を負わないのと同じです。sqlクエリはディスク上に一時テーブルを作成する責任を負いません。タイムアウトについては、ルールで指定されていません:)確かですが、私のマシンでは、カウンターはまだ数時間以上保持されています!!!
トマス14

ええ、だからこそ、私はOPが何を考えているのかを見るのを待つと言っています。あなたは間違いなく非常に灰色の領域を見つけました。終了phpタグbtwは必要ありません。したがって、34文字バージョンで十分です。改善のアイデアはありますが、最初にテストする必要があります。
ティムセグイン14

さて、33文字になりました。私はあなたがより良くすることを敢えてします。;)
ティムセギーン14

@TimSeguine Aaaah、あなたの調子になんという変化がありますか!:-) 今、あなたは私の投稿のルールをあまり気にしません!:-D
トマス

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の回答のバリエーションを行うことができ、これよりもさらに短いと思います。
ティムセギーン

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です。

空白も削除する必要があります。
ティムテック

1
長いAPI名を毎回呼び出す代わりに、次のような変数に保存します。var a = Microsoft.Win32.Registry.CurrentUser; a.GetValue(); a.SetValue();
Xantix 14

1

Tcl、63または73バイト

  • 一部のWebサービスでは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 14

1

Powershell、47バイト

スクリプトに名前が付けられていると仮定する a.ps1

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

スクリプトは、それ自体が置換上書きされる0と最初の行に123など。

また、両方のインスタンスをreplaceingことにより、他の8つのバイトを救うことができるa.ps11し、という名前のファイルとしてスクリプトを保存し1、これはビットが私のために遠くまでですが。

ファイルが「a.ps1」として保存されていない場合は、2行目をこれに置き換えます。

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

0 カウントを初期化する最初の行

Linebreakは、ファイルを2つに分割する最も簡単な方法を提供します

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

これは、我々は、次に、反復それを通ると、ファイル「a.ps1」をとり、線のアレイとしてそれを読み込む[0..1]変数こととセット$nとしてキャストさ[int]$tなるように、それぞれ0最初の行にはなる$nと「コード'2行目の$t

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

これは、,1,22つの要素の配列を作成するために配列表記を使用しました。1つは$n事前インクリメントで保存され、暗黙のブラケットを使用してstdoutに出力され、2つ目はファイルの2行目のテキスト、 「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.