Le zigzag sans cesse amplificateur

24

Écrivez un programme ou une fonction qui prend un entier positif N et sort les premiers N nombres de ce motif en zigzag amplificateur, en utilisant uniquement les lignes nécessaires:

                                         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

Donc, si N est 1la sortie est

1

Si N est 2, la sortie est

 2
1

Si N est 3la sortie est

 2
1 3

Si N est 4la sortie est

 2
1 3
   4

Si N est 10la sortie est

         10
        9
 2     8
1 3   7
   4 6
    5

Si N est 19la sortie est

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

etc.

Remarques

  • Chaque pic ou creux du zigzag atteint son point à une ligne de plus de la ligne avec 1le dessus que le pic ou le creux précédent.

  • N n'est pas limité à 44. Le zigzag croît dans le même schéma et un N plus grand doit être pris en charge.

  • Les chiffres à plusieurs chiffres ne doivent "toucher" que dans leurs coins, comme illustré. Assurez-vous que cela fonctionne lorsque N est 100supérieur ou égal à.

  • Il ne doit pas y avoir de lignes vides (ou d'espace uniquement) dans la sortie, sauf une nouvelle ligne de fin facultative.

  • Toute ligne peut avoir n'importe quelle quantité d'espaces de fin.

Notation

Le code le plus court en octets gagne. Tiebreaker est une réponse antérieure.

Loisirs de Calvin
la source
Quel est le N maximum possible?
Julie Pelletier
@JuliePelletier En théorie, il n'y en a pas, mais vous pouvez supposer qu'il sera inférieur à 2 ^ 16.
Calvin's Hobbies
L'utilisation de caractères de contrôle est-elle autorisée ou sommes-nous limités aux espaces de chiffres et aux sauts de ligne?
Dennis
2
@Dennis Disons non. Juste des chiffres / espaces / nouvelles lignes.
Calvin's Hobbies
1
Quelqu'un devrait soumettre cela à l'OEIS dans ce format pour plaisanter.
DanTheMan

Réponses:

10

Gelée , 41 37 29 octets

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

Essayez-le en ligne!

Comment ça marche

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.
Dennis
la source
2
Pourquoi ne pas créer une fonction dans votre langue (Jelly) qui puisse le faire en quelques caractères pendant que vous y êtes?
Julie Pelletier
19
@JuliePelletier L'art d'écrire une bonne langue de golf consiste à proposer un ensemble d'instructions (et de sémantique syntaxique / linguistique) qui vous permettent d'écrire des solutions courtes pour autant de tâches différentes que possible, pas de pouvoir en résoudre une très spécifique. et défi artificiel dans un seul octet. Un bon langage de golf a tendance à être en fait très puissant et expressif, au lieu d'être simplement une collection de modules intégrés qui ne sont utiles que pour la fonction spécifique qu'ils calculent.
Martin Ender
@JuliePelletier Et cela irait également à l'encontre des règles de PPCG SE
Bálint
8

PHP, 211 177 164 163 octets

Prédisez les pics avec $net augmentez le tableau dynamiquement dans les deux sens, en utilisant le ($x, $y)curseur de sortie.

Les nombres sont alignés avec str_pad()et la sortie finale est celle implode()de ce tableau de chaînes ( $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);

Testez-le en ligne!

Mise à jour: supprimé 34 octets en supprimant le array_pad () inutile. Update2: suivi les conseils de @ insertusernamehere pour le raccourcir un peu plus. Update3: suivi les conseils de @ Lynn pour enregistrer un octet de plus avec ~ õ qui impose l'utilisation du jeu de caractères LATIN-1. (non disponible dans l'émulateur PHP en ligne, donc non inclus)

