土豆去皮


20

这是土豆:

  @@
 @@@@
@@@@@@
@@@@@@
 @@@@
  @@

更一般而言,将大小为N的马铃薯定义为以下形状:

如果N是偶数,则它是2个居中@符号,然后是4个居中@符号,然后是6个居中@符号,一直到N个居中@符号;然后,N为中心的@符号,后面是N-2为中心@的符号中,所有的方式下降到2。
如果N是奇数,在如上述描述的相同的方式产生一个大小为N马铃薯,但我们开始用1个@符号,而不是2 。

从右上角开始将土豆去皮@,然后按逆时针方向移动每个步骤一个标志。例如,去皮3号土豆看起来像这样:

 @
@@@
@@@
 @

​
@@@
@@@
 @

 ​
 @@
@@@
 @

  ​
 @@
 @@
 @

 ​
 @@
 @@
 ​

 ​
 @@
 @
 ​

​
 @
 @
 ​

 ​
​
 @
 ​


挑战

编写一个程序,给定一个整数输入,该程序将显示削皮该尺寸土豆的所有步骤。
允许尾随空白/换行符。

计分

这是;以字节为单位的最短代码为准。


样本测试用例

N = 2

@@
@@

@
@@


@@


 @



N = 7

   @   
  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  



   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @   



   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@  
   @   



   @@  
  @@@@ 
 @@@@@@
 @@@@@ 
  @@@  
   @   



   @@  
  @@@@ 
 @@@@@ 
 @@@@@ 
  @@@  
   @   



   @@  
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   



   @   
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
  @@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
  @@@@ 
  @@@@ 
  @@@  
   @   




   @@  
  @@@@ 
  @@@@ 
   @@  
   @   




   @@  
  @@@@ 
  @@@@ 
   @@  





   @@  
  @@@@ 
  @@@@ 
   @   





   @@  
  @@@@ 
  @@@  
   @   





   @@  
  @@@  
  @@@  
   @   





   @   
  @@@  
  @@@  
   @   






  @@@  
  @@@  
   @   






   @@  
  @@@  
   @   






   @@  
   @@  
   @   






   @@  
   @@  







   @@  
   @   







   @   
   @   








   @   
 ​
 ​
 ​
 ​  


目录

基于这个数字是素数吗?


5
欢迎来到PPCG!顺便说一句好第一个问题。
clismique

1
是否允许尾随空格/换行符?
Loovjo '16

1
我没有Retina技能,但是如果有可能,我会感兴趣的。
杰里·耶利米

@JamesHolderness谢谢!我已经解决了。
VarmirGadkin '16

Answers:


5

Perl,129个字节

128个字节的代码+ -n标志。

$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/

您需要-nE标志来运行它:

perl -nE '$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/' <<< 7

说明:(稍后,我将详细介绍它们)
第一部分,$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;生成初始马铃薯:它从马铃薯的中线开始,并在每次迭代时添加两行:前一行之前的一行,另一行之前的一行后。请注意,这$"是一个空格,并且由于$n未初始化,因此它从0开始,并且$/是换行符。

关于say$_=$p;在存储初始马铃薯时打印初始马铃薯的说明要多说$_这以后会更容易操作。

最后,say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/去皮土豆。@删除a 的最后位置包含a A(它是任意的,它可以是任何符号)。因此,每次迭代都包括查找A,将其替换为空格,同时将下@一个替换为A。这要归功于两个正则表达式:s/(^| )A(.*\n? *)@/$1 $2A/mA马铃薯位于左侧时(A(.*\n? *)@允许向右或向下移动),而s/@( *\n?.*)A/A$1 /当马铃薯位于右侧时A@( *\n?.*)A允许向上或向左移动)。s/@/A/将第@一个替换为A(即初始化)。由于A字符串中总是有一个,因此在打印时需要用空格替换它y/A/ /r


