Lo zigzag sempre crescente


24

Scrivi un programma o una funzione che accetta un numero intero positivo N e genera i primi N numeri di questo schema a zigzag amplificante, usando solo le linee necessarie:

                                         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

Quindi, se N è 1l'output è

1

Se N è 2, l'uscita è

 2
1

Se N è 3l'output è

 2
1 3

Se N è 4l'output è

 2
1 3
   4

Se N è 10l'output è

         10
        9
 2     8
1 3   7
   4 6
    5

Se N è 19l'output è

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

e così via.

Gli appunti

  • Ogni picco o trogolo dello zigzag raggiunge il suo punto di una linea in più rispetto alla linea con 1su di esso rispetto al picco o trogolo precedente.

  • N non è limitato a 44. Lo zigzag cresce nello stesso modello e dovrebbe essere supportato N più grande.

  • I numeri con più cifre devono solo "toccare" ai loro angoli, come illustrato. Assicurati che funzioni quando N è 100e sopra.

  • Non dovrebbero esserci righe vuote (o solo spazio) nell'output tranne una newline finale opzionale.

  • Ogni riga può avere qualsiasi quantità di spazi finali.

punteggio

Vince il codice più breve in byte. Tiebreaker è la risposta precedente.


Qual è la N massima possibile?
Julie Pelletier,

@JuliePelletier In teoria non ce ne sono, ma puoi presumere che sarà inferiore a 2 ^ 16.
Calvin's Hobbies,

L'uso dei caratteri di controllo è consentito o siamo limitati a spazi di cifre e avanzamenti di riga?
Dennis,

2
@Dennis Diciamo di no. Solo cifre / spazi / newline.
Calvin's Hobbies,

1
Qualcuno dovrebbe presentarlo all'OEIS in quel formato come uno scherzo.
DanTheMan,

Risposte:


10

Gelatina , 41 37 29 byte

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

Provalo online!

Come funziona

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
Perché non fare una funzione nella tua lingua (Jelly) che può farlo in pochi caratteri mentre ci sei?
Julie Pelletier,

19
@JuliePelletier L'arte di scrivere un buon linguaggio per il golf consiste nel mettere a punto una serie di istruzioni (e sintassi / semantica linguistica) che ti consentano di scrivere brevi soluzioni per il maggior numero possibile di compiti diversi, non di essere in grado di risolverne uno molto specifico e sfida inventata in un singolo byte. Un buon linguaggio per il golf tende ad essere in realtà molto potente ed espressivo, al contrario di essere solo una raccolta di built-in che sono inutili per tutto tranne che per la specifica funzione che calcolano.
Martin Ender,

@JuliePelletier E andrebbe anche contro le regole di PPCG SE
Bálint

8

PHP, 211 177 164 163 byte

Prevedere i picchi con $ne aumentare la matrice in modo dinamico in entrambe le direzioni, usando il ($x, $y)cursore di output.

I numeri sono allineati str_pad()e l'output finale è quello implode()di quella matrice di stringhe ( $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);

Provalo online!

Aggiornamento: rimosso 34 byte eliminando l'array_pad () non necessario. Aggiornamento2: segui i consigli di @inserusernamequi per accorciarlo un po 'di più. Update3: seguito il consiglio di @ Lynn di salvare un altro byte con ~ õ che impone l'uso del set di caratteri LATIN-1. (non disponibile nell'emulatore PHP online, quindi non incluso lì)


Solo una domanda su questo codice .. Non è necessario inizializzare l'array $ g prima di accedere a un elemento specifico? Voglio dire, dargli una lunghezza o inserire le righe? Non ho molta esperienza con PHP, quindi mi sembra strano ... Grazie.
Yotam Salmon,

No. Una volta definito $arr = [];, puoi fare riferimento a $arr[anything]. Alcuni casi genereranno avvisi ma quelli vengono ignorati qui. Nota che leggere cose come questa probabilmente non ti aiuterà molto ad imparare una lingua. Il tuo commento mi ha fatto capire che avrei potuto accorciarlo, anche se inizialmente pensavo che avrei dovuto riempire il mio array ma non lo faccio. :)
Julie Pelletier,

Haha felice di aiutare;) Ho appena capito che in PHP un array e un dizionario sono inizializzati allo stesso modo e sono completamente gli stessi quando si guarda la sintassi (Why, PHP ?!)
Yotam Salmon

Alcuni miglioramenti minori - 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);(Sostituisci ⏎ con una nuova riga effettiva.)
insertusernamequi

Credo che se si imposta la codifica corretta (Latin-1, non UTF-8), sia un'alternativa a due byte"⏎" .
Lynn,

8

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

39: Ora è alla pari con la versione corretta di Jelly e ho superato la versione competitiva di Dennis!

38: Ho giocato a golf Dennis!

36: Ho nuovamente battuto il golf di Dennis!

34: Anche inferiore alla sua versione corretta!

31: 32 -> 31 grazie a 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- # dsM * * dsC + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ 
tdJJ1 - # 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

Provalo online!

Come funziona

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: alla pari con Jelly "; " 38: Ho giocato a golf Dennis! " Per alcune ore l'hai fatto, ma sembra che @Dennis non voglia essere battuto nel golf del codice: Jelly 37 byte ;)
Kevin Cruijssen,

1
@KevinCruijssen Fatto.
Leaky Nun,

Bello! xD M̶a̶y̶b̶e̶ Ho una fervida immaginazione, ma ora immagino che tu abbia guardato e guardato frustrato per ore fino a quando finalmente hai trovato questa soluzione più breve, e ora @Dennis si risveglierà casualmente e accorcerà di nuovo il suo codice. (Jk, spero che tu rimanga al di sotto di Dennis!)
Kevin Cruijssen il

@KevinCruijssen Tada! Ora è inferiore alla versione corretta.
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),:),'']

Nota che gli spazi mancano in Octave, poiché MATLAB stampa il carattere indicizzato 0come uno spazio, mentre l'ottava omette semplicemente quel carattere.

Spiegazione:

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

Esempio di utilizzo:

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

Come funziona:

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

Modifica: grazie @Lynn per due 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`

Dove \nrappresenta un carattere letterale newline. Spiegazione:

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

Per accorciarlo, pow(-1,ceil(sqrt(i)))lo riscrivo perché sqrt(i-1)&1||-1comunque non funziona, i=0quindi per risolvere il problema aggiungo 1, ma questo poi gira il segno del risultato ed è per questo che finisco con n-=.


heyyy hai un distintivo d'oro! bel lavoro! e fumi santi hai quasi la stessa reputazione di me. continua!
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Questo è "semplicemente" il badge Fanatic. Apparentemente sono molto vicino a ottenere il badge d'oro con il codice-golf tag!
Neil,

doppio santo fuma. Devo muovermi XD
Conor O'Brien il

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]

Visualizza l'output su ideone .


Hm ... Non continua all'infinito.
Zizouz212,

@ Zizouz212 Sì, ideone ha un output fisso con e interrompe automaticamente le linee troppo lunghe.
Flawr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.