절대 증폭 지그재그


24

양의 정수 N을 받아 필요한 증폭 라인 만 사용하여이 증폭 지그재그 패턴의 첫 번째 N 번호를 출력하는 프로그램 또는 함수를 작성하십시오.

                                         26
                                       25  27                                      .
         10                          24      28                                  .
        9  11                      23          29                              .
 2     8     12                  22              30                          44
1 3   7        13              21                  31                      43
   4 6           14          20                      32                  42
    5              15      19                          33              41
                     16  18                              34          40
                       17                                  35      39
                                                             36  38
                                                               37

따라서 N이 1출력이면

1

N이 2인 경우 출력은

 2
1

N이 3출력이면

 2
1 3

N이 4출력이면

 2
1 3
   4

N이 10출력이면

         10
        9
 2     8
1 3   7
   4 6
    5

N이 19출력이면

         10
        9  11
 2     8     12
1 3   7        13
   4 6           14
    5              15      19
                     16  18
                       17

등등.

노트

  • 지그재그의 각 피크 또는 최저점은 1이전 피크 또는 최저점보다 라인이있는 라인에서 한 라인 더 떨어진 지점에 도달합니다 .

  • N은로 제한되지 않는다 44. 지그재그는 같은 패턴으로 자라며 더 큰 N이 지원되어야합니다.

  • 여러 자릿수가있는 숫자는 그림과 같이 모서리에서 "터치"해야합니다. N이 100이상일 때 이것이 작동하는지 확인하십시오 .

  • 선택적인 후행 줄 바꿈 하나를 제외하고 출력에 빈 (또는 공백 만) 줄이 없어야합니다.

  • 모든 행에는 임의의 양의 후행 공백이있을 수 있습니다.

채점

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker가 이전 답변입니다.


가능한 최대 N은 얼마입니까?
Julie Pelletier

@JuliePelletier 이론적으로는 없지만 2 ^ 16보다 작을 것이라고 가정 할 수 있습니다.
Calvin 's Hobbies

제어 문자 사용이 허용됩니까? 또는 숫자 공백과 줄 바꿈으로 제한됩니까?
Dennis

2
@Dennis 아니오라고합시다. 숫자 / 공백 / 줄 바꾸기 만하면됩니다.
Calvin 's Hobbies

1
누군가는 농담으로 그 형식으로 OEIS에 제출해야합니다.
DanTheMan

답변:


10

젤리 , 41 37 29 바이트

RDµḌ’½Ċ-*_\x©L€Ṣ.ị®ạ€⁶ẋj"FZj⁷

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

작동 원리

RDµḌ’½Ċ-*_\x©L€Ṣ.ị®ạ€⁶ẋj"FZj⁷  Main link. Argument: n (integer)

R                              Range; yield [1, ..., n].
 D                             Decimal; yield A =: [[1], ..., [1, 0], ...].
  µ                            Begin a new, monadic chain. Argument: A
   Ḍ                           Undecimal; convert back to falt range.
    ’                          Decrement to yield [0, ..., n-1].
     ½Ċ                        Take the square root and round up (ceil).
       -*                      Elevate -1 to each rounded square root.
         _\                    Cumulatively reduce by subtraction.
                               This yields [1, 2, 1, 0, -1, 0, ...], i.e., the
                               vertical positions of the digits in A.
             L€                Compute the length of each list in A.
           x                   Repeat the nth position l times, where l is the
                               nth length.
            ©                  Copy the result to the register.
               Ṣ               Sort.
                .ị             At-index 0.5; yield the last and first element,
                               which correspond to the highest and lowest position.
                  ạ€®          Take the absolute difference of each position in the
                               register and the extrema.
                               This yields the number of spaces above and below
                               the integers in r as a list of pairs.
                     ⁶ẋ        Replace each difference with that many spaces.
                         F     Flatten the list A.
                       j"      Join the nth pair of strings of spacing, separating
                               by the nth digit in flat A.
                          Z    Zip/transpose the result.
                           j⁷  Join, separating by linefeeds.

2
당신이 사용하는 동안 몇 문자로 그것을 할 수있는 언어 (젤리)로 기능을 만들어보십시오.
Julie Pelletier

