สร้างสี่เหลี่ยมที่มีขนาดเพิ่มขึ้นโดยจำลองรหัสเริ่มต้น


45

งานที่ได้รับมอบหมายของคุณคือการเขียนโปรแกรมที่มีความยาวเท่ากันซึ่งจะพิมพ์สี่เหลี่ยม ASCII-art (อธิบายไว้ด้านล่าง) ซึ่งจะเพิ่มความยาวด้านโดย1หน่วยในแต่ละครั้งที่มีการวางรหัสต้นฉบับลงตรงกลางของรหัสปัจจุบัน

มันค่อนข้างยากสำหรับฉันที่จะกำหนดงานนี้เป็นอย่างดีดังนั้นฉันจะให้ตัวอย่าง:

  • สมมติว่ารหัสเริ่มต้นของคุณคือCODEและพิมพ์:

    0
    
  • จากนั้นแทรกCODEตรงกลาง: รหัสของคุณจะกลายเป็นCOCODEDEและควรพิมพ์:

    00
    00
    
  • ใส่CODEรหัสตรงกลางอีกครั้ง: รหัสของคุณกลายเป็นCOCOCODEDEDE และควรพิมพ์:

    000
    000
    000
    
  • และอื่น ๆ คำตอบของคุณควรทำงานตามหลักเหตุผลหลังจากทำซ้ำจำนวนเท่าใดก็ได้ แต่ฉันเข้าใจว่าเนื่องจากข้อ จำกัด ด้านประสิทธิภาพของภาษา

กฎบางอย่าง:

  • คุณสามารถใช้ASCII ที่พิมพ์ได้ (32-127) เป็นอักขระที่จะใช้สำหรับสี่เหลี่ยมจัตุรัสของคุณ ตัวเลือกของคุณจะต้องคงที่ (คุณควรใช้อักขระเดียวกันสำหรับการทำซ้ำแต่ละครั้ง)

  • ตารางการส่งออกเริ่มต้นต้องมีด้านยาวด้านละ1

  • ตาราง ascii-art ถูกกำหนดเป็นสตริงที่มีNบรรทัด (คั่นด้วยN-1 linefeeds / ขึ้นบรรทัดใหม่) และแต่ละบรรทัดมีNสำเนาของอักขระที่เลือก

  • การส่งออกของคุณไม่ได้รับอนุญาตให้มีช่องว่างที่ไม่เกี่ยวข้องใด ๆ นอกเหนือจากการขึ้นบรรทัดใหม่

  • คุณสามารถใช้ค่าเริ่มต้นสำหรับอินพุตและเอาต์พุต (อนุญาตให้โปรแกรมหรือฟังก์ชั่น แต่ตัวอย่างไม่ได้)

  • กลางของรหัสของคุณถูกกำหนดให้เป็นจุดที่รหัสที่มาสามารถแบ่งออกเป็นสองส่วนดังกล่าวว่าทั้งสองมีค่าเท่ากัน

  • คำตอบของคุณจะได้รับคะแนนตามความยาวของโปรแกรมต้นฉบับของคุณเป็นไบต์ จำนวนไบต์ต่ำสุดชนะ ในกรณีที่มีเน็คไทคำตอบที่ถูกส่งไปก่อนหน้านี้ชนะ

  • คุณสามารถใช้โปรแกรมนี้เพื่อใช้การแทรกโดยไม่ต้องทำด้วยมือ


1
ผมต้องยอมรับว่าผมได้รับแรงบันดาลใจจากคำถามนี้ควินโพสต์ก่อนหน้านี้ หากผู้คนคิดว่าใกล้เกินไปฉันจะลบสิ่งนี้อย่างมีความสุข ขอโทษด้วยถ้าฉันทำผิดพลาดฉันก็ยังไม่ค่อยมีประสบการณ์กับกฎที่นี่ :)

2
ยินดีต้อนรับสู่ PPCG! ฉันขอแนะนำให้ใช้Sandboxสำหรับความท้าทายในอนาคตของคุณ
user202729

7
ยินดีต้อนรับสู่เว็บไซต์! การใช้งานที่ยอดเยี่ยมของความท้าทายสำหรับแรงบันดาลใจอื่นโดยไม่ตกอยู่ในกับดักล่อ :)
ปุย

