Crea un motivo a zigzag


25

Il tuo compito è quello di inserire un input intero e stampare uno schema a zigzag usando barre e barre rovesciate.

  • L'input intero determina la lunghezza di ogni zig e zag, nonché il numero di zig e zag
  • Il motivo inizia sempre da destra a sinistra

Casi test

4->
   /
  /
 /
/
\
 \
  \
   \
   /
  /
 /
/
\
 \
  \
   \
2->
 /
/
\
 \
0->
1->
/
8->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \

3
Possiamo produrre un array / elenco di stringhe per ogni riga? Sono consentiti l'addestramento o la guida di nuove linee o spazi?
Shaggy,

2
Lo spazio bianco iniziale va bene finché il modello non è interessato?
Emigna,

Risposte:


10

C (gcc) , 108 102 101 98 80 76 72 byte

  • Salvataggio di sei byte grazie a Kevin Cruijssen ; rimuovere parentesi e giocare N-n-1a golfN+~n
  • Salvato un byte spostando Zl'incremento nella condizione di loop
  • Salvati tre byte usando printf("%c\n",...)invece di putchar(...)e,puts("")
  • Diciotto (!) Byte salvati grazie a HatsuPointerKun ; usando printf("%*s",n,"");per stampare nspazi invece di usare un ciclo j;for(j=n;j--;)putchar(32);e combinando entrambe le printf(...);chiamate
  • Salvati quattro byte usando printf("%*c",-~n,...);invece diprintf("%*s%c",n,"",...);
  • Quattro byte salvati grazie a nwellnhof ; spostando tutto all'interno di un loop anziché due
j;f(k){for(j=0;j<k*k;j++)printf("%*c\n",j/k%2?j%k+1:k-j%k,j/k%2?92:47);}

Provalo online!


Z,n,j;f(N){for(Z=0;Z<N;Z++)for(n=N;n--;putchar(Z%2?92:47),puts(""))for(j=Z%2?N+~n:n;j--;)putchar(32);} 102 byte . Rimosse le parentesi graffe mettendo tutto all'interno dei cappi; e modificato N-n-1in N+~n.
Kevin Cruijssen,

1
@KevinCruijssen Grazie. Ho salvato un altro byte scambiando entrambi Z%2?...:...e sostituendoli Z<N;Z++con Z++<N;.
Jonathan Frech,

1
Puoi salvare diversi byte usando la magia di printf come ho fatto nella mia risposta . In questo modo eliminerai il ciclo for usato per stampare gli spazi. Per maggiori dettagli, vedi questa risposta di overflow dello stack sugli spazi di imbottitura a sinistra con printf
HatsuPointerKun

@HatsuPointerKun Grazie; questo è un modo molto breve per ripetere gli spazi in C.
Jonathan Frech,

4 byte corta: i;f(N){for(i=0;i<N*N;i++)printf("%*c\n",i/N%2?i%N+1:N-i%N,i/N%2?92:47);}. Provalo online!
nwellnhof,

10

Carbone , 16 10 9 byte

FN«↖Iθ→‖T

Provalo online! Il collegamento è alla versione dettagliata del codice.


funziona (era InputNumberrotto anche in modalità golfy?)
ASCII il

@ Solo ASCII No, quindi i collegamenti separati alla versione concisa data e alla versione dettagliata approssimativa.
Neil,

Oh> _> non ha cercato di vedere quale link stavo aprendo
solo ASCII il

@ Solo ASCII Bene, ora c'è un solo link ;-)
Neil,

4

MATL , 17 byte

:"GXy@o?P47}92]*c

Provalo online!

Spiegazione

:         % Implicit input, n. Push range [1 2 ... n]
"         % For each k in that range
  G       %   Push n again
  Xy      %   Identity matrix of that size
  @       %   Push k
  o?      %   If it's odd
    P     %     Flip the matrix upside down
    47    %     Push 47 (ASCII for '/')
  }       %   Else
    92    %     Push 92 (ASCII for '\')
  ]       %   End
  *       %   Multiply each entry of the matrix by that number
  c       %   Convert to char. Char 0 is shown as space
          % Implicit end. Implicit display

4

C # (.NET Core) , 117 103 101 byte

a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));}

Provalo online!


