คดเคี้ยวไปมาที่เคยขยาย


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บนมันมากกว่ายอดเขาหรือรางก่อนหน้านี้

  • ไม่มีไม่ได้ 44จำกัด คดเคี้ยวไปมาเติบโตในรูปแบบเดียวกันและขนาดใหญ่ควรได้รับการสนับสนุน

  • ตัวเลขที่มีตัวเลขหลายหลักควร "แตะ" ที่มุมของภาพเท่านั้น ตรวจสอบให้แน่ใจว่าใช้งานได้เมื่อ N คือ100ขึ้นไป

  • ไม่ควรมีบรรทัดว่าง (หรือเว้นวรรคเท่านั้น) ในเอาต์พุตยกเว้นบรรทัดใหม่ที่ต่อท้ายหนึ่งบรรทัด

  • บรรทัดใด ๆ อาจมีช่องว่างต่อท้ายจำนวนเท่าใดก็ได้

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบก่อนหน้า


N สูงสุดคืออะไร?
Julie Pelletier

@JuliePelletier ในทางทฤษฎีไม่มีเลย แต่คุณสามารถสรุปได้ว่ามันจะน้อยกว่า 2 ^ 16
งานอดิเรกของ Calvin

อนุญาตให้ใช้อักขระควบคุมหรือเรา จำกัด ให้มีช่องว่างและการป้อนบรรทัดหลักหรือไม่
เดนนิส

2
@ เดนนิสสมมติว่าไม่ เพียงตัวเลข / ช่องว่าง / ขึ้นบรรทัดใหม่
งานอดิเรกของ Calvin

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);

ทดสอบออนไลน์!

อัปเดต: ลบออก 34 ไบต์โดยกำจัด array_pad ที่ไม่จำเป็นออก Update2: ปฏิบัติตามคำแนะนำของ @ insertusername ที่นี่เพื่อย่อให้สั้นลงอีกเล็กน้อย Update3: ปฏิบัติตามคำแนะนำของ @ Lynn เพื่อบันทึกอีกหนึ่งไบต์ด้วย ~ õซึ่งกำหนดให้ใช้ชุดอักขระ LATIN-1 (ไม่พร้อมใช้งานในโปรแกรมจำลอง PHP ออนไลน์ดังนั้นจึงไม่รวมอยู่ในนั้น)


แค่คำถามเกี่ยวกับรหัสนี้ .. คุณไม่ต้องเริ่มต้นอาร์เรย์ $ g ก่อนที่คุณจะเข้าถึงองค์ประกอบเฉพาะหรือไม่? ฉันหมายถึงให้มันมีความยาวหรือแทรกแถว? ฉันไม่ได้มีประสบการณ์เกี่ยวกับ PHP ดังนั้นมันจึงดูแปลกสำหรับฉัน ... ขอบคุณ
Yotam Salmon

ฉบับเมื่อคุณกำหนดคุณสามารถอ้างถึง$arr = []; $arr[anything]บางกรณีจะแสดงผลลัพธ์ แต่จะถูกละเว้นที่นี่ โปรดทราบว่าการอ่านสิ่งนี้อาจไม่ช่วยให้คุณเรียนรู้ภาษาได้มากนัก ความคิดเห็นของคุณทำให้ฉันรู้ว่าฉันสามารถทำให้สั้นลงได้เพราะในตอนแรกฉันคิดว่าฉันต้องใส่ชุดของฉัน แต่ฉันไม่ทำ :)
Julie Pelletier

ฮ่าฮ่าดีใจที่ช่วย;) เพิ่งรู้ว่าใน PHP อาร์เรย์และพจนานุกรมเริ่มต้นในลักษณะเดียวกันและสมบูรณ์เหมือนกันเมื่อดูที่ไวยากรณ์ (ทำไม, 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);(แทนที่⏎ด้วย newline จริง)
แทรกชื่อผู้ใช้ที่นี่

ผมเชื่อว่าถ้าคุณตั้งค่าการเข้ารหัสขวาของคุณ (ภาษาละติน-1 ไม่ UTF-8) เป็นทางเลือกที่สองไบต์"⏎"เพื่อ
Lynn

8

Pyth, 60 53 52 46 42 39 38 36 34 32 31 ไบต์

39: ตอนนี้มันใกล้เคียงกับJelly รุ่นที่แก้ไขบั๊กแล้วและฉันก็มีเวอร์ชั่นแข่งขันของเดนนิส!

38: ฉันออกเดนนิสที่สนามกอล์ฟ!

36: ฉันออกเดนนิสอีกครั้ง!

34: ต่ำกว่าเวอร์ชั่นแก้ไขบั๊กของเขา!

31: 32 -> 31 ต้องขอบคุณเดนนิส

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`hkyQ + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ 
td2J - # 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 ไม่ชอบที่จะถูกตีที่โค้ดกอล์ฟ: Jelly 37 bytes ;)
Kevin Cruijssen

1
@KevinCruijssen เรียบร้อยแล้ว
Leun Nun

ดี! xD M̶a̶y̶b̶e̶ฉันมีจินตนาการที่ดุร้าย แต่ตอนนี้ฉันจินตนาการว่าคุณได้ดูและรู้สึกหงุดหงิดเป็นเวลาหลายชั่วโมงจนกระทั่งในที่สุดคุณก็พบวิธีแก้ปัญหาที่สั้นกว่านี้และตอนนี้ @Dennis จะตื่นขึ้นมาและย่อรหัสของเขาอีกครั้ง (Jk ฉันหวังว่าคุณจะอยู่ด้านล่าง Dennis!)
Kevin Cruijssen

@KevinCruijssen Tada! ตอนนี้ต่ำกว่ารุ่นแก้ไขข้อผิดพลาด
Leun 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),:),'']

โปรดทราบว่าช่องว่างขาดหายไปใน Octave เนื่องจาก 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

Haskell, 144 142 ไบต์

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

แก้ไข: ขอบคุณ @Lynn สำหรับสองไบต์!


2

JavaScript (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=0เพื่อที่จะแก้ไขปัญหาที่ผมเพิ่ม 1 n-=แต่แล้วพลิกสัญญาณของผลซึ่งเป็นเหตุผลที่ผมจบลงด้วย


เฮ้คุณได้รับเหรียญทอง! งานที่ดี! และศักดิ์สิทธิ์สูบบุหรี่คุณมีตัวแทนมากที่สุดเท่าที่ฉันทำ ให้มันไป!
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴนั่นคือ "เพียง" ตรา Fanatic เห็นได้ชัดว่าฉันใกล้จะได้ป้ายทองโค้ดกอล์ฟแล้ว!
Neil

สูบบุหรี่ศักดิ์สิทธิ์คู่ ฉันต้องขยับ XD
Conor O'Brien

1

Python 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

@ Zizouz212 ใช่แล้ว ideone เพิ่งมีเอาท์พุทคงที่และแบ่งบรรทัดที่ยาวเกินไปโดยอัตโนมัติ
ข้อบกพร่อง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.