Zikzak deseni yapın


25

Göreviniz bir tamsayı girişi almak ve eğik çizgi ve ters eğik çizgi kullanarak bir zikzak deseni yazdırmaktır.

  • Tamsayı girişi, her zig ve zag uzunluğunun yanı sıra zig ve zag sayısını belirler.
  • Desen her zaman sağdan sola doğru başlar

Test Kılıfları

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

3
Her satır için bir dizi / dizi listesi çıktısı alabilir miyiz? Eğitime veya yeni liderlere veya alanlara izin veriliyor mu?
Shaggy

2
Desen etkilenmediği sürece öndeki beyaz boşluk tamam mı?
Emigna

Yanıtlar:


10

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

  • Kevin Cruijssen sayesinde altı bayt kurtarıldı ; Parantez kaldırılması ve golf N-n-1içinN+~n
  • Artışını Zdöngü koşuluna getirerek bir bayt kaydedildi
  • Kullanarak üç bayt Kaydedilen printf("%c\n",...)yerine putchar(...)ve,puts("")
  • HatsuPointerKun sayesinde on sekiz (!) Bayt kaydedildi ; kullanılarak printf("%*s",n,"");baskı için nboşluklar yerine bir döngü kullanarak j;for(j=n;j--;)putchar(32);hem ve birleştirme printf(...);çağrı
  • Kullanarak dört bayt Kaydedilen printf("%*c",-~n,...);yerineprintf("%*s%c",n,"",...);
  • Nwellnhof sayesinde dört bayt kurtardı ; her şeyi iki yerine bir döngü içinde taşımak
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);}

Çevrimiçi deneyin!


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 bayt . Kıvrımlı parantezleri her şeyi ilmeklerin içine sokarak çıkartın; ve değiştirilmesi N-n-1için N+~n.
Kevin Cruijssen,

1
@KevinCruijssen Teşekkürler. Her iki değiştirerek başka byte Kaydedilen Z%2?...:...ve değiştirilmesi Z<N;Z++ile Z++<N;.
Jonathan Frech

1
I yaptığımız gibi Sen printf büyü kullanarak birkaç bayt kaydedebilirsiniz Cevabıma . Bu şekilde, alanları yazdırmak için kullanılan for döngüsünden kurtulacaksınız. Daha fazla ayrıntı için, printf ile sol doldurma boşlukları hakkındaki bu yığın taşması cevabını görün
HatsuPointerKun

@HatsuPointerKun Teşekkürler; Bu, C'deki boşlukları tekrarlamanın çok kısa bir yoludur
Jonathan Frech

4 kısa bayt: 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);}. Çevrimiçi deneyin!
nwellnhof

10

Kömür , 16 10 9 bayt

FN«↖Iθ→‖T

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur.


bu işeInputNumber yarar ( Golfy modda da kırıldı mı?)
ASCII-sadece

@ Yalnızca ASCII Hayır, bu nedenle verilen kısa ve yaklaşık ayrıntılı versiyona ayrı bağlantılar.
Neil

Oh> _> hangi bağlantıyı
ASCII-

@ ASCII-only Eh, şimdi sadece bir link var ;-)
Neil

4

MATL , 17 bayt

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

Çevrimiçi deneyin!

açıklama

:         % 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 bayt

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

Çevrimiçi deneyin!


14 baytı bu şekilde kaydedebilirsiniz: 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 bayt Tüm bu parantezlere ihtiyacınız yok; birleştirebilirsiniz int; ve sadece bir +"\n"kez ekleyin .
Kevin Cruijssen

Vay canına, teşekkürler!
zamirim monicareinstate

Hmm, doğrudan baskı, yerine bir dize döndürerek 2 daha bayt kaydedebilirsiniz: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 bayt
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 bayt

╝F{±↔}P}ø

Burada dene!

╝F{±↔}P}0 test durumu gerekli değilse 8 bayt olabilir

Açıklama:

       }   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 bayt

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • -6 bayt için Jenny_mathy teşekkür ederiz.