19
@JuliePelletier 좋은 골프 언어를 작성하는 기술은 가능한 한 많은 다른 작업에 대한 짧은 솔루션을 작성할 수있게 해주는 일련의 지침 (및 구문 / 언어 의미론)을 제시하는 것입니다. 그리고 단일 바이트에서 도전을 시도했다. 좋은 골프 언어는 실제로 계산하는 특정 기능 외에는 아무 것도 쓸모없는 내장 모음이 아니라 실제로 매우 강력하고 표현적인 경향이 있습니다.
Martin Ender

@JuliePelletier 그리고 그것은 또한 PPCG SE의 규칙에 위배됩니다
Bálint

8

PHP, 211 177 164 163 바이트

출력 커서를 $n사용하여 피크를 예측하고 어느 방향 으로든 배열을 동적으로 증가 ($x, $y)시킵니다.

숫자가 정렬되고 str_pad()최종 출력은 해당 implode()문자열 배열 ( $g)입니다.

for($x=0,$d=-1,$h=$n=2,$y=$a=1;$a<=$argv[1];$y+=$d){$g[$y]=str_pad($g[$y],$x).$a;$x+=strlen($a);if($a++==$n){$h+=2;$n+=$h-1;$d*=-1;}}ksort($g);echo implode(~õ,$g);

온라인으로 테스트하십시오!

업데이트 : 불필요한 array_pad ()를 제거하여 34 바이트를 제거했습니다. Update2 : @insertusername 여기에서 조금 더 단축하라는 조언이 이어졌습니다. Update3 : LAINT-1 문자 세트를 사용하도록 ~ õ로 바이트를 하나 더 절약하는 @Lynn의 조언에 따라. (온라인 PHP 에뮬레이터에서는 사용할 수 없으므로 포함되지 않음)


이 코드에 대한 질문입니다. 특정 요소에 액세스하기 전에 $ g 배열을 초기화하지 않아도됩니까? 길이를 줄이거 나 행을 삽입하는 것을 의미합니까? 나는 PHP에 익숙하지 않아서 이상하게 보인다 ... 고마워.
Yotam Salmon

아니요. 정의한 후에 $arr = [];는을 참조 할 수 있습니다 $arr[anything]. 어떤 경우에는 통지를 출력하지만 여기서는 무시됩니다. 이와 같은 내용을 읽는 것이 언어를 배우는 데 큰 도움이되지는 않을 것입니다. 귀하의 의견은 처음에 배열을 채울 필요가 있다고 생각했지만 더 짧게 만들 수 있다는 것을 알았습니다. :)
Julie Pelletier 2016 년

Haha 기꺼이;) 단지 PHP에서 배열과 사전이 같은 방식으로 초기화되고 구문을 볼 때 완전히 동일하다는 것을 깨달았습니다 (Why, PHP ?!)
Yotam Salmon

약간의 개선 – 164 바이트 : for($x=0,$d=-1,$h=$n=2,$y=$a=1;$a<=$argv[1];$y+=$d){$g[$y]=str_pad($g[$y],$x).$a;$x+=strlen($a);if($a++==$n){$h+=2;$n+=$h-1;$d*=-1;}}ksort($g);echo implode("⏎",$g);(⏎를 실제 줄 바꿈으로 대체)
insertusernamehere

나는 당신이 당신의 인코딩 바로 설정 한 경우 (라틴-1이 아닌 UTF-8), 믿고 2 바이트 대안 으로 "⏎".
Lynn

8

Pyth, 60 53 52 46 42 39 38 36 34 32 31 바이트

39 : 이제 버그 수정 버전 인 Jelly 와 동등하며 Dennis의 경쟁 버전을 능가했습니다!

38 : 데니스를 아웃 골프했습니다!

36 : 데니스를 다시 골라 냈습니다!

34 : 버그 수정 버전보다 훨씬 낮습니다!

31:32-> 31 Dennis에게 감사합니다.

