천천히 지그재그 수렴


23

단일 양의 홀수 정수를 입력으로 받으면 수렴 지그재그를 문자열 목록, 문자 목록 또는 줄 바꾸기로 구분 된 문자열로 다음 형식으로 반환하십시오.

#
 #
  #
   #
    #
   #
  #
 #
  #
   #
  #

#공백이 아닌 일관된 문자로 바꿀 수 있습니다 . 각 줄의 후행 공백이 허용되고 후행 줄 바꿈이 허용됩니다.

칼럼에서 시작을 지그 재그는 1그 칼럼에 도달 할 때까지 오른쪽으로 한 열 및 각 행에 대해 이동 n(여기서 n입력이다). 그런 다음 지그재그가 중간 열 ( ) 에서 끝날 때까지 두 경계가 수렴하면서 왼쪽에서 , 2오른쪽에서 n-1, 왼쪽 3에서으로 이동합니다 (n+1)/2.

테스트 사례

위의 예는에 대한 테스트 사례입니다 5.

다음은 개별 테스트 사례입니다.

3
#
 #
  #
 #

7
#
 #
  #
   #
    #
     #
      #
     #
    #
   #
  #
 #
  #
   #
    #
     #
    #
   #
  #
   #
    #
   #

1

#

공백이 허용됩니까?
Outgolfer Erik

@EriktheOutgolfer 나는 그것에 대해 아니오라고 말할 것입니다.
HyperNeutrino

답변:


15

C (gcc) , 89 바이트

f(n,a,b){puts("0");for(a=n;--a>n/2;)for(b=n-2*a;b<=2*a-n;)printf(" %*d\n",a-abs(b++),0);}

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

(n = 7의 경우)와 같이 일련의 공백 수를 분석하여 작동합니다.

          0
1 2 3 4 5 6 5 4 3 2 1
    2 3 4 5 4 3 2
        3 4 3

그리고 n = 3의 경우 :

  0
1 2 1

a코드에서 중간 숫자 가 [n-1, n / 2)에서 시작 함을 알 수 있습니다. 그런 다음 첫 번째 숫자와 중간 숫자의 차이점은 다음과 같습니다.

a  n  b  2a-n
-------------
6  7  5  5
5  7  3  3
4  7  1  1
2  3  1  1

따라서 만약 우리가 b[-(2a-n), 2a-n]을 겪으면 a-abs(b)원하는 순서를 알려줄 것입니다. 이것은 본질적으로 코드가하는 일입니다.




3

젤리 , 14 바이트

ṖṖṚ$ÐĿẎ0;⁶ẋp1Y

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

전체 프로그램.

사용합니다 1.

Jonathan Allan 에게 -1 감사합니다 . Jonathan Allan
에게 -1 감사합니다 .


’R-> 바이트입니다.
Jonathan Allan

@JonathanAllan Ooh 물론 감사합니다. 나는 이전 버전에서 그것을 피하려고 시도하고 잊어 버렸습니다 ...
Outgolfer Erik

”X-> 1다른 사람을 위해.
Jonathan Allan

@JonathanAllan Heh 또 다른 간과 ... 정수도 피하려고했습니다.
Outgolfer 에릭

3

하스켈 , 72 바이트

g[]=[]
g a=a++g(reverse$init a)
r="#":map(' ':)r
("#":).g.tail.(`take`r)

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

왼쪽 상단부터 시작하여 s r의 대각선 인 무한 목록을 정의합니다 #.

그런 다음 g작업의 무자비한 기능을 정의합니다 . g목록을 가져 와서 반복적으로 뒤집어 목록이 비어있을 때까지 첫 번째 요소를 제거한 다음 각 작업의 결과를 연결합니다.

여기서 우리의 주요 기능은 포인트 프리 기능입니다. 이 함수는 n무한 목록에서 요소를 가져 와서 시작 r하여 첫 번째 요소를 잘라 적용 g합니다. 마지막으로 우리는 #처음에 등 을 추가해야합니다. 왜냐하면 질문의 사양이 약간 이상하기 때문입니다. 첫 번째 대각선이 왜 항상 더 긴지 잘 모르겠습니다. 그래서 우리는해야합니다. aa 추가하십시오 #.


@nimi 나는 결국 ("#":).g.init.(가져 가지만 r)감사합니다!
밀 마법사



2

05AB1E , 6 바이트

LN71SΛ

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

     Λ     use the canvas function with

L          a range list [1 .. input] as lengths for each path 

 N         a "0" as character to be printed 
           (N is the index variable used by loops. If there was no loop yet, its
           default value is 0. By using N, I avoid an extra space between 0 and 71)

  71S      and the directions 7 and 1 (NW and NE), that alternate automatically until
           the range list is finished.

아니요, 먼저 시도했지만 범위 목록의 다음 요소를 계속하기 전에를 제거하면 양방향을 그립니다 S. 따라서 출력은 두 배 길어집니다. 나는 +와 ×에 대해 아직 몰랐습니다. 숫자와 결합 할 때 정말 흥미로운 패턴을 만듭니다.
도리안

아, 그렇습니다. 내 잘못이야. 나는 그것이없이 작동하는 것을 보았지만 S출력에 충분히주의를 기울이지 않았습니다 ..>.> 그리고 +and ×는 기본적으로 and 에 내장 [0,4,4,0,2,6,6,2]되어 [1,5,5,1,3,7,7,3]있습니다. 그리고 8당신이 시작한 원점으로 재설정됩니다. 여기 좀 더 자세한 정보가 있습니다.
Kevin Cruijssen



1

자바 스크립트, 127 바이트

