無制限のカウンターストリングを作成する


11

counterstringは、ソフトウェアのテストで使用される自己記述型テストデータのいくつかの並べ替えです。それが実際にジェームズ・バッハによって発明されたかどうかはわかりませんが、私はそこからそれを知っています。

アイデアは次のとおりです。テストデータには多くのアスタリスク(*)が含まれています。アスタリスクの前の数字は、その時点でのテストデータの長さを示しています。テストデータ内でアスタリスクではない位置を知る必要がある場合は、最後のアスタリスクを見つけ、前の数字を見て、それに続く桁数を追加します。

シーケンスは次のように始まります。

2*4*6*8*11*14*17*20*23*
             ^

ご覧のとおり、マークされたアスタリスクは位置14にあります。

次のようにファイルが切り捨てられた場合

[...]2045*20

あなたは2047文字のどこかに(2045アスタリスクがプラスのための2の限界があることを導き出すことが可能2とは0)。

その形式の任意の長いテスト文字列(std :: outまたはfileなど)を出力する最短(これは)プログラムを作成するのはあなたのタスクです。文字の長さは引数として指定されます。プログラムは、最大2 GBのテストデータ(入力値2147483647文字)をサポートするものとします。

2 GBファイルの「危険な」位置:

8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*

これは、995 * 999 *から995 * 1000 *または同様の決定を行う場合に@Leaky Nunの質問に答える必要があります。

入力値2147483647の2 GBファイルの終わりは次のとおりです。

2147483640*2147483

停止しない場合、どのようにテストしますか?
漏れの修道女

2
その長さは文字数ですか?
TheBikingViking

4
どちらか995*999*995*1000*またはそのようなものを選択する必要がないことを証明できますか?
リーキー修道女

1
将来的には、Sandbox使用して、課題を投稿する前に、課題を解決してください。
メゴ

1
@ThomasWellerより長い出力を作成できる場合、入力を受け取らずに2GBの文字列を生成できますか?
-xnor

回答:


4

Haskell、60 58バイト

関数として次のものを取得します。

f=length.show
iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

完全なプログラム、72 70バイト

これにより、無限カウンターストリングがSTDOUTに出力されます。

f=length.show
main=putStr$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

長さを入力するには、さらに20バイトが必要です。

main=interact(\j->take(read j)$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show)

Haskellはデフォルトで数値積分タイプをに設定しているため、これはおおよそRAMサイズに対応しIntegerます。



2

Python 2、74 72 66 64 61バイト

f=lambda n,i=2:"%d*"%i+f(n,len(`i+2`)-~i)[:n-2]if i<n*2else""

整数nを取り、長さnのカウンター文字列を出力します。

プログラムバージョン、69バイト:

s,n,i="",input(),2
while i<2*n:s+="%d*"%i;i+=len(`i+2`)+1
print s[:n]

stdinから整数nを取得し、長さnのカウンター文字列を出力します。

より短いが、ほとんど機能する代替バージョン:

n,i=input(),2
while i<2*n:print("%d*"%i)[:n-i],;i+=len(str(i+2))+1

1

PowerShell v5、97バイト

param($n)$l=1;for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};ac .\o "$i*" -n}

入力をコマンドライン引数として受け取り、整数の長さを追跡するために使用する$nヘルパー$lを設定します。次に、から0までループし$nます。繰り返しごとに、形成された文字列とアスタリスクで増分$iします。次に、が変更された場合(たとえば、2桁から3桁に移動した場合)、ヘルパーength変数と(追加の桁を考慮して)の両方をインクリメントします。次に、コマンドを使用して、oNewLine を使用して、現在のディレクトリのファイルに追加します。.length$i.length$i$l$iadd-content"$i*".\o-n

NB

  • -noNewLineパラメーターがそのバージョンで最終的に追加されたため、v5が必要です。
  • PowerShellはからに自動的にアップコンバート[int]します[double](いいえ、なぜそうならないのかわかりません[long])。したがって、これは2147483648問題なく、を超える入力を適切に処理します。理論的には、文句を言う前にどこか1.79769313486232E+308(最大値[double])までの入力を処理しますが、それが起こる前にディスクがいっぱいになると思います。;-)
  • ループ条件チェックにより、これは最小の入力長をファイルに出力します。たとえば、入力の場合、10これはoutput 2*4*6*8*11*になります。これは、入力よりも大きい11最初の$i値だからです。

PowerShell v2 +、97バイト(非競合)

param($n)$l=1;-join(&{for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};"$i*"}})

これは、ファイルに送信する代わりに、ループの繰り返しをカプセル化-joinしてから、文字列にまとめます。これにより、v5より前のバージョンで機能します。ただし、.NETはの[string]ようなコンストラクタでを定義するため、出力文字列がオーバーフローしてbarfになるためString(char c,Int32 length)、このバージョンは最大入力要件を満たしませ

また、パイプラインに約2 GBの文字列を浮かせたくない場合もあります。言ってるだけ'。


1.79769313486232E + 308は確かに機能しません。小さな数値をフロートに追加しても値が変更されないためです。参照してくださいstackoverflow.com/questions/12596695/...だから私のそれはそれは倍増し、「アップグレード」された後に動作を停止していること、それを推測
トーマス・ウェラー

@ThomasWeller PowerShell [double]は64ビットです。たとえば、run for($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}はの着実な進行を示します$iが、Type変化は2147483648to doubleです。ある時点で、おそらく15桁程度の精度で、または.ToStringが使用を開始すると、動作しなくなると確信していますe。これ[double]::MaxValueは、重大な上限というよりも、使い捨ての冗談でした。
AdmBorkBork

1

Python 3、126 114 99バイト

def f(x,s=''):
 i=t=2
 while len(s)<x:i+=len(str(t+i))-len(str(t));s+=str(t)+'*';t+=i
 print(s[:x])

文字列を切り捨てる文字数の引数を介して入力を受け取り、STDOUTに出力する関数。

使い方

文字列内の数値の差は、最初は2です。桁違いに渡されるたびに、この差は1ずつ増加します。これは、現在の数字の桁数と差に加算される現在の数字の桁数の差を取ることで実現できます。これは、必要な場合にのみ1です。この関数は、文字列の長さが入力よりも短い間ループし、必要に応じて文字列に追加して差と数を更新し、印刷する前に切り捨てます。

Ideoneでお試しください

無限出力バージョン、69バイト

s=i=2
while 1:i+=len(str(s+i))-len(str(s));print(end=str(s)+'*');s+=i

1

R、92バイト

    N=nchar;f=function(n){z=0;y="";while(z<n){z=z+N(z+N(z)+1)+1;y=paste0(y,z,"*")};strtrim(y,n)}

出力例:

f(103)[1] "2 * 4 * 6 * 8 * 11 * 14 * 17 * 20 * 23 * 26 * 29 * 32 * 35 * 38 * 41 * 44 * 47 * 50 * 53 * 56 * 59 * 62 * 65 * 68 * 71 * 74 * 77 * 80 * 83 * 86 * 89 * 92 * 95 * 98 * 102 * 1 "


0

ゼリー22 19 18バイト

2µṾL+®‘¹©=¡=µ³#j”*

オンラインでお試しください!

n文字列の最初の数字を見つけて、リストをアスタリスクで結合します。これは常にnコメントでOPが許可した長さよりも長くなります。

プログラムは、#ループ内のシーケンス内の現在の番号でレジスタを選択的に更新します¹©=¡。たとえば、©2番目の後に置くことで、これが短くなることを望んµでいましたが、残念ながらそれは機能せず、短いものを見つけることができませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.