Neden \açıkça daha karanlık olduğu hakkında hiçbir fikrim yok /.

görüntü tanımını buraya girin


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 bayt

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

açıklama

  ["/","\\"][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

Örnek çalışma

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

Çevrimiçi deneyin!


3

Java 8, 140 134 116 bayt

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 sayesinde -24 bayt .

Açıklama:

Burada dene.

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
En içteki döngünün durumu c-->f*(b-n-~b)(-6 bayt) olarak yazılabilir .
Nevay

1
116 bayt: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 bayt

* Shaggy sayesinde ES8 ile 1 bayt azaltıldı

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

Burada test et


Çözümümü kim düşürdü, nedenini açıklayabilir misiniz? Bir şey mi eksik?
DanielIndie

2
Oy vermeyen kişi ben değilim, ancak fonksiyonların geçerli olması için tekrarlanabilir olması gerektiğine inanıyorum. iVarsayılan parametre yaparak kolayca düzeltilebilir . Bayt sayısı da kapalı görünüyor.
Emigna

1
Bir TIO bağlantısı eklemek de her zaman takdir edilir, böylece insanlar çözümünüzü kolayca test edebilir.
Emigna

1
@Emigna düzeltti (char bilge ve Link bilge) :)
DanielIndie

1
Bazı ES8 ile 74 bayt . Ayrıca, JS için sadece TIO yerine bir Stack Snippet kullanabilirsiniz.
Shaggy


2

PowerShell , 81 bayt

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

Çevrimiçi deneyin!

Ugh, bu çirkin. Çok fazla tekrarlanan kod, artı 0özel durum için hesap için gerekli 7 bayt . Golf önerileri kabul edilir.


2

Pyth, 17 bayt

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

Çevrimiçi deneyin: Gösteri

Açıklama:

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 Bayt 82 Bayt

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

@Jonathan Frech'e, baskının gerekmediğini ve ilk zig'in yanlış olduğunu belirttiği için teşekkürler


] for-> ]for.
Jonathan Frech

İhtiyacınız yok print(...), bir string döndüren bir fonksiyon geçerli olacaktır. Ayrıca, ilk zig'iniz yanlış yöne yönlendirildi (\ yerine /).
Jonathan Frech

@JonathanFrech Teşekkürler! Değiştirdim
Bassintag

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

2

05AB1E , 17 16 bayt

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

Çevrimiçi deneyin!

açıklama

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

Tuvali kullanarak şu anki en iyi girişim:

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


2

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

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

Çevrimiçi deneyin!


1
Çok az parantez kaldırabilirsiniz: 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 bayt).
Nevay

2

Dyalog APL , 39 36 35 34 bayt

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

Çevrimiçi deneyin!

Zacharý sayesinde 1 bayt kurtarıldı


Tehdit et, beni bir bayt yen. Sen yapabilir ⎕IOolması 0ve ardından kaldırmak ¯1+.
Zacharý

@ Zacharý Ben sadece bunu yapmak
üzereydim

Oh, bir şey daha: (⌽,⊢)⍳⍵yerine(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Evet, henüz onunla gelen dokunma, yapışkanlık ve diğer şeyleri anlayamadım: /
dzaima

Endişelenme, tam olarak nasıl tren / çatal / ne denir denildiğini anlamıyorum.
Zacharý



1

Excel VBA, 84 83 Bayt

Menzilden giriş alan [A1]ve VBE giriş penceresine çıkış yapan anonim VBE giriş penceresi işlevi

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 bayt

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

Çevrimiçi deneyin!

Laikoni sayesinde bir bayt kurtarıldı

Bir zig ++ a zag'yi tekrarlayın ve ilk n*nsatırları alın.


cycle$ ...cycle( ... )Bir bayt yerine kaydeder.
Laikoni,

@Likonik teşekkürler!
17:31



0

D , 105 bayt

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

Çevrimiçi deneyin!

HatsuPointerKun'un C ++ cevabından kaldırdı.

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.