Der sich ständig verstärkende Zickzack

24

Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl N aufnimmt und die ersten N Zahlen dieses verstärkenden Zick-Zack-Musters ausgibt, wobei Sie nur die benötigten Zeilen verwenden:

                                         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

Also, wenn N ist, ist 1der Ausgang

1

Wenn N ist 2, ist die Ausgabe

 2
1

Wenn N ist, ist 3der Ausgang

 2
1 3

Wenn N ist, ist 4der Ausgang

 2
1 3
   4

Wenn N ist, ist 10der Ausgang

         10
        9
 2     8
1 3   7
   4 6
    5

Wenn N ist, ist 19der Ausgang

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

und so weiter.

Anmerkungen

  • Jeder Gipfel oder Tiefpunkt des Zickzacks erreicht seinen Punkt eine Linie weiter von der Linie mit dem 1darauf als der vorherige Gipfel oder Tiefpunkt.

  • N ist nicht beschränkt auf 44. Der Zickzack wächst im gleichen Muster und es sollte ein größeres N unterstützt werden.

  • Zahlen mit mehreren Ziffern sollten wie abgebildet nur an den Ecken "anfassen". Stellen Sie sicher, dass dies funktioniert, wenn N 100und höher ist.

  • Die Ausgabe sollte keine leeren Zeilen (oder nur Leerzeichen) enthalten, mit Ausnahme einer optionalen nachgestellten neuen Zeile.

  • Jede Zeile kann beliebig viele nachgestellte Leerzeichen enthalten.

Wertung

Der kürzeste Code in Bytes gewinnt. Tiebreaker ist frühere Antwort.

Calvins Hobbys
quelle
Was ist das maximal mögliche N?
Julie Pelletier
@ JuliePelletier In der Theorie gibt es keine, aber Sie können davon ausgehen, dass es weniger als 2 ^ 16 sein wird.
Calvins Hobbys
Ist die Verwendung von Steuerzeichen erlaubt oder sind wir auf Ziffern und Zeilenumbrüche beschränkt?
Dennis
2
@ Tennis Sagen wir nein. Nur Ziffern / Leerzeichen / Zeilenumbrüche.
Calvins Hobbys
1
Jemand sollte das als Scherz dem OEIS in diesem Format vorlegen.
DanTheMan

Antworten:

10

Jelly , 41 37 29 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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
quelle
2
Warum machen Sie nicht eine Funktion in Ihrer Sprache (Jelly), die das in ein paar Zeichen erledigt, während Sie dabei sind?
Julie Pelletier
19
@JuliePelletier Die Kunst, eine gute Golfsprache zu schreiben, besteht darin, eine Reihe von Anweisungen (und Syntax- / Sprachsemantik) zu entwickeln, mit denen Sie kurze Lösungen für so viele verschiedene Aufgaben wie möglich schreiben können, ohne eine bestimmte lösen zu können und erfundene Herausforderung in einem einzigen Byte. Eine gute Golfsprache ist in der Regel sehr leistungsfähig und ausdrucksstark, im Gegensatz zu einer Sammlung von integrierten Funktionen, die für nichts anderes als die von ihnen berechnete spezifische Funktion verwendet werden können.
Martin Ender
@ JuliePelletier Und es würde auch gegen die Regeln der PPCG SE verstoßen
Bálint
8

PHP, 211 177 164 163 Bytes

Vorhersage der Peaks mit $nund dynamische Vergrößerung des Arrays in beide Richtungen mit dem ($x, $y)Ausgabecursor.

Zahlen werden mit ausgerichtet str_pad()und die endgültige Ausgabe ist die Ausgabe implode()dieses Arrays von Zeichenfolgen ( $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);

Testen Sie es online!

Update: 34 Bytes wurden entfernt, indem das nicht benötigte array_pad () entfernt wurde. Update2: @ insertusernamehere's Rat gefolgt, um es ein bisschen mehr zu verkürzen. Update3: Befolgte @ Lynns Rat, ein weiteres Byte mit ~ õ zu speichern, was die Verwendung des LATIN-1-Zeichensatzes vorschreibt. (nicht im Online-PHP-Emulator verfügbar, daher dort nicht enthalten)

