ถักถุงเท้า ASCII ให้ฉัน


15

บทนำ

เรื่องสั้นเรื่องสั้น: ไม่กี่วันที่ผ่านมาฉันเริ่มถักถุงเท้าโดยไม่ได้ตั้งใจและโครงสร้างเชิงตรรกะที่น่ารักของรอยเย็บธรรมดาทำให้ฉันมีความคิด: ทำไมเราไม่เพียงแค่ถักถุงเท้า ASCII?

อินพุต

การป้อนข้อมูลที่เป็นจำนวนเต็ม N [2,30]ในช่วง

เอาท์พุต

ผลลัพธ์คือถุงเท้าแน่นอน

โครงสร้าง

เพราะเราจะใช้การเย็บธรรมดาเท่านั้นคุณจะใช้vสำหรับการเย็บที่ลดลงและ>สำหรับการเย็บที่ถูกต้อง ให้ฉันอธิบายโครงสร้างแบบเต็มด้วยตัวอย่างสำหรับN=8:

vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvv>>>
vvvvvv>>>>>>
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
  • บล็อกแรกคือส่วนบน มันมีความกว้างNและความสูงN*1.5
  • หลังจากนั้นส้นเท้าก็เริ่ม คุณลบหนึ่งรายการvต่อแถวจากด้านขวาจนกว่าคุณจะมีN/2ความกว้าง จากนั้นคุณเพิ่มN/2แถวที่มีความกว้างN/2ด้านล่างเพื่อทำให้ถักได้ด้านล่าง โปรดทราบว่ามันให้จำนวนN/2 + 1แถวที่มีความกว้างN/2

ส่วนแรก:

vvvvvvvv    //begin with width N
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv    // N*1.5 times
vvvvvvv     // reduce
vvvvvv
vvvvv
vvvv        // till here
vvvv        // repeat N/2 times
vvvv
vvvv
vvvv
  • ตอนนี้คนไข้เริ่มถักไหมพรม คุณเริ่มต้นด้วยแถวที่ลดลงแรกเติม>จนกว่าคุณจะมีความกว้างNและเพิ่มอีกสอง ดำเนินการต่อกระบวนการนั้นรวมถึงแถวแรกที่มีN/2ความกว้าง
  • เติมแถวด้านล่างลงในระดับนั้นและเพิ่มN*1.5เวลา>ลงไป
  • ให้ชิ้นส่วนด้านนอกตามที่เป็นอยู่และเพิ่มลงในแถวด้านล่างส่วนที่หนึ่งและส่วนที่สองให้มากขึ้น>'sจนกว่าจะเสร็จ

ส่วนที่สอง:

vvvvvvvv
vvvvvvv>>>  //fill to N and add two >
vvvvvv>>>>>>     //repeat
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>   //till here
vvvv>>>>>>>>>>>>>>>>>>>>>>>>       //fill to the row above and add N*1.5 times >
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>     //add two more '>' than the row above
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>     //add two more '>' than the row beneath
vvvv>>>>>>>>>>>>>>>>>>>>>>>>

กฎระเบียบ

ลากเส้นขึ้นบรรทัดใหม่ก็โอเค

คุณสามารถเลือกระหว่างตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กVแต่ต้องสอดคล้องกัน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์จะชนะ

กรณีทดสอบ

N=2
vv
vv
vv
v>>>
v>>>>>>

N=4
vvvv
vvvv
vvvv
vvvv
vvvv
vvvv
vvv>>>
vv>>>>>>
vv>>>>>>>>>>>>
vv>>>>>>>>>>>>

N=6
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvvv
vvvvv>>>
vvvv>>>>>>
vvv>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>>>
vvv>>>>>>>>>>>>>>>>>>

N=12
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvvv
vvvvvvvvvvv>>>
vvvvvvvvvv>>>>>>
vvvvvvvvv>>>>>>>>>
vvvvvvvv>>>>>>>>>>>>
vvvvvvv>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvvvv>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

2
ฉันหวังว่าบรรทัดใหม่ที่ตามมาจะไม่เป็นไร? (เช่นกันวิธีหนึ่งที่จะเริ่มต้นถักถุงเท้าโดยไม่ตั้งใจได้อย่างไร)
Greg Martin

3
@GregMartin เยี่ยมชมยายของฉันและเธอถามฉัน มันยากที่จะบอกว่าไม่ให้เธอไปเลยเราไปกันแล้ว :) เสร็จหนึ่งวันแรกสองวันก่อน ฉันคิดว่ามันค่อนข้างดี แต่ฉันประเมินปริมาณงานต่ำเกินไป ดังนั้นจงมีความสุขถ้ามีใครทำถุงเท้าให้คุณ
izlin