โปรแกรมตัวช่วยของคุณใช้ไม่ได้กับโปรแกรมที่มีหลายบรรทัด วิธีการเกี่ยวกับเรื่องนี้รุ่นที่ปรับเปลี่ยนจากคำถามอื่น ๆ ?
Jo King

1
@ user77954 แต่รหัส brainfuck ของฉันสั้นกว่าไพ ธ อนของคุณ :( (มีใครเคยบอกว่าก่อนหน้านี้?)
Jo King

คำตอบ:


41

Pyth , 2 ไบต์


5

ลองออนไลน์! นอกจากนี้ลองสองเท่า , สามเท่า !

มันทำงานอย่างไร

\nคือคำสั่งที่พิมพ์อาร์กิวเมนต์ด้วยการขึ้นบรรทัดใหม่ในขณะที่ส่งคืนพร้อมกัน ดังนั้นทุกครั้งที่คุณทำการแทรกคุณจะเปลี่ยนจำนวนเต็ม5ตัวอักษรเป็นตัวเลขที่มีNสำเนา5 ตัวต่อกันและบรรทัดใหม่ที่นำจะทำให้แน่ใจว่ามันพิมพ์จำนวนครั้งที่เหมาะสมทำให้มันเป็นรูปสี่เหลี่ยมจัตุรัส


6
Frick ศักดิ์สิทธิ์นั้นสั้น ...
ETHproductions

หลักฐานการเพิ่มประสิทธิภาพ (: P):เนื่องจากจำนวนไบต์ต้องเท่ากันและไม่สามารถเป็นลบได้จำนวนไบต์ขั้นต่ำที่เป็นไปได้คือ0ไบต์ มี0โปรแกรมที่ตรงกับ 1 ไบต์ซึ่งไม่สามารถทำงานได้ตามที่ต้องการ ดังนั้น2ไบต์จึงเหมาะสมที่สุด
Mr. Xcoder

10
ทุกคน (โดยเฉพาะผู้ลงคะแนน HNQ) ขึ้นไปโหวตคำตอบอื่น ๆ ด้วยและหลีกเลี่ยงเอฟเฟกต์ FGITW
user202729

25

JavaScript (ES6), 42 32 30 ไบต์

s=[this.s]+0;  console.log(s);

การทำซ้ำที่สอง:

s=[this.s]+0;  s=[this.s]+0;  console.log(s);console.log(s);

งานนี้โดยท้าย0ไปsในแต่ละครั้งในช่วงครึ่งแรกของรหัสที่มีการเรียกใช้และการพิมพ์sของตัวเองทุกครั้งที่ช่วงครึ่งปีหลังมีการเรียกใช้ ใช้ประโยชน์จากสี่องค์ประกอบของ JavaScript:

  1. thisสภาพแวดล้อมในปัจจุบันสามารถเรียกว่ามี นี้จะช่วยให้เราทำในสถานที่ของthis.ss
  2. undefinedเมื่อมีการเข้าถึงทรัพย์สินที่ไม่ได้รับการกำหนดไว้ในวัตถุแทนการขว้างปาข้อผิดพลาดผลตอบแทน JavaScript
  3. อาร์เรย์บวกกับตัวเลขส่งคืนสตริง [1,2,3] + 4 === "1,2,34"
  4. เมื่อ stringifying อาร์เรย์จะถูกแปลงเป็นสตริงที่ว่างเปล่าซึ่งหมายความว่าundefined[undefined] + 0 === "0"

เมื่อรวมกันหมายความว่าเราสามารถแสดงครึ่งแรก (สร้างสตริงเป็นศูนย์) ในเวลาเพียง 13 ไบต์ หากอนุญาตให้ใช้alertแทนconsole.logได้เราสามารถบันทึกได้อีก 4 ไบต์โดยการตัดทอนครึ่งหลัง


ขอแสดงความยินดีผ่านการทดสอบที่ฉันได้ทำ!

1
... แยบยล! :)
Shaggy




9

C (gcc) , 170 168 96 80 72 70 ไบต์

