Zigzag Yang Pernah Memperkuat


24

Tulis sebuah program atau fungsi yang mengambil dalam bilangan bulat positif N dan mengeluarkan angka N pertama dari pola zigzag yang menguatkan ini, hanya menggunakan garis yang diperlukan:

                                         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

Jadi, jika N adalah 1output

1

Jika N adalah 2, outputnya adalah

 2
1

Jika N adalah 3output

 2
1 3

Jika N adalah 4output

 2
1 3
   4

Jika N adalah 10output

         10
        9
 2     8
1 3   7
   4 6
    5

Jika N adalah 19output

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

dan seterusnya.

Catatan

  • Setiap puncak atau palung zigzag mencapai titiknya satu garis lebih jauh dari garis dengan zigzag 1daripada puncak atau palung sebelumnya.

  • N tidak terbatas pada 44. Zigzag tumbuh dalam pola yang sama dan N yang lebih besar harus didukung.

  • Angka dengan banyak digit hanya boleh "menyentuh" ​​di sudutnya, seperti yang digambarkan. Pastikan ini berfungsi saat N berada di 100atas.

  • Seharusnya tidak ada baris kosong (atau spasi saja) dalam output kecuali satu baris tambahan opsional.

  • Setiap garis dapat memiliki jumlah ruang trailing apa pun.

Mencetak gol

Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya.


Berapa N maksimum yang mungkin?
Julie Pelletier

@JuliePelletier Secara teori tidak ada, tetapi Anda dapat menganggapnya kurang dari 2 ^ 16.
Calvin Hobbies

Apakah diperbolehkan menggunakan karakter kontrol atau kita terbatas pada angka spasi dan umpan baris?
Dennis

2
@ Dennis Katakanlah tidak. Hanya digit / spasi / baris baru.
Hobi Calvin

1
Seseorang harus menyerahkan itu ke OEIS dalam format itu sebagai lelucon.
DanTheMan

Jawaban:


10

Jelly , 41 37 29 byte

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

Cobalah online!

Bagaimana itu bekerja

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
Mengapa tidak membuat fungsi dalam bahasa Anda (Jelly) yang dapat melakukannya dalam beberapa karakter saat Anda menggunakannya?
Julie Pelletier

19
@JuliePelletier Seni menulis bahasa golf yang baik adalah tentang membuat seperangkat instruksi (dan sintaks / semantik bahasa) yang memungkinkan Anda menulis solusi singkat untuk sebanyak mungkin tugas yang berbeda, bukan tentang menyelesaikan satu yang sangat spesifik dan membuat tantangan dalam satu byte. Bahasa golf yang baik cenderung sangat kuat dan ekspresif, bukan hanya menjadi koleksi bawaan yang tidak berguna untuk apa pun kecuali fungsi spesifik yang mereka hitung.
Martin Ender

@JuliePelletier Dan itu juga akan bertentangan dengan aturan PPCG SE
Bálint

8

PHP, 211 177 164 163 byte

Memprediksi puncak dengan $ndan meningkatkan array secara dinamis di kedua arah, menggunakan ($x, $y)kursor keluaran.

Bilangan disejajarkan dengan str_pad()dan hasil akhir adalah implode()array dari string ( $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);

Uji secara online!

Pembaruan: dihapus 34 byte dengan menyingkirkan array_pad yang tidak diperlukan (). Update2: mengikuti @ masukkan nama pengguna, saran untuk mempersingkat lebih sedikit. Update3: mengikuti saran @ Lynn untuk menghemat satu byte lagi dengan ~ õ yang memaksakan penggunaan charset LATIN-1. (tidak tersedia di emulator PHP online jadi tidak termasuk di sana)


Hanya pertanyaan tentang kode ini .. Tidakkah Anda harus menginisialisasi array $ g sebelum Anda mengakses elemen tertentu? Maksud saya, memberikannya panjang atau menyisipkan baris? Saya tidak terlalu berpengalaman dengan PHP, jadi itu hanya terlihat aneh bagi saya ... Terima kasih.
Yotam Salmon

Tidak. Setelah Anda menentukan $arr = [];, Anda dapat merujuk $arr[anything]. Beberapa kasus akan menampilkan pemberitahuan tetapi diabaikan di sini. Perhatikan bahwa membaca hal-hal seperti ini mungkin tidak akan banyak membantu Anda untuk belajar bahasa. Komentar Anda membuat saya sadar bahwa saya bisa membuatnya lebih pendek karena pada awalnya saya pikir saya perlu menambahkan array saya tetapi saya tidak melakukannya. :)
Julie Pelletier