Puoi salvare 14 byte in questo modo: a=>{var o="";for(int z=a+1,e=0;e<a*a;)o+=(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++))+"\n";return o;} 103 byte Non hai bisogno di tutte quelle parentesi; puoi combinare il int; e aggiungi solo +"\n"una volta.
Kevin Cruijssen,

Oh caspita, grazie!
mio pronome è monicareinstate il

Hmm, puoi salvare altri 2 byte stampando direttamente, invece di restituire una stringa: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 byte
Kevin Cruijssen,

3

SOGL V0.12 , 13 12 9 byte

╝F{±↔}P}ø

Provalo qui!

potrebbe essere di 8 byte ╝F{±↔}P}se lo 0 test-case non fosse richiesto

Spiegazione:

       }   implicitly started loop repeated input times
╝            create a down-right diagonal of the input
 F           get the current looping index, 1-indexed
  {  }       that many times
   ±↔          reverse the diagonal horizontally
      P      print that
        ø  push an empty string - something to implicitly print if the loop wasn't executed


3

Mathematica, 84 90 byte

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • Grazie a Jenny_mathy per -6 byte.

Non ho idea del perché \sia ovviamente più scuro di /.

inserisci qui la descrizione dell'immagine


2
84 byte(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"/","\\"],""]&,{n^2,n}])&
J42161217

3

Jq 1,5 , 94 89 byte

["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add

Spiegazione

  ["/","\\"][range($n)%2] as $s                         # for $s= / \ / \ $n times 
| range($n)                                             # for .=0 to $n-1
| [(range(if $s=="/" then $n-.-1 else . end)|" "), $s]  # form list of spaces ending with $s
| add                                                   # concatenate

Esecuzione del campione

$ jq -Mnr --argjson n 5 '["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add'
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/

Provalo online!


3

Java 8, 140 134 116 byte

n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}

-24 byte grazie a @Nevay .

Spiegazione:

Provalo qui.

n->{                // Method with integer parameter and String return-type
  String r="";      //  Result-String
  for(int a=0,b,c;  //  Index integers
      a++<n;)       //  Loop (1) from 0 to the input (exclusive)
    for(b=n;        //   Reset `b` to the input
        b-->0;      //   Inner loop (2) from the input to 0 (exclusive)
                    //     After every iteration: 
        r+=a%2>0?"/\n":"\\\n") 
                    //      Append either of the slashes + a new-line
      for(c=b-n+b|-a%2;++c<b;r+=" ");
                    //    Append the correct amount of spaces
                    //   End of inner loop (2) (implicit / single-line body)
                    //  End of loop (1) (implicit / single-line body)
  return r;         //  Return the result-String
}                   // End of method

1
La condizione del ciclo più interno può essere scritta come c-->f*(b-n-~b)(-6 byte).
Nevay,

1
116 byte:n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}
Nevay,

3

Javascript ES8, 83 79 78 76 75 74 71 byte

* ridotto 1 byte con ES8 grazie a Shaggy

A=(m,i=0)=>i<m*m?`/\\`[x=i/m&1].padStart(x?i%m+1:m-i%m)+`
`+A(m,++i):""

Prova qui


chiunque abbia declassato la mia soluzione, potresti spiegare perché? Mi sto perdendo qualcosa?
DanielIndie,

2
Non sono io che ho effettuato il downgrade, ma suppongo che sia perché le funzioni devono essere ripetibili per essere valide. Il tuo potrebbe essere risolto abbastanza facilmente creando iun parametro predefinito. Anche il conteggio dei byte sembra spento.
Emigna,

1
Anche l'aggiunta di un collegamento TIO è sempre apprezzata, in modo che le persone possano facilmente testare la soluzione.
Emigna,

1
@Emigna risolto (saggio e Link saggio :) :)
DanielIndie,

1
74 byte con alcuni ES8. Inoltre, per JS puoi semplicemente utilizzare uno snippet di stack anziché TIO.
Shaggy,


2

PowerShell , 81 byte