仅就眼睛而言,动画版本看起来相当不错:(要在终端中运行,它的代码大致相同,但带有clearsleep

perl -nE 'system(clear);$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;select($,,$,,$,,0.1),system(clear),say y/A/ /r while(s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/)&&/@/' <<< 10

1
这很棒!我从没有看过这么有趣的动画节目的乐趣:)
VarmirGadkin

3

Befunge,319254字节

&:00p1+:40p2/10p>:40g%20p:40g/30p\:10g30g`:!00g:2%!-30g-*\30g*+:20g1+v
+10g-::40g\-*2*30g+\-1+00g2%!+\00g2/1++20g-:::40g\-*2*+30g-\4*00g2*-v>
v+1\,-**2+92!-g02g00**84+1`\+*`g02g01\*!`g02g01+**!-g02\`g03:/2g00-4<
>:40g00g:2%+*`!#v_$1+:55+,00g::*1-2/+`#@_0

该算法的动机是尝试尽可能避免分支,因为单个执行路径通常更容易打高尔夫。因此,该代码仅由两个循环组成:外部循环在去皮过程的各个框架上迭代,而内部循环为每个框架渲染马铃薯。

渲染循环本质上只是输出一个字符序列,每次迭代的字符由一个相当复杂的公式确定,该公式采用剥离过程的帧数和输出序列的索引并返回一个 @,空格或根据需要换行。

在线尝试!


1
哇真漂亮
416E64726577 '16

2

Python 3.5.1,520个字节

n=int(input())L=lenR=rangeP=printdefg(a,b):f=list(a)ifb:foriinR(L(f)):iff[i]=="@":f[i]=""breakelse:foriinR(L(f)-1,-1,-1):iff[i]=="@":f[i]=""breakreturn"".join(f)l=[]s=(2-n%2n)*(((n-2n%2)/2)1)i=2-n%2whilei<=n:l.append("@"*i)i=2j=L(l)-1whilej>=0:l.append(l[j])j-=1y=[rforrinR(int((L(l)/2)-1),-1,-1)]forhinR(L(y)-1,-1,-1):y.append(y[h])defH(q):foreinR(L(l)):P((""*y[e])q[e])P("")H(l)k=0m=0whilek<s:fortinR(L(l)):if'@'inl[t]andm%2==0:l[t]=g(l[t],True)k=1H(l)if'@'inl[t]andm%2==1:l[t]=g(l[t],False)k=1p=l[:]p.reverse()H(p)m=1

说明

基本思想:在向下迭代每一行并删除最左边的字符,然后在向上迭代每一行以删除最右边的字符(在仍有@s的情况下)之间交替进行。

n=int(input())
L=len
R=range
P=print
# g() returns a line in the potato with leftmost or rightmoxt '@' removed
def g(a,b):
    f=list(a)
    if b:
        for i in R(L(f)):
            if f[i]=="@":
                f[i]=" "
                break
    else:
        for i in R(L(f)-1,-1,-1):
            if f[i]=="@":
                f[i]=" "
                break
    return "".join(f)

l=[]
# s is the total number of '@'s for size n
s=(2-n%2+n)*(((n-2+n%2)/2)+1)
i=2-n%2

# store each line of potato in l
while i<=n:
    l.append("@"*i)
    i+=2
j=L(l)-1
while j>=0:
    l.append(l[j])
    j-=1

# this is used for spacing
y=[r for r in R(int((L(l)/2)-1),-1,-1)]
for h in R(L(y)-1,-1,-1):
    y.append(y[h])

# print the potato
def H(q):
    for e in R(L(l)):
        P((" "*y[e])+q[e])
    P("\n")

H(l)
k=0
m=0

# while there are still '@'s either
# go down the potato removing leftmost '@' 
# go up the potato removing rightmost '@'
while k<s:
    for t in R(L(l)):
        if '@' in l[t] and m%2==0:
            l[t]=g(l[t],True)
            k+=1
            H(l)               
        if '@' in l[t] and m%2==1:
            l[t]=g(l[t],False)
            k+=1
            p=l[:]
            p.reverse()
            H(p)
    m+=1

总的来说,这是一个简单的尝试的可悲尝试。

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.