Ever Amplifying Zikzak


24

Olumlu bir tamsayı alan ve sadece bu gerekli zikzak düzeninin ilk N sayısını çıkaran bir program veya işlev yazı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

Yani, eğer 1çıktı N ise :

1

N ise 2, çıktı

 2
1

N ise 3çıktı

 2
1 3

N ise 4çıktı

 2
1 3
   4

N ise 10çıktı

         10
        9
 2     8
1 3   7
   4 6
    5

N ise 19çıktı

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

ve bunun gibi.

notlar

  • Zikzakların her bir zirvesi veya oluğu, bir önceki hattına 1veya teknesine göre üzerinde bulunan çizgiden bir satır daha uzağa ulaşır .

  • N ile sınırlı değildir 44. Zikzak aynı düzende büyür ve daha büyük N desteklenmelidir.

  • Birden fazla rakam içeren sayılar, gösterildiği gibi köşelerinde sadece "dokunmalıdır". N'nin 100ve yukarısında çalıştığından emin olun .

  • Çıktıda isteğe bağlı bir izleyen yeni satır dışında boş (veya yalnızca boşluk) satır olmamalıdır.

  • Herhangi bir satırda herhangi bir miktarda sonda boşluk olabilir.

puanlama

Bayt cinsinden en kısa kod kazanır. Tiebreaker daha erken bir cevaptı.


Mümkün olan maksimum N?
Julie Pelletier

@JuliePelletier Teoride hiçbir şey yoktur, ancak bunun 2 ^ 16'dan küçük olacağını varsayabilirsiniz.
Calvin'in Hobileri

Kullanıyor kontrol karakterleri izin ya da biz basamaklı alanlarda ve hat beslemeleri ile sınırlıdır?
Dennis,

2
@Dennis Hayır diyelim. Sadece rakam / boşluk / yeni satır.
Calvin'in Hobileri

1
Birileri OEIS'e bu formatta şaka olarak sunmalıdır.
DanTheMan

Yanıtlar:


10

Jöle , 41 37 29 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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
Neden kendi dilinizde (Jelly), siz onu yaparken birkaç karakterle yapabilecek bir işlev yapmıyorsunuz?
Julie Pelletier

19
@JuliePelletier İyi bir golf dili yazma sanatı, çok kesin bir özümü çözememekle birlikte mümkün olduğu kadar çok farklı işler için kısa çözümler yazmanıza izin veren bir dizi talimat (ve sözdizimi / dil semantiği) ile ilgilidir. ve tek bir baytta meydan okuma mücadelesi. İyi bir golf dili, hesapladığı belirli işlevlerden başka hiçbir şey için işe yaramaz olan yerleşik bir koleksiyon olmanın aksine, aslında çok güçlü ve etkileyici olma eğilimindedir.
Martin Ender

@JuliePelletier Ayrıca PPCG SE
Bálint

8

PHP, 211 177 164 163 bayt

Çıktı imlecini $nkullanarak , tepeleri tahmin edin ve her iki yönde de diziyi dinamik olarak artırın ($x, $y).

Sayılar ile aynı hizaya gelir str_pad()ve son çıktı implode()bu dizelerin ( $g) dizisidir .

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

Çevrimiçi test edin!

Güncelleme: gereksiz dizi_adesinden () kurtularak 34 baytı kaldırıldı. Güncelleme2: biraz daha kısaltmak için @ insertusernamehere tavsiyesini takip etti. Güncelleme3: @ LATIN-1 karakter setini kullanan bir bayt daha tasarruf etmek için @ Lynn'in tavsiyesini izledi. (çevrimiçi PHP emülatöründe mevcut değildir, bu yüzden orada bulunmaz)


Bu kodla ilgili sadece bir soru .. Belirli bir öğeye erişmeden önce $ g dizisini başlatmanız gerekmez mi? Demek istediğim, ona bir uzunluk vermek veya satır eklemek mi? PHP ile pek tecrübeli değilim, bu yüzden sadece bana garip görünüyor ... Teşekkürler.
Yotam Salmon,

Hayır. Tanımladıktan sonra $arr = [];, başvurabilirsiniz $arr[anything]. Bazı durumlarda bildirimler çıkar, ancak bunlar burada göz ardı edilir. Bunun gibi şeyleri okumak, muhtemelen bir dil öğrenmek için size yardımcı olmayacaktır. Yorumunuz, başlangıçta dizimi doldurmam gerekebileceğini düşündüğüm halde daha kısa yapabileceğimin farkında olmamı sağladı. :)
Julie Pelletier

