给我编织一个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
我希望尾随换行符可以吗?(另外,一个人是如何意外开始编织袜子的?)
格雷格·马丁

3
@GregMartin拜访了我的祖母,她问我。很难对她说不,所以我们开始吧:)两天前完成了第一个。我认为这很好,但我确实低估了工作量。因此,如果有人为您制作袜子,请感到高兴。
伊兹林

我可以使用vV互换?我现在暂时假设这v是唯一允许的一个,但是允许V将影响字节数
黄金比率

@GoldenRatio我更改了规则,现在都允许。
伊兹林

@GurupadMamadapur正如您在“输入”中所看到的那样,仅允许偶数输入。您的程序无需处理奇数
izlin

Answers:


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处于“早期alpha阶段”

要保存一个字节,您可以在变量“ v”的开头分配一个变量。
nedla2004

@JackBates Duly指出。
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:]=^>%

注意:第二行以空格结尾。批处理>在变量中回显s 有问题,因此我必须a)使用替代项b)调用子例程以回显校正后的字符串。实际上,我有三个子例程:

  • a用于脚跟。其中v每次取出三和>是增补。>添加了两个额外的s,以便子例程可以进入该b子例程。
  • b用于脚的底部。两个>各时间s被删除。然后,该子例程进入该c子例程。
  • c打印袜子的当前行,替换占位符,以便>s正确打印。

第四行处理腿的宽度,而第五行处理腿的长度。第七行处理脚的长度,而第八行处理脚的高度的上半部分,方法是>>在打印后在每行上增加两个。这适用于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

好吧,好吧...这是巨大的。这并不容易,我会告诉你很多有关所有寄存器引用,比较,宏,缺乏字符串操作能力的内容等。尽管如此,我还是很开心地将它们组合在一起,这才是真正重要的,对?;)

在线试用!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.