Đan cho tôi một chiếc ASCII-Sock


15

Giới thiệu

Câu chuyện dài ngắn: vài ngày trước, tôi vô tình bắt đầu đan một chiếc tất và cấu trúc logic khá đơn giản của các mũi khâu đơn giản dẫn tôi đến ý tưởng: Tại sao chúng ta không chỉ đan ASCII?

Đầu vào

Đầu vào là một số nguyên N chẵn trong phạm vi [2,30].

Đầu ra

Đầu ra là một chiếc tất, rõ ràng.

Kết cấu

Bởi vì chúng tôi sẽ chỉ sử dụng các mũi khâu đơn giản, bạn sẽ chỉ sử dụng vcho một mũi khâu xuống và >cho một mũi khâu bên phải. Hãy để tôi giải thích cấu trúc đầy đủ với một ví dụ cho N=8:

vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvvv
vvvvvvv>>>
vvvvvv>>>>>>
vvvvv>>>>>>>>>
vvvv>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>>>
vvvv>>>>>>>>>>>>>>>>>>>>>>>>
  • Khối đầu tiên là phần trên. Nó có chiều rộng Nvà chiều caoN*1.5
  • Sau đó gót chân bắt đầu. Bạn trừ một vhàng trên mỗi hàng từ bên phải cho đến khi bạn có N/2chiều rộng. Sau đó, bạn thêm N/2các hàng có chiều rộng N/2bên dưới để hoàn thành các nút thắt xuống. Lưu ý rằng nó cung cấp tổng số N/2 + 1hàng với chiều rộngN/2

phần đầu tiên:

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
  • Bây giờ các phường bên bắt đầu. Bạn bắt đầu với hàng giảm đầu tiên, điền >cho đến khi bạn có chiều rộng Nvà thêm hai hàng nữa. Tiếp tục quá trình đó bao gồm hàng đầu tiên với N/2chiều rộng
  • Điền vào các hàng bên dưới mức đó và thêm N*1.5thời gian >vào đó
  • Để các phần bên ngoài như chúng là và thêm vào hàng bên dưới đầu tiên và trên lase hai lần nữa >'scho đến khi nó được hoàn thành

phần thứ hai:

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>>>>>>>>>>>>>>>>>>>>>>>>

Quy tắc

Trailing dòng mới là ok.

Bạn có thể chọn giữa chữ hoa hoặc chữ thường Vnhưng nó phải nhất quán.

Đây là vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm

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
Tôi hy vọng một dòng mới là được? (ngoài ra, làm thế nào mà một người vô tình bắt đầu đan một chiếc tất?)
Greg Martin

3
@GregMartin Thăm bà tôi và bà hỏi tôi. Thật khó để nói không với cô ấy vì vậy chúng tôi đi đây :) Hoàn thành cái đầu tiên hai ngày trước. Tôi nghĩ nó khá ổn nhưng tôi thực sự đánh giá thấp khối lượng công việc. Vì vậy, hãy hạnh phúc nếu ai đó làm tất cho bạn.
izlin

Tôi có thể sử dụng vhoặc Vthay thế cho nhau? Tôi sẽ giả sử vào lúc này vlà người duy nhất được phép, nhưng cho phép Vsẽ ảnh hưởng đến số byte
Tỷ lệ vàng

@GoldenRatio Tôi đã thay đổi các quy tắc, bây giờ cả hai đều được cho phép.
izlin

@GurupadMamadapur Như bạn có thể đọc trong 'Đầu vào', chỉ các số chẵn được phép làm đầu vào. Chương trình của bạn không cần xử lý số lẻ
izlin

Câu trả lời:


2

Pyth - 93 byte

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">

Giải trình:

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

Bạn có thể thử nó ở đây!


2

Toán học, 104 byte

""<>{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]}&

Hàm không tên lấy một số nguyên chẵn dương làm đầu vào và trả về một chuỗi (với một dòng mới theo sau). Lưu ý rằng dòng mới giữa hai dòng mã ở trên là một phần của mã. Công việc chính được thực hiện bởi hàm c, có định nghĩa vô căn cứ

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

tạo một bảng danh sách, mỗi danh sách gồm nhiều "v"s liên tiếp theo sau là vài ">"s theo sau là một dòng mới. May mắn thay, phạm vi #3cho bên ngoài Tablecó thể có một tên biến, có thể được đề cập trong các biểu thức #1#2; điều này cho phép hàm cđược gọi với cả đối số không đổi và biến. Phần còn lại chỉ là tính toán và toán tử nối chuỗi ""<>làm phẳng các danh sách lồng nhau phát sinh miễn phí.


2

Python, 3,5 183 177 byte

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]),

Giải thích đến.

Hãy thử trực tuyến!


Để bạn biết, TIO Nexus hoạt động tốt hơn TIO v2 vào lúc này vì v2 đang ở "giai đoạn đầu alpha"

Để lưu một byte, bạn có thể gán 'v' đầu một biến.
nedla2004

@JackBates Ghi chú hợp lệ.
Gurupad Mamadapur

@ nedla2004 Ý của bạn là theo cách này : n,v=int(input()),'v'? Sau đó, nó không tiết kiệm được gì.
Gurupad Mamadapur

1

Groovy, 168 byte

{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')}

Đây là một đóng cửa không tên. Cách tiếp cận hoàn toàn giống với câu trả lời Python 3.5 của tôi .

Hãy thử trực tuyến!


1

Hàng loạt, 279 byte

@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:]=^>%

Lưu ý: dòng thứ hai kết thúc trong một khoảng trắng. Batch có vấn đề với tiếng vang >s trong các biến nên tôi phải a) sử dụng thay thế b) gọi một chương trình con để lặp lại chuỗi đã sửa. Trong thực tế tôi có ba chương trình con:

  • ađược sử dụng cho gót chân. Một cái vđược loại bỏ mỗi lần và ba >s được thêm vào. Hai >s thêm được thêm vào để chương trình con có thể rơi vào bchương trình con.
  • bđược sử dụng cho dưới cùng của bàn chân. Hai >s được loại bỏ mỗi lần. Chương trình con sau đó rơi vào cchương trình con.
  • cin hàng hiện tại của sock, thay thế ký tự giữ chỗ để >s được in đúng.

Dòng thứ tư xử lý chiều rộng của chân trong khi dòng thứ năm xử lý chiều dài của nó. Dòng thứ bảy xử lý chiều dài của bàn chân trong khi dòng thứ tám xử lý nửa trên của chiều cao chân bằng cách thêm hai >>vào mỗi dòng sau khi in. Điều này hoạt động đối với kích thước sock là bội số của 4 và điều chỉnh được thực hiện cho các kích thước sock khác để dòng dài nhất không bị lặp lại.


0

PHP, 229 byte

một cách tiếp cận khá lười biếng

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));

in một dòng mới hàng đầu. Chạy với -nr.

phá vỡ

// 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 byte

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

Được rồi, tốt ... điều này là rất lớn . Thật không dễ dàng gì, tôi sẽ nói với bạn nhiều như vậy, với tất cả các tài liệu tham khảo, so sánh, macro, thiếu khả năng thao tác chuỗi, v.v. Tuy nhiên, tôi rất vui khi kết hợp nó với nhau, và đó thực sự là vấn đề ? ;)

Dùng thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.