param($a)if($a){1..$a|%{((1..$a|%{" "*--$_+'\'}),($a..1|%{" "*--$_+'/'}))[$_%2]}}

Provalo online!

Questo è brutto. Tanto codice ripetuto, più 7 byte richiesti per tenere conto di 0casi speciali. Suggerimenti di golf benvenuti.


2

Pyth, 17 byte

js<*_+RV"\/"_B*L;

Provalo online: dimostrazione

Spiegazione:

js<*_+RV"\/"_B*L;QQQ   implicit Qs at the end
              *L;Q     list with ["", " ", "  ", ..., " "*(input-1)]
            _B         bifurcate with reverse: [["" to "   "], ["   " to ""]]
     +RV"\/"           append to each one either "\" or "/": 
                       [["\", to "   \"], ["   /" to "/"]]
    _                  reverse
   *              Q    repeat input times
  <                Q   but only take the first input many
 s                     flatten the list of lists
j                      print on each line

2

Python 3: 90 byte 82 byte

lambda n:"\n".join(" "*(abs(i%(n*2)-n+i//n%2)-1)+"/\\"[i//n%2]for i in range(n*n))

Grazie a @Jonathan Frech per aver sottolineato che la stampa non era necessaria e che il primo zig era nel modo sbagliato


] for-> ]for.
Jonathan Frech,

Non è necessario il print(...), una funzione che restituisce una stringa sarebbe valida. Inoltre, penso che il tuo zig iniziale sia orientato nel modo sbagliato (\ piuttosto che /).
Jonathan Frech,

@JonathanFrech Grazie! L'ho cambiato
Bassintag il

1
(abs(...)-1)-> ~-abs(...).
Jonathan Frech,

2

05AB1E , 17 16 byte

F<„/\Nèú.sNƒR}»,

Provalo online!

Spiegazione

F                  # for N in [0 ... input-1] do
  „/\              # push the string "/\"
     Nè            # cyclically index into this string with N
 <     ú           # prepend input-1 spaces to this string
        .s         # get suffixes
          NƒR}     # reverse the list of suffixes input+1 times
              »,   # join on newline and print

Miglior tentativo corrente utilizzando canvas:

F„/\Nè©53NèΛ2®ð«4Λ


2

Java (OpenJDK 8) , 131 106 98 96 94 91 91 byte

i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i:j%i+1)+"c\n",47+45*(j++/i%2)));}

Provalo online!


1
È possibile rimuovere alcune parentesi: i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i+1:j%i+2)+"s",j++/i%2<1?"/\n":"\\\n"));}(98 byte).
Nevay,

2

Dyalog APL , 39 36 35 34 byte

{↑((,⍵ ⍵⍴(⌽,⊢)⍳⍵)/¨' '),¨⍵/⍵⍴'/\'}

Provalo online!

1 byte salvato grazie a Zacharý


Cavolo, battimi di un byte. È possibile effettuare ⎕IOsia 0, e quindi rimuovere ¯1+.
Zacharý,

@ Zacharý Stavo per farlo: p
dzaima,

Oh, un'altra cosa: (⌽,⊢)⍳⍵invece di(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Sì, devo ancora capire i chiodini, i testimoni e le cose che ne derivano: /
dzaima

Non preoccuparti, non capisco perfettamente come funzionano i treni / le forche / come si chiamano.
Zacharý,



1

Excel VBA, 84 83 byte

Funzione di finestra immediata VBE anonima che accetta input dalla gamma [A1]e output alla finestra immediata VBE

For i=1To[A1]:For j=1To[A1]:?IIf(i mod 2,Space([A1]-j)&"/",Space(j-1)&"\"):Next j,i


0

Haskell , 86 85 byte

f n=take(n*n)$cycle$[(' '<$[x..n-1])++"/"|x<-[1..n]]++[(' '<$[2..x])++"\\"|x<-[1..n]]

Provalo online!

Salvato un byte grazie a Laikoni

Ripeti uno zig ++ uno zag e prendi le prime n*nrighe.


cycle$ ...invece di cycle( ... )salvare un byte.
Laikoni,

@Laikoni grazie!
jferard,


0

Dyalog APL, 41 40 byte

⎕IOdeve essere 0.

{⍪/((⌽⍵ ⍵⍴S↑'/')(⍵ ⍵⍴'\'↑⍨S←⍵+1))[2|⍳⍵]}

Provalo online!


0

D , 105 byte

import std.stdio;void m(T)(T n){for(T i,j;i<n;++i)for(j=0;j<n;++j)printf("%*c\n",i%2?j+1:n-j,i%2?92:47);}

Provalo online!

Tratto dalla risposta C ++ di HatsuPointerKun.

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.