Julie Pelletier
la source
Juste une question sur ce code. N'avez-vous pas à initialiser le tableau $ g avant d'accéder à un élément spécifique? Je veux dire, lui donner une longueur ou insérer les rangées? Je ne suis pas très expérimenté avec PHP, donc ça me semble bizarre ... Merci.
Yotam Salmon
Non. Une fois que vous avez défini $arr = [];, vous pouvez vous y référer $arr[anything]. Certains cas afficheront des avis, mais ceux-ci sont ignorés ici. Notez que lire des trucs comme ça ne vous aidera probablement pas beaucoup à apprendre une langue. Votre commentaire m'a fait réaliser que je pouvais le raccourcir, car j'ai d'abord pensé que je devrais remplir mon tableau, mais je ne le fais pas. :)
Julie Pelletier
Haha heureux d'avoir aidé;) Je viens de réaliser qu'en PHP, un tableau et un dictionnaire sont initialisés de la même manière et sont complètement les mêmes lorsque l'on regarde la syntaxe (Pourquoi, PHP?!)
Yotam Salmon
Quelques améliorations mineures - 164 octets : 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);(Remplacez ⏎ par une nouvelle ligne réelle.)
insertusernamehere
Je crois que si vous configurez votre droit d'encodage (Latin-1, pas UTF-8), est une alternative à deux octets"⏎" .
Lynn
8

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

39: C'est maintenant à égalité avec la version corrigée de bug de Jelly , et j'ai surpassé la version concurrente de Dennis!

38: J'ai hors-golf Dennis!

36: J'ai de nouveau joué à Dennis!

34: Encore plus bas que sa version corrigée!

31: 32 -> 31 grâce à Dennis.

[email protected] ++ *] * dl`hkabhSK`hk *] * dl`hkabeSKKd 
[email protected] *] * dl`hkhaeSKhSKabhSKhkKd 
J1K.u + N=J_WsI@Y2JtQZ=-RhSKKjsM.t.eX *] * dl`hkheSKbhkKd 
J1K.u+N=J_WsI@Y2JtQQj-#dsMC.eX *] * dl`hkheSKbhkK 
J1j- # dsQ. + 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

Essayez-le en ligne!

Comment ça marche

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.
Leaky Nun
la source
2
" 39: À égalité avec Jelly "; " 38: J'ai joué au golf à Dennis! " Pendant quelques heures vous l'avez fait, mais il semble que @Dennis n'aime pas se faire battre au code-golf: Jelly 37 bytes ;)
Kevin Cruijssen
1
@KevinCruijssen Done.
Leaky Nun
Agréable! xD M̶a̶y̶b̶e̶ J'ai une imagination débordante, mais maintenant j'imagine que vous avez regardé et regardé avec frustration pendant des heures jusqu'à ce que vous ayez finalement trouvé cette solution plus courte, et maintenant @Dennis se réveillera nonchalamment et raccourcira à nouveau son code. (Jk, j'espère que vous restez en dessous de Dennis!)
Kevin Cruijssen
@KevinCruijssen Tada! Il est désormais inférieur à la version corrigée.
Leaky Nun
5

MATLAB, 148 octets

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

Notez que les espaces manquent dans Octave, car MATLAB imprime le caractère indexé avec 0comme un espace, tandis que l'octave ne fait qu'omettre ce caractère.

Explication:

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
flawr
la source
3

Haskell, 144 142 octets

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

Exemple d'utilisation:

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

Comment ça marche:

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

Edit: Merci @Lynn pour deux octets!

nimi
la source
2

JavaScript (ES6), 213 octets

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`

\nreprésente un caractère de nouvelle ligne littéral. Explication:

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

Pour raccourcir, pow(-1,ceil(sqrt(i)))je le réécris car sqrt(i-1)&1||-1cela ne fonctionne pas, i=0donc pour corriger cela, j'ajoute 1 mais cela retourne ensuite le signe du résultat, c'est pourquoi je me retrouve avec n-=.

Neil
la source
heyyy tu as un badge en or! Bon travail! et saint fume, vous avez presque autant de représentants que moi. le maintenir!
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ C'est "simplement" l'insigne fanatique. Apparemment, je suis vraiment sur le point d'obtenir le badge d'étiquette de code d'or de golf!
Neil
double fumée sainte. Je dois bouger XD
Conor O'Brien
1

Python 2, 137 octets

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]

Voir la sortie sur ideone .

Lynn
la source
Hm ... Ça ne continue pas indéfiniment.
Zizouz212
@ Zizouz212 Oui, ideone a juste une sortie fixe avec et coupe automatiquement les lignes trop longues.
flawr