Haha yardım etmekten memnun;) PHP'de bir dizinin ve sözlüğün aynı şekilde başlatıldığını ve sözdizimine bakarken tamamen aynı olduklarını fark ettim (Neden, PHP ?!)
Yotam Salmon

Bazı küçük iyileştirmeler - 164 bayt : 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);(⏎'yi gerçek bir yeni satırla değiştirin.)
insertusernamehere

Ben size kodlama hakkı kurarsanız (Latince-1, UTF-8), iman bir, iki baytlık bir alternatiftir için "⏎".
Lynn

8

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

39: Şimdi Jelly'in bug-fix versiyonuyla aynı seviyede ve Dennis'in rakip versiyonunu geride bıraktım!

38: Dennis'i dışarıda bıraktım!

36: Dennis'i tekrar kovdum!

34: Hatalı sürümünden bile daha düşük!

31: 32 -> 31 Dennis'e teşekkürler.

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`hkheSKbhkKJ1J- 
* d * d + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; dyhdyQ + Q = + Z = 
J_WsJ1JdJ1 - # dsMCmX *] *; l`hdyQ + Q = + Z = @ _ BJsI @ td2h 
j- # dsMCmX *] *; l`hdyQ + Q = + Zsty% s @ td2 2 saat 
j- # dsMCmX *] *; l 'hdyQ + Q = + Z @ _B1.E @ d2h 
JQj- # dsMCmX *] *; l`hdyQ = + J @ _B1E @ d2h 
JyQj- # dsMCmX *] *; ldhJ = + Q @ _B1. E @ d2h 
j- # dsMCmX *] *; l`hdyQ = + Q @ _B1.E @ d2h
j- # dsMCmX *] *; l`hdyQ=+Q^_1.E@d2h

Çevrimiçi deneyin!

Nasıl çalışır

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: Jöle ile eşit "; " 38: Dennis'i dışarıda bıraktım! " Birkaç saat boyunca yaptın, ama görünüşe göre @Dennis kodda golf
oynamaktan hoşlanmıyor

1
@KevinCruijssen Tamam.
Leaky Nun

Güzel! xD M̶a̶y̶b̶e̶ Çılgınca bir hayal gücüm var, ama şimdi daha kısa bir çözüm bulana kadar saatlerce hayal kırıklığına uğradığınızı ve baktığınızı hayal ediyorum ve şimdi @Dennis rasgele uyanıp kodunu tekrar kısaltacak. (Jk, umarım Dennis'in altında
kalırsın

@KevinCruijssen Tada! Şimdi hata düzeltilmiş sürümünden daha düşük.
Sızdıran Rahibe

5

MATLAB, 148 bayt

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, 0boşluk olarak dizine eklenmiş karakteri basarken, oktav ise bu karakteri atlar.

Açıklama:

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 bayt

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

Kullanım örneği:

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

Nasıl çalışır:

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

Düzenleme: İki bayt için teşekkürler @Lynn!


2

JavaScript (ES6), 213 bayt

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`

Nerede \nbir hazır satır karakteri temsil eder. Açıklama:

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

Kısaltmak için tekrar pow(-1,ceil(sqrt(i)))yazdım, sqrt(i-1)&1||-1ancak bu işe yaramadı, i=0bu yüzden 1 eklediğim düzeltmek için işe yaramıyor, ancak bu sonuç sonucunun işaretini çeviriyor n-=.


Bir altın rozetin var heyyy! iyi iş! ve kutsal dumanlar, neredeyse benim kadar benim kadar temsilcisin var. devam et!
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Fanatik rozeti "sadece" dır. Görünüşe göre altın kod-golf etiketi rozeti almaya çok yakınım!
Neil

çift ​​kutsal sigara içiyor.
Conor O'Brien

1

Python 2, 137 bayt

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]

Çıktıyı ideone üzerinde görüntüleyin .


Hm ... Devam edip devam etmiyor.
Zizouz212

@ Zizouz212 Yapar, ideone yalnızca sabit bir çıktısına sahiptir ve çok uzun satırları otomatik olarak keser.
kusur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.