ฉันสามารถใช้vหรือVแลกเปลี่ยนได้หรือไม่? ฉันจะสมมติช่วงเวลาที่vเป็นเพียงคนเดียวที่ได้รับอนุญาต แต่การอนุญาตVจะมีผลต่อจำนวนไบต์
อัตราส่วนทองคำ

@GoldenRatio ฉันเปลี่ยนกฎตอนนี้ทั้งสองได้รับอนุญาต
izlin

@GurupadMamadapur ดังที่คุณสามารถอ่านได้ใน 'การป้อนข้อมูล' อนุญาตให้ใส่ตัวเลขแม้เป็นตัวเลขเท่านั้น โปรแกรมของคุณไม่จำเป็นต้องจัดการกับตัวเลขคี่
izlin

คำตอบ:


2

Pyth - 93 ไบต์

J/Q2K"V"P*s*Q1.5+*QKbVJp*+Q_+1NK*+3*3N">";InQ2VJp*JK*+s*2aaNc-J 1 2c-J 1 2+3*Q3">";IqQ2pK*6">

คำอธิบาย:

J/Q2                             sets J to half of input
K"V"                             sets K to "V"
P                                prevents newline after main block of sock
*                                multiply the next 2 items
s*Q1.5                           rounds up input*1.5 (columns in main block)
+                                adds the next 2 item (this item gets multiplied by the previous item)
*QK                              multiplies "V" by input (resulting in each row)
b                                New line
VJ                               For all the numbers 0-((Q/2)-1) (as represented by N)
p                                print
*                                multiply the next 2 items
+Q_+1N                           input + -1*(1+N)
K                                "V"
*+3*3N">"                        3N+3 many ">"'s
;                                ends for statement
InQ2                             if input is not 2
VJ                               For all the numbers 0-((input/2)-1) (as represented by N)
p                                print
*JK                              input/2 many ">"'s
*+s*2aaNc-J 1 2c-J 1 2+3*Q3">"   int(abs(abs(N-((input/2)-1)/2)-((input/2)-1)/2)))+(input*3)+3 many ">"'s
;                                end of for statement
IqQ2                             if input is 2
pK*6">                           print "V" and 6 ">"'s

คุณสามารถลองได้ที่นี่!


2

Mathematica, 104 ไบต์

""<>{t=Table;c=t[{"v"~t~#,">"~t~#2,"
"},#3]&;h=#/2;c[#,0,3h],c[#-i,3i,z={i,h}],c[h,6h+2Min[i-1,h-i],z]}&

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

c[#1, #2, #3] = Table[{Table["v", #1], Table[">", #2], "\n"}, #3]

สร้างตารางรายการแต่ละอันประกอบด้วยหลาย"v"s ในแถวตามด้วยหลาย">"s ตามด้วยขึ้นบรรทัดใหม่ โชคดีที่ช่วง#3สำหรับด้านนอกTableสามารถมีชื่อตัวแปรซึ่งสามารถอ้างถึงในนิพจน์#1และ#2; สิ่งนี้ยอมให้ฟังก์ชันcถูกเรียกด้วยอาร์กิวเมนต์คงที่และตัวแปร ส่วนที่เหลือเป็นเพียงการคำนวณและผู้ประกอบการเข้าร่วมสตริง""<>แบนรายการซ้อนที่เกิดขึ้นฟรี


2

Python, 3.5 183 177 ไบต์

n=int(input())
h=n//2
z=h%2
l=['v'*h+'>'*(2*n-h+3*h+i*2)for i in range(1*z+n//4)]
*map(print,['v'*n]*(3*h)+['v'*i+'>'*(3*(n-i))for i in range(h,n)][::-1]+[l,l[:-1]][z]+l[::-1]),

คำอธิบายขาเข้า

ลองออนไลน์!


เพื่อให้คุณรู้ว่า TIO Nexus ทำงานได้ดีกว่า TIO v2 ในขณะนี้เนื่องจาก v2 อยู่ใน "ช่วงเริ่มต้นอัลฟ่า"

หากต้องการบันทึกหนึ่งไบต์คุณสามารถกำหนดตัวแปร 'v' ด้านบนได้
nedla2004

@JackBates สังเกตอย่างถูกต้อง
Gurupad Mamadapur

@ nedla2004 คุณหมายความว่าวิธีนี้n,v=int(input()),'v'? จากนั้นมันจะไม่บันทึกอะไรเลย
Gurupad Mamadapur

1

Groovy ขนาด 168 ไบต์

{n->h=n/2;z=(int)h%2;l=(0..<1*z+n/4).collect{'v'*h+'>'*(2*n-h+3*h+it*2)};(['v'*n]*(3*h)+(n-1..h).collect{'v'*it+'>'*(3*(n-it))}+(z==0?l:l[0..<-1])+l[-1..0]).join('\n')}

นี่คือการปิดไม่มีชื่อ วิธีการนี้คล้ายกับคำตอบPython 3.5ของฉันอย่างสมบูรณ์

ลองออนไลน์!


1

รุ่นที่ 279 ไบต์

@echo off
set i=for /l %%i in (2,2,%1)do 
set v=
%i%call set v=v%%v%%v
%i%echo %v%&echo %v%&echo %v%
%i%call:a
%i%call set v=%%v%%]]]
%i:,2,=,4,%call:c&if %%i lss %1 call set v=%%v%%]]
%i:2,=4,%call:b
exit/b
:a
set v=%v:~1%]]]]]
:b
set v=%v:~0,-2%
:c
echo %v:]=^>%

