ジャガイモの皮をむく


20

これはジャガイモです:

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

より一般的には、サイズNのジャガイモは次の形状として定義されます。

Nが偶数の場合、2個の中央@記号、4個の中央@記号、6 @個の中央@記号が、N個までの中央記号まで続きます。次に、N個の中央@記号に続いてN-2個の中央@記号が2まで続きます
。Nが奇数の場合、サイズNポテトは上記と同じ方法で生成されますが@、2個ではなく1個の記号で始まります。。

ジャガイモの皮をむくには、右上隅から開始@し、反時計回りに1ステップずつ標識を外します。たとえば、サイズ3のジャガイモの皮は次のようになります。

 @
@@@
@@@
 @

​
@@@
@@@
 @

 ​
 @@
@@@
 @

  ​
 @@
 @@
 @

 ​
 @@
 @@
 ​

 ​
 @@
 @
 ​

​
 @
 @
 ​

 ​
​
 @
 ​


チャレンジ

整数入力が与えられると、そのサイズのジャガイモの皮をむくすべてのステップを表示するプログラムを書きます。
末尾の空白/改行は許可されます。

得点

これはです。バイト単位の最短コードが優先されます。


サンプルテストケース

N = 2

@@
@@

@
@@


@@


 @



N = 7

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


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


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


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


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


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


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


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


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



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



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



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



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



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



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




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




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




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




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




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




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





   @@  
  @@@@ 
  @@@@ 
   @   





   @@  
  @@@@ 
  @@@  
   @   





   @@  
  @@@  
  @@@  
   @   





   @   
  @@@  
  @@@  
   @   






  @@@  
  @@@  
   @   






   @@  
  @@@  
   @   






   @@  
   @@  
   @   






   @@  
   @@  







   @@  
   @   







   @   
   @   








   @   
 ​
 ​
 ​
 ​  


カタログ

基づいて、この数は素数でありますか?


5
PPCGへようこそ!ところで、いい最初の質問。
clismique

1
末尾の空白/改行は許可されますか?
Loovjo

1
私にはRetinaスキルはありませんが、可能であれば、それを見ることに興味があります。
ジェリーエレミヤ

@JamesHoldernessありがとう!私はそれを修正しました。
-VarmirGadkin

回答:


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;最初のジャガイモを生成します:ジャガイモの中央の行から開始し、各反復で2行追加します:前の文字列の前に1つ、後。$"はスペースであり、$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で置き換えAます。:それは、二つの正規表現のおかげで行われています(ポテトの左側にあるを右または下に行くことができます)、そして時に(右側にある上がることを可能にするか、左)。最初の部分をa (初期化)に置き換えます。文字列には常にa があるため、印刷するときにスペースに置き換える必要があります。 s/(^| )A(.*\n? *)@/$1 $2A/mAA(.*\n? *)@s/@( *\n?.*)A/A$1 /A@( *\n?.*)As/@/A/@AAy/A/ /r


で見ると、アニメーション版はかなり見栄えがいいです:(端末で実行する場合、おおよそ同じコードですが、clearとがありますsleep

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、319 254バイト

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

このアルゴリズムの動機は、可能な限り分岐を回避しようとすることでした。なぜなら、実行の単一のパスは、一般的にゴルフにとって簡単だからです。したがって、コードは2つのループのみで構成されます。外側のループはピーリングプロセスのフレームを反復処理し、内側のループは各フレームのポテトをレンダリングします。

レンダリングループは基本的に文字のシーケンスを出力するだけです。各反復の文字は、剥離プロセスのフレーム番号と出力シーケンスのインデックスを取得し、 @スペース、または必要に応じて改行。

オンラインでお試しください!


1
うわー、これは美しいです。
416E64726577

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

説明

基本的な考え方:各行を下に繰り返して左端の文字を削除し、まだ行が残っている間に右端の文字を削除して各行を繰り返し@ます。

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

簡単な手順での全体的な悲しい試み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.