감자 껍질 벗기기


20

이것은 감자입니다.

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

보다 일반적으로, 크기 N 감자는 다음 모양으로 정의됩니다.

N이 짝수이면 2 개의 중심 @심벌, 4 개의 중심 @심벌, 6 개의 중심 @심벌, N 개의 중심 @심벌 까지 이어집니다 . 그런 다음 N 중심 @기호 다음에 N-2 중심 @기호가 이어집니다 .
N이 홀수이면 위에서 설명한 것과 같은 방식으로 N 감자 크기가 생성되지만 @2가 아닌 1 기호로 시작합니다. .

오른쪽 상단에서 시작하여 @각 단계마다 한 개의 부호를 제거 하여 반 시계 방향으로 감자를 껍질을 벗 깁니다 . 예를 들어, 크기 3 감자를 껍질을 벗기면 다음과 같습니다.

 @
@@@
@@@
 @

​
@@@
@@@
 @

 ​
 @@
@@@
 @

  ​
 @@
 @@
 @

 ​
 @@
 @@
 ​

 ​
 @@
 @
 ​

​
 @
 @
 ​

 ​
​
 @
 ​


도전

정수 입력이 주어지면 그 크기의 감자 껍질을 벗기는 모든 단계를 표시하는 프로그램을 작성하십시오.
후행 공백 / 줄 바꾸기가 허용됩니다.

채점

이것은 . 바이트 단위의 가장 짧은 코드가 이깁니다.


샘플 테스트 사례

N = 2

@@
@@

@
@@


@@


 @



N = 7

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


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


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


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


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


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


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


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


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



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



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



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



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



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



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




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




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




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




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




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




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





   @@  
  @@@@ 
  @@@@ 
   @   





   @@  
  @@@@ 
  @@@  
   @   





   @@  
  @@@  
  @@@  
   @   





   @   
  @@@  
  @@@  
   @   






  @@@  
  @@@  
   @   






   @@  
  @@@  
   @   






   @@  
   @@  
   @   






   @@  
   @@  







   @@  
   @   







   @   
   @   








   @   
 ​
 ​
 ​
 ​  


목록

를 기반으로 이 숫자는 소수?


5
PPCG에 오신 것을 환영합니다! 그런데 좋은 첫 질문입니다.
clismique

1
후행 공백 / 줄 바꾸기가 허용됩니까?
Loovjo

1
레티 나 기술은 없지만 가능하다면이를보고 싶습니다.
Jerry Jeremiah

@JamesHolderness 감사합니다! 나는 그것을 고쳤다.
VarmirGadkin

답변:


5

펄, 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. : 그 두 정규식에 완료 감사의 s/(^| )A(.*\n? *)@/$1 $2A/m(가) 때 A감자의 왼쪽에 ( 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

비 펀지, 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

이 알고리즘의 동기는 일반적으로 단일 실행 경로가 골프를 치기 쉽기 때문에 가능한 한 분기를 피하고 피하는 것이 었습니다. 따라서 코드는 단지 두 개의 루프로 구성됩니다. 외부 루프는 필링 공정의 프레임을 반복하고 내부 루프는 각 프레임의 감자를 렌더링합니다.

렌더링 루프는 본질적으로 일련의 문자를 출력합니다. 각 반복에 대한 문자는 필링 프로세스의 프레임 번호와 출력 순서의 색인을 가져와 @, 공백 또는 a를 반환하는 다소 복잡한 수식으로 결정됩니다 . 필요에 따라 줄 바꿈.

온라인으로 사용해보십시오!


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.