무제한 카운터 스트링 만들기


11

counterstring은 소프트웨어 테스트에 사용되는 자체 기술 시험 데이터의 일종이다. 실제로 제임스 바흐 (James Bach) 가 발명 한 것이 확실하지 않지만 나는 그곳에서 알고 있습니다.

테스트 데이터에는 별표 ( *) 가 많이 포함되어 있습니다 . 별표 앞의 숫자는 해당 시점의 테스트 데이터 길이를 나타냅니다. 테스트 데이터에서 별표가 아닌 위치를 알아야하는 경우 마지막 별표를 찾아 앞의 숫자를보고 뒤에 오는 자릿수를 추가하십시오.

순서는 다음과 같이 시작됩니다.

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

보다시피, 표시된 별표는 위치 14에 있습니다.

다음과 같이 파일이 잘리는 경우

[...]2045*20

당신은 2047 자 어딘가에 (2,045 별표는 플러스 2의 한계가 있음을 유도 할 수있다 2하고 0).

해당 형식의 임의의 긴 테스트 문자열을 출력 하는 가장 짧은 (이것은 ) 프로그램 을 만드는 것이 당신의 임무 입니다. 문자 길이는 인수로 제공됩니다. 프로그램은 최대 2GB의 테스트 데이터 (입력 값 2147483647 자)를 지원해야합니다.

2GB 파일의 "위험한"위치 :

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 인 2GB 파일의 끝은 다음과 같습니다.

2147483640*2147483

그것이 멈추지 않으면 어떻게 테스트합니까?
Leaky Nun

2
길이가 문자입니까?
TheBikingViking

4
당신은 우리가 선택할 필요가 없을 것이라는 점을 증명할 수 995*999*995*1000*또는 아무것도 그런?
Leaky Nun

1
앞으로는 샌드 박스사용 하여 문제를 게시하기 전에 문제를 해결하십시오.
Mego

1
@ThomasWeller 더 긴 출력을 만들 수 있다면 입력을받지 않고 2GB 문자열 만 생성 할 수 있습니까?
xnor

답변:


4

하스켈, 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

파이썬 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이 뜻 출력 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)버전은 최대 입력 요구 사항을 충족 하지 않습니다 .

또한 파이프 라인에 ~ 2GB 문자열이 떠 다니고 싶지 않을 수도 있습니다. 그냥 말해


1.79769313486232E + 308은 플로트에 작은 숫자를 추가해도 더 이상 값이 변경되지 않으므로 작동하지 않습니다. 참조 stackoverflow.com/questions/12596695/... 그래서 내가이 두 배로 "업그레이드"한 번 작동을 중지하는 것이 그것을 생각
토마스 웰러

@ThomasWeller PowerShell [double]은 64 비트입니다. 예를 들어, 실행은 for($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}꾸준히 진행 표시됩니다 $iType의 변화 2147483648로를 double. 나는 어느 시점에서 약 15 자리의 정밀도.ToString 또는를 사용 하기 시작할 때 작동을 멈출 것이라고 확신 합니다 e. 이 [double]::MaxValue진지한 상한보다 유쾌한 농담이었습니다.
AdmBorkBork

1

파이썬 (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가 허용 한 것보다 항상 길 것 입니다.

프로그램은를 사용하여 #루프 의 시퀀스에서 현재 번호로 레지스터를 선택적으로 업데이트합니다 ¹©=¡. 예를 들어 ©두 번째 µ를 넣음으로써 이것이 더 짧을 수 있기를 바랐 지만 불행히도 작동하지 않으며 더 짧은 것을 알아낼 수 없었습니다.

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