หมายเหตุ: บรรทัดที่สองลงท้ายด้วยช่องว่าง รุ่นที่มีปัญหากับการสะท้อน>ในตัวแปรดังนั้นฉันต้องก) ใช้แทน b) เรียกรูทีนย่อยเพื่อสะท้อนสตริงที่ถูกต้อง อันที่จริงฉันมีสามรูทีนย่อย:

  • aใช้สำหรับส้นเท้า หนึ่งอันvจะถูกลบออกทุกครั้งและ>เพิ่มสามวิ มีการเพิ่ม>s พิเศษสองรายการเพื่อให้รูทีนย่อยสามารถผ่านเข้าไปในbรูทีนย่อย
  • bใช้สำหรับส่วนล่างของเท้า สอง>s จะถูกลบออกในแต่ละครั้ง รูทีนย่อยจะผ่านเข้าไปในcรูทีนย่อย
  • cพิมพ์แถวปัจจุบันของถุงเท้าโดยแทนที่ตัวยึดตำแหน่งเพื่อให้>พิมพ์ได้อย่างถูกต้อง

บรรทัดที่สี่จัดการความกว้างของขาในขณะที่บรรทัดที่ห้าจัดการความยาวของมัน บรรทัดที่เจ็ดจัดการความยาวของเท้าในขณะที่บรรทัดที่แปดจัดการครึ่งบนของความสูงของเท้าโดยเพิ่มสอง>>บรรทัดในแต่ละบรรทัดหลังจากพิมพ์ ใช้งานได้กับขนาดถุงเท้าที่มีหลายรายการเป็น 4 และมีการปรับสำหรับขนาดถุงเท้าอื่น ๆ เพื่อไม่ให้เกิดเส้นซ้ำที่ยาวที่สุด


0

PHP, 229 ไบต์

เป็นวิธีที่ค่อนข้างขี้เกียจ

for($m=$n=$p=$argv[1];$i++<$q=$n*1.5;)echo($d=str_pad)("
",$n+1,v);for(;$p-->$n/2;)echo$s="
".$d($d("",$p,v),$m+=2,">");$r=[$s.=$d("",$q,">")];for($k=$n>>2;--$k;)$r[]=$s.=">>";echo join($r),$n&2?"$s>>":"",join(array_reverse($r));

พิมพ์บรรทัดใหม่นำ -nrทำงานด้วย

ชำรุด

// print first part + preparing some variables for later
for($m=$n=$p=$argv[1];$i++<$q=$n*1.5;)echo str_pad("\n",$n+1,v);

// print second part + prepare $s for third part
for(;$p-->$n/2;)echo$s="\n".str_pad(str_pad("",$p,v),$m+=2,">");

// third part: create an array of strings ...
$r=[$s.=str_pad("",$q,">")];
for($k=$n>>2;--$k;)$r[]=$s.=">>";
// ... then print it and its reverse
echo join($r),$n&2?"$s>>":"",join(array_reverse($r));

0

dc , 269 ไบต์

1k?d1.5*sadsdsb[[[v]nlb1-dsb0<f]dsfx[]pldsbla1-dsa0<c]dscxldd1-sisb2su[[[v]nlb1-dsbldli-<g]dsgx[[>]nlb1-dsblu+0<t]dstx[]plu2+suli1-dsilddsb2/!>m]dsmxld3*dsdsolidswst[[[v]nlw1-dsw0!>x]dsxx[2-]sa[2+]sy[[>]nlo1-dso0<g]dsgxldltli1+2/<yltli1+2/>adsdsolisw[]plt1-dst0!>f]dsfx

เอาล่ะทีนี้ ... มันใหญ่มาก มันไม่ใช่เรื่องง่ายฉันจะบอกคุณว่ามีอะไรบ้างกับการอ้างอิงการลงทะเบียนการเปรียบเทียบมาโครการขาดความสามารถในการจัดการสตริง ฯลฯ อย่างไรก็ตามฉันสนุกที่นำสิ่งนี้มารวมกันและนั่นคือสิ่งที่สำคัญจริงๆใช่มั้ย ? ;)

ลองออนไลน์!

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