รุ่นที่สั้นกว่ามาก ยังคงหวังว่าฉันจะหาวิธีแก้ปัญหาโดยไม่ต้อง preprocessor

i;main(n){for(;i++<n;)printf
#if 0

#endif
(" %*c",n=__LINE__/4, 10);}

ลองออนไลน์!

รุ่น 168 ไบต์เก่า:

#ifndef A
#define A p(c){putchar(c);}j,n;main(i){for(
#else
#define A n++,
#endif
A



#ifndef B
#define B i=++n;i--;p(10))for(j=n;j--;)p(64);}
#else
#define B
#endif
B

ลองออนไลน์!



@ user202729 อ่าใช่ คิดว่าฉันคงพิมพ์ผิด แต่แนะนำข้อผิดพลาด การคืน
Gastropner

8

Python 2 , 30 ไบต์

False+=1      ;print'*'*False;

ลองออนไลน์! , 2และ3ซ้ำ

สิ่งนี้ทำให้การใช้งานความจริงที่ว่า bools ใน Python นั้นเป็น ints และชื่อFalseและTrueถูกกำหนดใหม่ใน Python 2

Python 1 , 32 ไบต์

exit=exit+'*'  ;print exit[30:];

ลองออนไลน์! , 2และ3ซ้ำ

ใน Python 1 สตริงบิวด์อินexitและquitมีอยู่เพื่อแจ้งให้ผู้ใช้ของเชลล์แบบโต้ตอบทราบถึงวิธีออกจากมัน "Use Ctrl-D (i.e. EOF) to exit."ค่าเริ่มต้นคือ


1
ฉันกำลังจะแนะนำn=False+=1;print'*'*n;แต่ฉันลืมไปตลอดว่านั่นไม่ใช่คุณลักษณะของ Python ...
ETHproductions

6

ถ่าน 6 ไบต์

⊞υωLυ⸿

ลองออนไลน์! คำอธิบาย:

  ω     Predefined empty string (any variable would do here)
 υ      Predefined initially empty list
⊞       Push

υ จบลงด้วยความยาวของจำนวนการทำซ้ำ

    υ   List
   L    Length
        Implicitly print as a row of `-`s
     ⸿  Move to start of next line

6

Haskell , 68 ไบต์

let s@(z:n)="0\n"in case lines<$>[]of(h:t):_->(h:h:t)>>(z:h++n);_->s

ลองมันออนไลน์ครั้งเดียว ,ครั้งที่สองหรือสามครั้ง

เนื่องจากความเกียจคร้านของ Haskell การแสดงออกเช่นเดียวกับที่กล่าวข้างต้นนับเป็นฟังก์ชั่นที่ไม่มีการโต้แย้งตามคำถาม Metaนี้




5

Brain-Flak , 74 ไบต์

(((((()()()){}){}){}){})((()()()()()<>){})<>([]){({}[()]<(({})<>)<>>)}{}<>

ลองออนไลน์!

ลองสองเท่าและสามเท่าสามเท่า

คำอธิบาย

(((((()()()){}){}){}){}) # push 48 ("0") onto first stack
((()()()()()<>){})       # push 10 (\n) onto second stack
<>([]){({}[()]<          # a number of times equal to the height of the first stack:
  (({})<>)<>             #   copy the top of the first stack to the second stack
>)}{}<>                  # cleanup and return to second stack

จุดพักอยู่ตรงกลางของ <>ส่วน "push 10" การทำลายสิ่งนี้จะเหลือ 5 ในกองซ้อนที่สามจนกว่าเราจะถึงครึ่งหลังที่สอดคล้องกันซึ่งเมื่อถึงจุดที่กด 10 จะกลับมาทำงานต่อที่จุดที่เหลือ

ในขณะที่มันเป็นไปได้ที่จะผลักดันค่า ASCII พิมพ์ (เว้นวรรค) ใน 22 ไบต์นี้จะทำให้ภาคกลางจะดำเนินการหลังจากการผลักดัน<> 5โดยการเพิ่มสองไบต์เพิ่มเติมฉันสามารถย้าย<>เพื่อให้ความคืบหน้าทั้งหมดไปสู่การผลัก10อยู่ในกองซ้อนที่สาม เป็นโบนัสสิ่งนี้ทำให้สี่เหลี่ยมที่เกิดขึ้นนั้นสวยงามยิ่งขึ้น