Julie Pelletier
quelle
Nur eine Frage zu diesem Code. Müssen Sie das Array $ g nicht initialisieren, bevor Sie auf ein bestimmtes Element zugreifen können? Ich meine, es eine Länge geben oder die Zeilen einfügen? Ich bin nicht sehr erfahren mit PHP, also sieht es für mich einfach komisch aus ... Danke.
Yotam Salmon
Nein. Sobald Sie definiert haben $arr = [];, können Sie darauf verweisen $arr[anything]. In einigen Fällen werden Hinweise ausgegeben, die hier jedoch ignoriert werden. Beachten Sie, dass das Lesen von solchen Dingen Ihnen wahrscheinlich nicht viel hilft, eine Sprache zu lernen. Ihr Kommentar hat mir klar gemacht, dass ich ihn kürzer machen könnte, da ich anfangs dachte, ich müsste mein Array auffüllen, aber das tue ich nicht. :)
Julie Pelletier
Haha, froh, dass ich geholfen habe;) Ich habe gerade festgestellt, dass ein Array und ein Wörterbuch in PHP auf die gleiche Weise initialisiert werden und in Bezug auf die Syntax völlig gleich sind (Warum, PHP ?!)
Yotam Salmon
Einige kleinere Verbesserungen - 164 Bytes : 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);(Ersetzen Sie ⏎ durch einen tatsächlichen Zeilenumbruch.)
fügen
Ich glaube, wenn Sie Ihr Kodierungsrecht einstellen (Latin-1, nicht UTF-8), ist dies eine Zwei-Byte-Alternative zu "⏎".
Lynn
8

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

39: Es ist jetzt auf Augenhöhe mit der Bugfix-Version von Jelly und ich habe Dennis 'Konkurrenzversion übertroffen!

38: Ich habe Dennis ausgespielt!

36: Ich habe Dennis schon wieder ausgespielt!

34: Noch niedriger als seine Version mit Fehlerbehebung!

31: 32 -> 31 danke an 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@Y2JtQj-#dsMC.eX *] * dl`hkheSKbhkk 
J1Kdj- # + 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 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

Probieren Sie es online!

Wie es funktioniert

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.
Undichte Nonne
quelle
2
" 39: Auf Augenhöhe mit Jelly "; " 38: Ich habe Dennis out-golfed! " Für ein paar Stunden hast du es getan, aber es sieht so aus, als würde @Dennis nicht gerne beim Code-Golfen geschlagen werden: Jelly 37 bytes ;)
Kevin Cruijssen
1
@ KevinCruijssen Fertig.
Undichte Nonne
Nett! xD M̶a̶y̶b̶e̶ Ich habe eine wilde Fantasie, aber jetzt stell ich mir vor, Sie haben stundenlang frustriert geschaut und geschaut, bis Sie endlich diese kürzere Lösung gefunden haben, und jetzt wird @Dennis beiläufig aufwachen und seinen Code wieder verkürzen. (Jk, ich hoffe du bleibst unter Dennis!)
Kevin Cruijssen
@ KevinCruijssen Tada! Es ist jetzt niedriger als die Version mit Fehlerbehebung.
Undichte Nonne
5

MATLAB, 148 Bytes

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

Beachten Sie, dass die Leerzeichen in Octave fehlen, da MATLAB das mit indizierte Zeichen 0als Leerzeichen ausgibt, während Octave dieses Zeichen einfach weglässt.

Erläuterung:

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
Fehler
quelle
3

Haskell, 144 142 Bytes

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

Anwendungsbeispiel:

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

Wie es funktioniert:

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: Danke @Lynn für zwei Bytes!

nimi
quelle
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`

Wobei \nein wörtliches Newline-Zeichen darstellt. Erläuterung:

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

Um es zu verkürzen, pow(-1,ceil(sqrt(i)))schreibe ich es neu, da sqrt(i-1)&1||-1dies jedoch nicht funktioniert, um i=0zu beheben, dass ich 1 hinzufüge, aber dies kippt dann das Vorzeichen des Ergebnisses, weshalb ich am Ende mit ende n-=.

Neil
quelle
Hey, du hast ein goldenes Abzeichen! gute Arbeit! und heilig raucht du hast fast so viel rep wie ich. Lass es laufen!
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Das ist "nur" das Fanatic-Abzeichen. Anscheinend bin ich wirklich kurz davor, das goldene Code-Golf-Abzeichen zu bekommen!
Neil
doppelt heilig raucht. Ich muss XD bewegen
Conor O'Brien
1

Python 2, 137 Bytes

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]

Zeigen Sie die Ausgabe auf ideone an .

Lynn
quelle
Hm ... Es geht nicht weiter und weiter und weiter und weiter.
Zizouz212
@ Zizouz212 Tut es, ideone hat nur eine feste Ausgabe mit und bricht automatisch Zeilen, die zu lang sind.
Fehler