J1K.u+N=J_WsI@Y2JtQZjsM.t.e ++ *] * dl`hkabhSK`hk *] * dl`hkabeSKKd 
J1K.u+N=J_WsI@Y2JtQZjsM.t.eX *] * dl`hkhaeSKhSKabhSKhkKd 
J1K.u + N=J_WsI@Y2JtQZ=-RhSKKjsM.t.eX *] * dl`hkheSKbhkKd 
J1K.u+N=J_WsI@Y2JtQQj-#dsMC.eX *] * dl`hkheSKbhkK 
J1j- # dsMC.eX *] * dl`hkyh + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jh 
J1j -# dsMCmX *] *; l`hdyQ + Q = + Z = @ _ BJsI @ td2h 
j- # dsMCmX *] *; l`hdyQ + Q = + Zsty % s @ td2 2h 
j- # dsMCmX *] *; l `hdyQ + Q = + Z @ _B1.E @ d2h 
JQj- # dsMCmX *] *; l`hdyQ = + J @ _B1.E @ d2h 
JyQj- # dsMCmX *] *; l`hdJ = + Q @ _B1. E @ d2h 
j- # dsMCmX *] *; l`hdyQ = + Q @ _B1.E @ d2h
j- # dsMCmX *] *; l`hdyQ=+Q^_1.E@d2h

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

작동 원리