ธงบรรทัดคำสั่งได้ฟรีในขณะนี้
user202729

4

tinylisp , 112 ไบต์

(load library) (d N((q((x)(i x(inc x)1)))(v(h(t(t(h(t(q())))))))))(join(repeat-val(string(repeat-val 42 N))N)nl)

ลองออนไลน์! นอกจากนี้ยังเป็นสองเท่าและห้าเท่า

"การสร้างสตริงในครึ่งแรกพิมพ์ในครึ่งหลัง" วิธีการที่หลายภาษากำลังใช้งานจะไม่ทำงานใน tinylisp เนื่องจากไม่มีตัวแปรที่ไม่แน่นอน เราทำการวางโค้ดที่ร้ายแรงแทน

เมื่อใส่สำเนาที่สองของรหัสมันจะถูกวางไว้ภายใน(q())ซึ่งล้อมรอบในรายการ จากนั้นเครื่องหยอดเมล็ดลงในรายการให้กับส่วนหลัง(h(t(t(h(t(...)))))) ประเมินมัน; จากนั้นเราจะส่งผ่านไปยังฟังก์ชันที่ไม่ได้ตั้งชื่อซึ่งจะเพิ่มค่าผลลัพธ์ถ้ามันเป็นตัวเลขและส่งกลับ 1 ถ้ามันเป็นรายการว่างเปล่า ผลลัพธ์สุดท้ายในรหัสที่ซ้อนกันด้านนอกสุดถูกกำหนดให้(d N(v(...))(q((x)(i x(inc x)1)))Nผลสุดท้ายในรุ่นที่ซ้อนกันด้านนอกสุดของรหัสที่ได้รับมอบหมายให้ในสาระสำคัญเราได้ตั้งค่าการเรียกซ้ำแบบแปลก ๆ ที่นับจำนวนระดับการซ้อน

ครึ่งหลังของโค้ดจะสร้างสตริงของNเครื่องหมายดอกจันจากนั้นรายการของNสตริงดังกล่าวจากนั้นจะรวมรายการในบรรทัดใหม่ ผลลัพธ์จะถูกแสดงพร้อมกับขึ้นบรรทัดใหม่


3

R , 44 ไบต์

F=F+1;T=TRUE*TRUE+12;
write(strrep(1,F),"");

ลองออนไลน์!

พิมพ์ด้วยบรรทัดใหม่ต่อท้าย T=TRUE*TRUE+12เป็นเพียงแผ่นยาว

ลองสองเท่าและลองสามเท่า


คุณสามารถกำจัด 2 ไบต์โดยการลบเครื่องหมายอัฒภาค ฉันคิดว่ามีช่องว่างในตอนท้ายของบรรทัดแรกซึ่งคุณสามารถแทนที่ด้วย #: F=F+1;T=TRUE*TRUE+12#<newline>write(strrep(1,F),"")
Andreï Kostyrka

@ AndreïKostyrkaที่น่าจะเป็น 43 ไบต์ซึ่งไม่น่าเสียดาย
Giuseppe

3

Julia 0.6 , 29 bytes

ความคิดของฉันทั้งหมดนั้นยาวกว่าการปรับแก้ปัญหาของงูหลามที่ชาญฉลาด

i=0;i+=1;    i
println("0"^i)

กลายเป็น

i=0;i+=1;    ii=0;i+=1;    i
println("0"^i)
println("0"^i)

ลองออนไลน์!


3

SNOBOL4 (CSNOBOL4) , 130 68 ไบต์

ตอนนี้ไม่มีความคิดเห็น! ดูประวัติการแก้ไขสำหรับคำอธิบายของอัลกอริทึมเก่า

	X =X + 1
	A =ARRAY(X,DUPL(1,X));
I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

ลองออนไลน์!

ลองสองเท่าและสามเท่า

คำอธิบาย:

	X =X + 1		;* increment X
	A =ARRAY(X,DUPL(1,X));	;* create an x-length array with 1 repeated x times for each element
I	I =I + 1		;* for i < x
	OUTPUT =A<I>	:S(I)	;* output a[i]
END

เนื่องจากต้องมีENDป้ายกำกับและอะไรก็ตามหลังจากENDละเว้นป้ายกำกับแรกเราจึงได้รับข้อได้เปรียบสองประการสำหรับความท้าทายนี้:

  • การดำเนินงานในช่วงครึ่งแรกของโปรแกรมจะถูกทำซ้ำXสำหรับการXทำซ้ำ
  • จะมี (ล่าม) อยู่เพียงหนึ่งสำเนาของครึ่งปีที่สองรวมทั้งป้าย

สิ่งนี้ชี้ให้เห็นว่าเราใช้การทำซ้ำในช่วงครึ่งปีแรกและจากนั้นเราสามารถใช้วิธีการติดฉลากแบบ "ธรรมดา" เพื่อทำซ้ำXเวลาส่งออก

ครึ่งแรกคือ

	X =X + 1
	A =ARRAY(X,DUPL(1,X));

ซึ่งเมื่อทำซ้ำจะเพิ่มXจำนวนครั้งที่เหมาะสมและสร้างARRAY Aด้วยดัชนีจาก1ถึงXและที่แต่ละองค์ประกอบของAคือสตริง1ซ้ำหลายXครั้ง

จากนั้นไม่ว่าจะมีการทำซ้ำโปรแกรมกี่ครั้งล่ามจะเห็นเฉพาะ:

I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

ซึ่งเป็นโปรแกรม SNOBOL ทั่วไปที่พิมพ์องค์ประกอบของAหนึ่งครั้งจนกว่าดัชนีจะออกจากขอบเขตแล้วยุติโปรแกรม

;เป็นตัวเลือกสิ้นสุดเทอร์มินัลโดยทั่วไปจะสงวนไว้สำหรับหนึ่งบรรทัดEVALหรือCODEข้อความสั่งที่ค่อนข้างนำจำนวนไบต์ไปที่ 68 อย่างเรียบร้อยและทำเครื่องหมายจุดกึ่งกลางทำให้โค้ดต่อท้ายที่นั่น


3

shortC , 56 44 ไบต์

-12 bytes: เดี๋ยวก่อนฉันใช้ shortC ทำไมไม่ใช้บางสิ่ง C ที่สั้นลง

s[];A
strcat(s,"@");//
Js);/*filling space*/

