สร้าง counterstring ไม่ จำกัด


11

counterstringคือการจัดเรียงตัวของตัวเองอธิบายข้อมูลการทดสอบบางอย่างที่ถูกนำมาใช้ในการทดสอบซอฟต์แวร์ ไม่แน่ใจว่ามันถูกคิดค้นโดยJames Bachแต่ฉันรู้จากที่นั่น

แนวคิดมีดังนี้: ข้อมูลทดสอบประกอบด้วยเครื่องหมายดอกจัน ( *) มากมาย ตัวเลขที่อยู่ข้างหน้าเครื่องหมายดอกจันจะบอกคุณว่าข้อมูลการทดสอบอยู่ที่จุดนั้นนานแค่ไหน หากคุณต้องการทราบตำแหน่งในข้อมูลการทดสอบที่ไม่ใช่เครื่องหมายดอกจันให้ค้นหาเครื่องหมายดอกจันล่าสุดดูที่ตัวเลขก่อนหน้านี้และเพิ่มจำนวนหลักที่ตามมา

ลำดับเริ่มต้นดังนี้:

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*

นี่ควรตอบคำถามของ@Leaky Nunหากมีการตัดสินใจระหว่าง 995 * 999 * และ 995 * 1000 * หรือคล้ายกัน: ไม่

จุดสิ้นสุดของไฟล์ 2 GB ที่มีค่าอินพุต 2147483647 คือ:

2147483640*2147483

ถ้ามันไม่หยุดคุณจะทดสอบมันอย่างไร?
Leun Nun

2
ความยาวนั้นเป็นตัวอักษรหรือไม่?
TheBikingViking

4
คุณสามารถพิสูจน์ได้ว่าเราจะไม่ต้องเลือกระหว่าง995*999*และ995*1000*หรืออะไรอย่างนั้น?
Leun Nun

1
ในอนาคตโปรดใช้แซนด์บ็อกซ์เพื่อรีดความหงุดหงิดในความท้าทายของคุณก่อนโพสต์
Mego

1
@ThomasWeller หากเราสามารถสร้างเอาต์พุตที่ยาวขึ้นเราจะไม่รับอินพุตและสร้างสตริง 2GB ได้หรือไม่?
xnor

คำตอบ:


4

Haskell, 60 58 ไบต์

ในฐานะที่เป็นฟังก์ชั่นเราได้รับ:

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

โปรแกรมเต็มรูปแบบ72 70 ไบต์

สิ่งนี้จะส่งผลให้ไม่มีที่สิ้นสุด counterstring เพื่อ 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)

นี้ทำงานได้ถึงประมาณขนาด RAM ของคุณของคุณเนื่องจากค่าเริ่มต้น Haskell 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]

รับจำนวนเต็ม n จาก stdin และพิมพ์ counterstring ของความยาว 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ตาม.lengthจำนวนสตริงที่เกิดขึ้นจาก$iและเครื่องหมายดอกจัน จากนั้นหากมี.lengthการ$iเปลี่ยนแปลง (เช่นเราย้ายจาก 2 หลักเป็น 3 หลัก) เราจะเพิ่มทั้ง$lตัวแปรตัวช่วยและ$i(เพื่ออธิบายตัวเลขเพิ่มเติม) จากนั้นเราใช้add-contentคำสั่งเพื่อผนวก"$i*"ไฟล์.\oในไดเรกทอรีปัจจุบันด้วย-noNewLine

NB

  • ต้องการ v5 เนื่องจาก-noNewLineพารามิเตอร์ได้รับการเพิ่มในที่สุดในเวอร์ชันนั้น
  • 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 กำหนด a [string]ด้วยคอนสตรัคString(char c,Int32 length)เตอร์รุ่นนี้จะไม่ตอบสนองความต้องการอินพุตสูงสุดเนื่องจากสตริงเอาต์พุตจะล้นและ barf

นอกจากนี้คุณอาจไม่ต้องการให้มีสตริง ~ 2GB ลอยอยู่รอบ ๆ ในไปป์ไลน์ของคุณ เพียงแค่พูดใน


1.79769313486232E + 308 จะไม่ทำงานอย่างแน่นอนเพราะการเพิ่มจำนวนเล็กน้อยลงในโฟลตจะไม่เปลี่ยนค่าอีกต่อไป ดูstackoverflow.com/questions/12596695/…ดังนั้นฉันเดาว่ามันจะหยุดทำงานเมื่อ "อัพเกรด" เป็นสองเท่า
Thomas Weller

@ThomasWeller PowerShell [double]เป็น 64- บิต ยกตัวอย่างเช่นการทำงานfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}จะแสดงความก้าวหน้าอย่างต่อเนื่อง$iแต่Typeการเปลี่ยนแปลงที่จะ2147483648 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 * 59 * 65 * 62 * 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.