목표 ( g)를 계산합니다 . 이 목표에 도달하면 다음 목표로 돌아갑니다. 또한 모든 고르지 않은 숫자를 Math.round()추가 하여 사용을 피하기 위해 트릭을 사용합니다 0.5.

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f(5);


1

하스켈, 74 바이트

f[x]=[x]
f s=s++tail(f$reverse$tail s)
g n=f[(' '<$[2..x])++"#"|x<-[1..n]]

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

작동 방식 :

    [(' '<$[2..x])++"#"|x<-[1..n]]     -- build the first diagonal, e.g. for n=3:
                                         -- ["#", " #", "  #"]
  f                                      -- call f, which is

f s = s ++                               -- the input list, followed by
           tail                          -- all but the first element of
                f                        -- a recursive call with
                  reverse                -- the reverse of
                          tail s         -- all but the first element of the input 
                                         -- list
f[x]=[x]                                 -- base case: stop if the input list a
                                         -- singleton list

각 재귀 호출 f은 다음 대각선 을 추가합니다.



1

껍질 , 19 바이트

mo`:'#R' ∫`Ṙ¢e1_1tṫ

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

설명

약간 시끄럽다.

mo`:'#R' ∫`Ṙ¢e1_1tṫ  Input is n (e.g. 5)
                  ṫ  Range from input to 1: [5,4,3,2,1]
                 t   Drop first element: [4,3,2,1]
             e1_1    The list [1,-1]
            ¢        repeated infinitely: [1,-1,1,-1,..
          `Ṙ         Clone with respect to the list above: [1,1,1,1,-1,-1,-1,1,1,-1]
         ∫           Cumulative sum: [0,1,2,3,4,3,2,1,2,3,2]
mo                   For each element k (e.g. 3) do this:
      R'             Repeat space k times: "   "
  `:'#               Append '#': "   #"
                     Print implicitly separated by linefeeds.


1

망막 , 71 바이트

.+
$* 
^
:>
 $
:
;{*T`:<>`_#
( ) >(:)|( )<
$1<$2$3
(:)( )<|>( )
$2$1$3>

온라인으로 사용해보십시오! 설명 : 처음 세 단계는 입력을 s :> :사이의 문자 수가 입력 번호 인 형식으로 변환합니다 :. 마지막 두 단계 는 s 사이에 >(또는 <왼쪽으로 이동할 때) 바운스합니다 :. 네 번째 단계는 바운스를 반복하여 매번 문자열의 필요한 부분을 인쇄합니다. 는 ;루프 후 인쇄되는 문자열을 멈춘다.


1

05AB1E , 16 바이트

Î<L¤F¦})˜Ôð×X«»

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

설명

Î<L               # push 0 and range [1 ... input-1]
   ¤              # get the last element of the list
    F             # that many times do
     Â            # bifurcate
      ¦           # remove the head
       })˜        # end loop and wrap in flattened list
          Ô       # remove consecutive duplicates
           ð×     # repeat space a number of times corresponding to each number in the list
             X«   # append 1 to each
               »  # join on newline

1

K (코나), 27 바이트

`0:{|x$"#"}'1,,/{1_|x}\-2-!

비어있을 때까지 벡터의 머리를 반복적으로 뒤집어 놓아 기본 숫자 시퀀스를 만듭니다.


3
PPCG.SE에 오신 것을 환영합니다! 아시다시피, TIO (온라인 시도)라는 온라인 통역사에 코드를 넣고 링크하여 사람들이 코드를 시험해 볼 수 있습니다. tio.run/#k-kona 또한 여기에 제출할 수있는 형식화 된 PPCG 게시물을 제공합니다.
Notts90

0

PHP, 65 바이트

<?while(--$n||$n=$d=--$argn)echo str_pad("X
",2+$x-=$d&1?:-1);?>X

파이프로 실행 -nF하거나 온라인으로 테스트하십시오 .

설명:

첫번째 반복 : $n되어 NULL있으므로 --$n효과 및 평가가 없다 NULL
-> 집합 $n$d위해 미리 감소 인수
1 증가 $x에도 마찬가지로 $d홀수 들면, 감소량$d
2 인쇄 X, 개행 및 $x공백

추가 반복 : 감소 $n; 때리면 0리셋$n$d 도달하면 사전 감소 된 인수로 (및 )

피날레 : 하나 더 인쇄하십시오 X.



0

파이썬 2 159 145 141 136 바이트

print"".join([" "*p+"#\n"for p in(lambda l:[sum(l[:i])for i in range(len(l))])(sum([i*[1-i%2*2]for i in range(input())[::-1]],[])+[1])])

이 문제에 대해 이미 훌륭한 Python 버전이 있었지만 여전히 끔찍한 원 라이너를 게시한다고 생각했습니다. (하지만 세미콜론없이!)

편집 : 이중 목록 이해 대신 합계를 사용하여 14 바이트 다운

편집 : 방금 python 2에서 raw_input 대신 input을 사용할 수 있습니다. 나는 항상 후자를 사용했습니다.


0

매스 매 티카, 142 바이트 (독립)

이 솔루션에는 맛이 있습니다.

UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&

이것은 기본적으로 우리가 어느 세그먼트에 있는지 (삼각수 함수를 반전시켜) 계산 한 다음 -1의 거듭 제곱을 추가하여 왼쪽 또는 오른쪽으로 이동합니다.

Wolfram Code Sandbox 에서 코드를 붙여넣고 UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixFormShift + Enter 또는 Numpad Enter를 누르거나 Gear-> "Evaluate Cell"을 클릭하여 테스트 할 수 있습니다 .


이것은 Erik의 Python 2 솔루션의 원래 잘못된 포트와 길이가 같습니다 (이 포트는 입력에 대한 출력을 한 단계 높입니다).

(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.