ฉันจะใช้มาตรฐาน C แต่ต้องใช้}ในตอนท้ายซึ่งยุ่งกับการจำลองแบบ shortC แทรกไว้ที่ EOF โดยปริยาย


2

Perl 5 , 25 ไบต์

24 รหัสไบต์ + 1 -pสำหรับ

ขอขอบคุณที่คุณอาจไม่ต้องการให้มีการตั้งค่าสถานะบรรทัดคำสั่งโปรดแจ้งให้เราทราบหากนี่ไม่ถูกต้อง

$@=0 x++$n;;$_="$@
"x$n;

ลองออนไลน์!


1
ธงบรรทัดคำสั่งได้ฟรีในขณะนี้
user202729

1

Zsh , 10 ไบต์

s+=0
<<<$s

ลองชุดทดสอบออนไลน์แบบเต็ม!

... ใช่นี่มันค่อนข้างดีกว่า ผนวกกับสตริง N ครั้งจากนั้นพิมพ์ N ครั้ง ปรากฎว่าใช้<<<foo<<<fooงานได้ดี


zsh , 64 ไบต์

ตัวละครที่ใช้: (ช่องว่าง)

f(){printf '%*s\n' $1}
:<<'E'

E
repeat $[i=LINENO/3];f $i
exit

ลองชุดทดสอบออนไลน์แบบเต็ม!

จุดกึ่งกลางอยู่ระหว่างวินาทีEและบรรทัดใหม่ที่ตามมา heredoc จะจบลงเมื่อมีEเส้นตรงบนตัวมันเองซึ่งเกิดขึ้นตรงกลางของรหัส


ปรับปรุง lol @ "เล็กน้อย" สามารถแสดงเป็นs+=0;<<<$s
roblogic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.