j-#dsMCmX*]*;l`hdyQ=+Q^_1.E@d2h      input: Q
j-#dsMCmX*]*;l`hdyQ=+Q^_1.E@d2hdQ    implicit filling arguments

       m                        Q    for each number d from 0 to Q-1:
                           @d2           yield the square root of d.
                         .E              yield its ceiling.
                      ^_1                raise -1 to that power. this
                                         yields the desired direction.
                   =+Q                   increment Q by this amount.

               hd                        yield d+1.
              `                          yield its string representation.
             l                           yield its length.
           *;                            repeat " " for that number of times
          ]                              yield a list containing the string above.
         *       yQ                      repeat the list for Q*2 times.
                                         the Q has changed, but Q*2 is
                                         an overshoot that is high
                                         enough, so we don't have to
                                         worry about it.

        X                                in that list, replace the
                                         element with index being the
                                         number generated above
                              hd         with d+1.

      C                              transpose the resulting array.
    sM                               flatten each element.
 -#d                                 remove lines containing only spaces.
                                     (filter on truthiness of set difference with space)
j                                    join by newlines.

2
" 39 : 젤리와 동등하다 "; " 38 : Dennis를 아웃 골프했습니다! "몇 시간 동안 해봤지만 @Dennis 는 코드 골프에서
뛰는

1
@KevinCruijssen 님.
Leaky Nun

좋은! xD M̶a̶y̶b̶e̶ 저는 상상력이 풍부하지만, 이제는 더 짧은 솔루션을 찾을 때까지 몇 시간 동안 답답하게 보았고 이제는 @Dennis가 부담없이 깨어나 코드를 다시 단축 할 것입니다. (Jk, Dennis 아래에 머물기를 바랍니다!)
Kevin Cruijssen

@KinvinCruijssen 타다! 이제 버그 수정 버전보다 낮습니다.
Leaky Nun

5

MATLAB, 148 바이트

n=input('');k=fix(n^.5);m=0;w=1;d=-1;for l=1:n;s=num2str(l);m(k+1,w:w+nnz(s)-1)=s;w=w+nnz(s);k=k+d;d=d*(-1)^(l^.5==fix(l^.5));end;[m(any(m,2),:),'']

MATLAB은 공백으로 색인 된 문자를 인쇄 0하지만 옥타브는 해당 문자를 생략하므로 옥타브 에서 공백이 누락되었습니다 .

설명:

n=input('');
k=fix(n^.5);                    %caculate starting height
m=0;w=1;d=-1;                   %initialize counters and output matrix
for l=1:n;
    s=num2str(l);
    m(k+1,w:w+nnz(s)-1)=s;      %insert current index as a string
    w=w+nnz(s);                 %current horizontal position
    k=k+d;                      %current vertical position
    d=d*(-1)^(l^.5==fix(l^.5)); %if we reached a square number, change direction
end
[m(any(m,2),:),'']              %delete all zero rows

3

하스켈, 144142 바이트

g n|k<-take n$scanl(+)0$[1..]>>= \x->(-1)^x<$[2..2*x]=unlines[[1..n]>>= \x->show x#(k!!(x-1)==y)|y<-[minimum k..maximum k]]
s#g|g=s|1<2=' '<$s

사용 예 :

*Main> putStr $ g 19
         10                  
        9  11                
 2     8     12              
1 3   7        13            
   4 6           14          
    5              15      19
                     16  18  
                       17    

작동 방식 :

s#g|g=s|1<2=' '<$s              -- # is a helper function that expects a string s
                                -- and a boolean g. It returns s if g is True, else
                                -- as many spaces as there a characters in s 

k<-take n$                      -- bind k to the first n elements of
 [1..]>>= \x->(-1)^x<$[2..2*x]  -- 2*x-1 copies of (-1)^x for each x in [1,2,3,...]
                                -- i.e. [-1, 1,1,1, -1,-1,-1,-1,-1, 1,1,1,1,1,1,1..]
 scanl(+)0                      -- build partial sums, starting with 0
                                -- i.e. [0,-1,0,1,2,1,0,-1,-2,-3,-2,-1...]
                                -- -> k is the list of y coordinates for the
                                --    numbers 1,2,3,...

 [  |y<-[minimum k..maximum k]] -- for all y coordinates in k 
      \x->show x#(k!!(x-1)==y)  -- map the # function
  [1..n]>>=                     -- over [1..n] (the x coordinates)
                                -- where # is called with
                                --  s -> a string representation of x 
                                --  g -> True if k at index x equals the current y
unlines                         -- join with newlines

편집 : 2 바이트에 대한 @Lynn 감사합니다!


2

자바 스크립트 (ES6), 213 바이트

with(Math)n=>(a=[...Array(n)].map((_,i)=>n-=1+sqrt(--i)&1||-1).map((e,_,a)=>e-min(...a))).map((e,i)=>r[e][i]=++i,r=[...Array(1+max(...a))].map(_=>a.map((_,i)=>` `.repeat(1+log10(++i)))))&&r.map(a=>a.join``).join`\n`

어디 \n리터럴 개행 문자를 나타냅니다. 설명:

with(Math)                          Bring functions into scope
 n=>                                Accepts one parameter
  (a=                               Intermediate result variable
   [...Array(n)].map(               For each number 0..n-1
    (_,i)=>n-=                      Accumulate index for each number
     1+sqrt(--i)&1||-1              Calculate the direction
    ).map((e,_,a)=>e-min(...a))     Scale the smallest index to zero
  ).map((e,i)=>r[e][i]=++i,         Overwrite the padding with 1..n
   r=[...Array(1+max(...a))].map(   Calculate number of lines
    _=>a.map((_,i)=>                For each number 1..n
     ` `.repeat(1+log10(++i)))))    Calculate the padding needed
  &&r.map(a=>a.join``).join`\n`     Join everything together

짧게하기 위해 pow(-1,ceil(sqrt(i)))다시 작성 sqrt(i-1)&1||-1하지만 이것이 i=01을 추가하도록 수정하는 데는 효과가 없으므로 결과의 부호를 뒤집습니다 n-=.


헤이 당신은 금 배지를 받았습니다! 좋은 작업! 성스러운 연기는 당신이 저만큼 많은 대표를 가지고 있습니다. 계속해!
코너 O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ 그것은 "단순히"광신자 배지입니다. 분명히 나는 ​​금 코드 골프 태그 배지를 얻는 것에 정말로 가깝습니다!
Neil

이중 거룩한 연기. XD를 움직여야합니다
Conor O'Brien

1

파이썬 2, 137 바이트

l={}
i=x=y=n=v=0
exec"v+=1;l[y]=l.get(y,'').ljust(x)+`v`;x+=len(`v`);i=-~i%-~n;y+=n%4-1;n+=2>>i*2;"*input()
for k in sorted(l):print l[k]

ideone 의 출력을 봅니다 .


흠 ... 계속 반복되지 않습니다.
Zizouz212 2016 년

@ Zizouz212 ideone은 고정 출력을 가지고 있으며 너무 긴 줄을 자동으로 끊습니다.
flawr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.