Haha senang membantu;) Baru menyadari bahwa dalam PHP sebuah array dan kamus diinisialisasi dengan cara yang sama dan sepenuhnya sama ketika melihat sintaks (Kenapa, PHP ?!)
Yotam Salmon

Beberapa perbaikan kecil - 164 byte : 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);(Ganti ⏎ dengan baris baru yang sebenarnya.)
insertusernamehere

Saya percaya jika Anda mengatur pengkodean Anda benar (Latin-1, tidak UTF-8), adalah alternatif dua-byte untuk "⏎".
Lynn

8

Pyth, 60 53 52 46 42 39 38 36 34 32 31 byte

39: Sekarang setara dengan versi Jelly-bug-fix , dan saya telah mengungguli versi pesaing Dennis!

38: Saya pernah bermain golf dengan Dennis!

36: Saya telah keluar main golf lagi Dennis!

34: Bahkan lebih rendah dari versi bug-fix-nya!

31: 32 -> 31 terima kasih kepada Dennis.

J1K.u+N=J_WsI@Y2JtQZjsM.t.e ++ *] * dl`hkabhSK`hk *] * dl`hkabeSKKd 
J1K.u+N=J_WsI@Y2JtQZjsM.t.eX * 
kKhhhh N=J_WsI@Y2JtQZ=-RhSKKjsM.t.eX *] * dl`hkheSKbhkKd 
J1K.u+N=J_WsI@Y2JtQQj-#dsMC.eX *] * dl`hkheSKlh 
* j1j * + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ 
td2jh - # dsMCmX *] *; l`hdyQ + Q = + Z = @ _ BJsI @ td2h 
j- # dsMCmX *] *; l`hdyQ + Q = + Zsty% s @ td2 2j 
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

Cobalah online!

Bagaimana itu bekerja

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: Setara dengan Jelly "; " 38: Saya sudah keluar- main golf Dennis! " Selama beberapa jam Anda melakukannya, tetapi sepertinya @Dennis tidak suka dipukuli di kode-golf: Jelly 37 byte ;)
Kevin Cruijssen

1
@KevinCruijssen Done.
Leaky Nun

Bagus! xD M̶a̶y̶b̶e̶ Saya memiliki imajinasi yang liar, tetapi sekarang saya bayangkan Anda telah melihat dan mencari dengan frustrasi selama berjam-jam sampai akhirnya Anda menemukan solusi yang lebih pendek ini, dan sekarang @Dennis dengan santai akan bangun dan mempersingkat kodenya lagi. (Jk, saya harap Anda tetap di bawah Dennis!)
Kevin Cruijssen

@KevinCruijssen Tada! Sekarang lebih rendah dari versi bug-fix.
Leaky Nun

5

MATLAB, 148 byte

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),:),'']

Perhatikan bahwa spasi hilang dalam Oktaf, karena MATLAB mencetak karakter yang diindeks dengan 0spasi, sementara oktaf tidak menghilangkan karakter itu.

Penjelasan:

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 byte

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

Contoh penggunaan:

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

Bagaimana itu bekerja:

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

Sunting: Terima kasih @Lynn untuk dua byte!


2

JavaScript (ES6), 213 byte

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`

Dimana \nmewakili karakter baris baru literal. Penjelasan:

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

Untuk mempersingkat pow(-1,ceil(sqrt(i)))saya menulis ulang karena sqrt(i-1)&1||-1bagaimanapun ini tidak bekerja untuk i=0memperbaikinya sehingga saya menambahkan 1 tetapi ini kemudian membalik tanda hasil yang mengapa saya berakhir dengan n-=.


hei kamu punya lencana emas! pekerjaan yang baik! dan suci merokok Anda hampir memiliki perwakilan sebanyak yang saya lakukan. teruskan!
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Itu "hanya" lencana Fanatic. Rupanya saya sangat dekat untuk mendapatkan lencana tag kode golf-emas!
Neil

merokok suci ganda. Saya perlu pindah XD
Conor O'Brien

1

Python 2, 137 byte

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]

Lihat output di ideone .


Hm ... Itu tidak berjalan terus dan terus dan terus.
Zizouz212

@ Zizouz212 Ya, ideone hanya memiliki output tetap dengan dan secara otomatis memecah garis yang terlalu panjang.
flawr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.