Kodlara Giden Yol (Kolay)


30

Giriş:

  • olması garanti edilen bir tamsayı .n3
  • biri olan bir tamsayı .d[1,0,1]

Çıktı:

ise kuzeybatı yönünde olacak boyutunda bir yol ; ise kuzey yönü ; veya ise kuzey doğu yönü . Yol her zaman üç boşluk olacak (veya dış sınırları da dahil edersek genel olarak beş) olacak. Ek olarak, alt kısımda bir yol ayırma çizgisi olacaktır ve bundan sonra yukarı doğru ilerlerken dönüşümlü olarak olacaktır.nd=1d=0d=1

Bazı örnekler:

Giriş: Çıkış:n=7,d=1

      / / /
     /   /
    / / /
   /   /
  / / /
 /   /
/ / /

Giriş: Çıkış:n=4,d=1

\   \
 \ \ \
  \   \
   \ \ \

Meydan okuma kuralları:

  • Ekranda herhangi bir yere gerekli yolu yazdırdığı sürece, her türlü satır aralığı / / veya yeni satır kabul edilebilir.
  • Seçenekler yerine, bunun yerine veya seçeneklerini kullanmanıza izin verilir . Ayrıca, üç seçenek haritasından hangisinin üç yönden hangisinin olacağını seçebilirsiniz. ( Bu meydan okuma tanımında kullanılanlar için sırasıyla den farklıysa hangi seçenekleri kullandığınızdan emin olun !)[1,0,1][0,1,2][1,2,3][1,0,1][north-west, north, north-east]
  • Herhangi bir makul çıktı biçimi kabul edilebilir. Tabii ki en yaygın olanı STDOUT'a yazdırmaktır, ancak dizge veya 2D karakter listesi olarak döndürmek de iyidir.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

Yukarıdaki iki örnek ve:

Giriş: Çıkış:n=10,d=0

|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |

3
Alternatif başlık: "Mad Max Code Warrior"
akozi

1
İlk örnek yanlış değil mi? Her sıradaki satır yerine her tek satırda bir orta şeride sahiptir
moonheart08 17

2
@ moonheart08 Hayır. Altta, girişin tek veya çift olmasına rağmen her zaman bir yol ayırma çizgisi olacaktır. Bundan sonra yukarı doğru giderken değişiyor. Metni biraz umutla daha net hale getirmek için değiştirdim.
Kevin Cruijssen

Oh, öyleyse yanılıyorum. Peki. Aydınlattığın için teşekkürler.
moonheart08

Yanıtlar:


2

Tuval , 23 22 bayt

B}⁴H‟m↶⁷?/|∙/╋]\|∙\╋]}

Burada dene!

0, 1 ve 2 yön girişlerini kullanır.

Açıklama:

...‟    push "--¶¶- ¶¶--"
    m   mold the horizontal length to the 1st input - a horizontal road
     ↶  rotate counter-clockwise - so the separator is on the bottom
        also replaces the dashes with bars

⁷?     ]     ]}  switch over the 2nd input:
                 default case (input 2):
  /                pad with spaces to a "/" diagonal
   |∙/╋            replace "|" with "/"
                 case 0:
        \          pad with spaces to a "\" diagonal
         |∙\╋      replace "|" with ""

case 1 is empty, but because of a bug, the trailing "}" is still required

Bir açıklama ekler misiniz? :)
Kevin Cruijssen

1
@KevinCruijssen eklendi.
dzaima

16

Python 2 , 79 78 73 72 bayt

n,d=input()
c='|\/'[d]
i=n
while i:print' '*(n-i*d)+c,i%2*c or' ',c;i-=1

Çevrimiçi deneyin!

Alır [1,0,-1]için[north-west, north, north-east]

-1 bayt, Neil sayesinde


3
Tanrım, Kotlin'de Python benzeri dilimleme için vermeyeceğim şey
Adam

i%2*c or' 'bir bayt kaydeder.
Neil

7

Python 2 , 66 bayt

n,d=input()
s=' '+'|\/'[d]
for c in(s*n)[n:]:print' '*n+s,c+s;n+=d

Çevrimiçi deneyin!

Kullanımları d=-1NE için d=0N için ve d=1NW için. İzin verilen öncü alanlardan yararlanır. Yolun alt bölümünün bir ayırıcıya sahip olması kuralı , paritenin doğru olmasını sağlamayı zorlaştırdı; boşluk ve yol karakteri arasındaki değişimlerin (s*n)[n:]ikinci yarısını alan dilimleme ile elde edilir 2n.


6

1. Python 3.5, 122 120 bayt

Senaryo iki paragraf alır: n, d.

d: 0, 1, 2 -> \ | /

tio.run

import sys;(n,d)=[*map(int,sys.argv[1:3])];c="\\|/"[d]
for i in range(n):j=n+~i;print(" "*(i,0,j)[d],c,c*(j%2<1)or" ",c)

çıktı:

$ ./script.py 6 2
      /   /
     / / /
    /   /
   / / /
  /   /
 / / /
$ ./script.py 6 1
 |   |
 | | |
 |   |
 | | |
 |   |
 | | |
$ ./script.py 6 0
 \   \
  \ \ \
   \   \
    \ \ \
     \   \
      \ \ \

açıklama

# parse input params
(n,d)=[*map(int,sys.argv[1:3])]

# select char for "road"
c="\\|/"[d]

# loop n-times
for i in range(n):

    # complement (how many lines to end)
    j=n+~i

    # print
    #   space i or 0 or j times
    #   road, center of road if j is even else space, road
    print(" "*(i,0,j)[d], c, c*(j%2<1) or " ", c)

edit: -2 byte Kevin Cruijssen sayesinde


3
Güzel cevap! :) Golf için iki küçük şey: n-1-iolabilir n+~i( ilgili ipucu ) ve j%2==0olabilir j%2<1. Henüz onları görmedim varsa, Python golf için ipuçları ve içinde golf için ipuçları <tüm diller> kudreti hem okumak ilginç olabilir.
Kevin Cruijssen

1
Teşekkür ederim :) Bunu n+~ihenüz görmedim , fakat yardımcı görünüyor. Ayrıca kod vurgusu için teşekkürler.
Rene

Rica ederim! Konaklamanızın tadını çıkarın ve birçok cevaba cevap verin. :) Oh ve iyi hafta sonları.
Kevin Cruijssen

j%2*" "or cbir kaç bayt daha kaydeder.
Neil,

5

PowerShell , 88 82 80 74 71 bayt


-Mazzy sayesinde -8 bayt , AdmBorkBork sayesinde -6 bayt ve AdmBorkBork sayesinde -Mazzy
-3 bayt sayesinde

param($n,$d)$n..1|%{' '*($_,($n-$_))[$d]+($y='/\|'[$d])," $y"[$_%2],$y}

Çevrimiçi deneyin!

NW, NE, N için [0,1,2] kullanır d. İlk önce boşluk bırakma yöntemini almak için iki kez liste dizini olarak kullanır (0 değerini döndüren 2 kullanılırken listeden çıkarılır) ve sonra çizgileri çizerken kullanılacak karakter. Yolu oluşturan boşluk dizesine bir liste ekler (bunlar, eklendiğinde üyeler arasında boşluklar vardır). Ayrıca, modulo matematiğine dayalı açık bir şerit veya kısa çizgi arasında geçiş yapar.


1
[NW, NE, N] için [0,1,2] kullanırsa 80 bayt
mazzy

1
@mazzy Smart. Kasıtlı olarak listeden düşmeyi tamamen unuttum.
Veskah

1
AdmBorkBork'tan array.toString ile harika bir fikir! Teşekkürler. 74 bayt
mazzy

3
Orta kısmı, bir diziden çok bir dizgeye indeksleyerek 71 bayt .
AdmBorkBork


5

Kömür , 33 29 23 bayt

↷NNη⊘⊕ηUE¹¦¹F⟦²±²⟧«Jι⁰η

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Şimdi tüm temel kömür hatalarının giderildiği görülüyor ve optimal kodun reklamını yapabiliyorum. Açıklama:

↶N

İlk girişe göre imleç yönünü saat yönünün tersine çevirin, böylece 1 kuzey doğu, 2 kuzey ve 3 kuzey batı olur.

Nη

Yolun uzunluğunu giriniz.

⊘⊕ηUE¹¦¹

Yol uzunluğunun yarısını yazdırın ve ardından yol ayırıcıyı vererek gerin.

F⟦²±²⟧«Jι⁰η

Yolun kenarlarını yazdırın.

@KevinCruijssen, daha sonra silinmiş olan bu sorunun daha zor bir versiyonunu sundu, ancak yeterince cevap sahibi kullanıcılar, onu burada görebilir: Kod Zor (Zor) Yolu Bu cevapta kullandığım germe hilesi bu soru için geçerli değil aşağıdaki 47 45 baytlık programı yazdı :

F³«J×ι⊘⊕θ⁰≔…⟦¹ ⟧⊕﹪ι²ιFη«↶§κ⁰F⊖§κ¹§ιⅉP§ιⅉ↑↷§κ⁰

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

F³«

Kenarlar ve ayırıcı üzerinde döngü.

J×ι⊘⊕θ⁰

Yanın başlangıcına atla.

≔…⟦¹ ⟧⊕﹪ι²ι

A 1ve boşluk içeren bir dizi yapın , ancak ayırıcı yerine tarafları çizersek alanı tekrar kaldırın.

Fη«

Her yol bölümünün üzerinde döngü.

↶§κ⁰

İmleç yönünü uygun şekilde çevirin.

F⊖§κ¹

Yol bölümünün uzunluğundan az birinden fazla döngü ...

§ιⅉ

... ve dizinin alternatif öğelerini yazdırın. Değişim, imlecin Y koordinatı ile diziye periyodik olarak indeksleme ile sağlanır.

P§ιⅉ

Bu yol bölümünün son satırını yazdır, ancak imleci hareket ettirmeden ...

... böylece imleç bir sonraki bölüm için hazır duruma getirilebilir.

↷§κ⁰

İmleç yönünü bir sonraki bölüm için hazır duruma getirin.


4

Kotlin , 96 92 bayt

{n,d->val c="\\|/"[d];(0..n-1).map{println(" ".repeat(n-it*(d-1))+ "$c ${" $c"[it%2]} $c")}}

[-1, 0, 1] yerine [0, 1, 2] kabul eder

Diğer dillerdeki çözümlere benzer şekilde çalışır, ancak ne yazık ki Kotlin bu konuda pek parlamadı.

val c=“\\|/“; Kotlin'in karakter dizilerini karakter dizisi gibi ele almasından (olması gerektiği gibi, Java'ya bakması) avantajlarından faydalanarak yol yapımında kullanılacak kömürü alır.

Çevrimiçi deneyin!


Merhaba, PPCG'ye hoş geldiniz! Çıktınızda küçük bir sorun var. Yolun ortasındaki değişen çizgiler, üst kısımlar yerine çift girişler için alttan bir satır ile başlamalıdır. Sen için çıkış karşılaştırabilirsiniz 4benim örnekle 4ne demek farkı görmek. Seni o kadar iyi KOTLIN bilmiyorum ama değiştirerek (ve 4 byte aynı anda golf) çözebilir düşünüyorum [(it+1)%2]için [it%2]. :) Bunun dışında güzel bir cevap, benden +1.
Kevin Cruijssen

Müthiş, karşılama ve yardım için çok teşekkürler! Bunu değiştireceğim
Adam

4

TSQL kodu, 171 117 bayt

Bunun kod olarak daha kısa yazılabileceğini anladım.

DECLARE @n INT=7,@d INT=0

,@ INT=0a:PRINT
space(@n-@*@d)+stuff(replicate(substring('\|/',@d+2,1)+' ',3),3,@%2,space(@%2))SET
@+=1IF @n>@ GOTO a

TSQL sorgusu, 137 bayt

USE master
DECLARE @n INT=6,@ INT=-1

SELECT space(@n-y*@)+z+iif(y%2=1,z,'  ')+z 
FROM(SELECT top(@n)row_number()over(order
by @)y,' '+substring('\|/',@+2,1)z FROM spt_values)x

Eğer veritabanınız master ise, USE master gerekli değildir. Ancak bazı kullanıcılar farklı bir varsayılan veritabanına sahiptir.

Senaryo ne zaman dışarı çalışırken biraz farklıdır. Ascii-32 alanını ascii-160 ile değiştirmek zorunda kaldım, boşluklar gösterilmedi.

Denemek

Biraz tweaks yaptım ve değiştirebileceğimi fark ettim.

1/0 sipariş

ile

tarafından sipariş @


2
order by 1/0Sıfır hatayla nasıl bir ayrılmaya neden olmaz?
HoneyBadger

because 1/0 is not being calculated. where exists(select 1/0) will have the same effect
t-clausen.dk

Moved my question to StackOverflow
HoneyBadger

3

JavaScript (ES8),  90 87  85 bytes

Takes input as (direction)(length). Expects 0 for North-West, 1 for North or 2 for North-East.

d=>g=(n,w=n)=>n?(c='/|\\'[d]).padStart([n--,,w-n][d])+` ${n&1?' ':c} ${c}
`+g(n,w):''

Try it online!


JavaScript (ES6), 90 bytes

This one draws the output character by character with a little more maths instead of the .padStart() method.

Takes input as (direction)(length). Expects 1 for North-West, 2 for North or 3 for North-East.

d=>n=>(g=x=>y?` /|\\
`[x+5?17+y%2*4>>--x+5-[,n+1-y,n,y][d]&1&&d:(x=n,y--,4)]+g(x):'')(y=n)

Try it online!


3

Jelly,  31  30 bytes

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ

A dyadic Link accepting the length on the left and the negated-direction* on the right which yields a 2d array of characters.
* [north-west, north, north-east]=[1, 0, -1]

Try it online! (footer calls the Link, joins with newline characters and prints the result)

How?

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ - Link: integer, L; integer, D
⁶                              - space character
 ẋ                             - repeat L times
     }                         - using the right argument (D):
    Ḃ                          -   mod 2 (0 if D = 0, 1 otherwise ...A would work too)
   Ƥ                           - for each prefix (of the list of spaces):
  ẋ                            -   repeat (D mod 2 times)
                  }            - using the right argument (D):
                 Ɗ             -   last three links as a monad:
        ị“\/|”                 -     index into "\/|" (1-indexed & modular)
              ẋ3               -     repeat three times - e.g. "\\\"
                K              -     join with spaces          "\ \ \"
      ;€                       - concatenate €ach (altered prefix with that list)
                     ¡         - repeat action...
                    ⁹          - ...number of times: right argument (-1 repeats 0 times)
                   Ṛ           - ...action: reverse (i.e. reverse if north-west)
                           Ðe  - for even indexes:
                         ¦€    -   sparse application for €ach...
                       -2      -   ...to indices: [-2] (the middle of the road)
                      ⁶        -   ...action: a space character
                             Ṛ - reverse

2

Python 2, 127 bytes

n,d=input()
c='|/\\'[d]
for i in range(n):t=0if d==0else(i if d<0else n-i);print(' '*t+'{} {} {}'.format(c,' 'if i%2==0else c,c))

Try it online!

First two lines taken from @TFeld.


1
Hi there, welcome to PPCG! I'm afraid submissions will have to be either a function taking parameters, or a full program taking arguments or input from STDIN. Snippets like you're using right now aren't allowed I'm afraid. You could add a leading D,N=input() (and use Python 2 instead of 3) to fix this. Or you could change it to a lambda function taking these two parameters.
Kevin Cruijssen

1
Nice solution. Got it to 122 using " ".join(..) rather ran .format
akozi

1
i%2*c or' ' saves a few more bytes, although I did notice that the separator is wrong for odd length roads.
Neil

2

Python 2, 93 bytes

n,d=input();p=''
while n:g='|/\\'[d];n-=1;print['',' '*n,p][d]+g+' %s '%(g,' ')[n%2]+g;p+=' '

Try it online!


Changing +' %s '+ to ,'%s', saves 2 bytes
TFeld

@TFeld In that case you might as well remove the '%s'% completely.
Neil

2

J, 64 bytes

' \|/'{~(_2&|*[:i.[*1 _1{~3=])|."_1((5+[){."1(5,~[)|.@$]*#:@689)

Try it online!

  • 1 North-West
  • 2 North
  • 3 North-East

Will try to golf it later



1

Red, 157 bytes

func[s d][p: pick"\|/"d set[a b]reduce pick[[4 1]0[5 + s -1]]d 
repeat n s[print pad/left form reduce pick[[p" "p][p p p]]odd?(n + pick[1 0]odd? s)a: a + b]]

Try it online!

  • 1 North-West
  • 2 North
  • 3 North-East


1

Swift 4.2, 112 108 bytes

-4 bytes thanks to Sriotchilism O'Zaic

let c=["\\","|","/"][d];(0..<n).map{print((0..<n-$0*(d-1)).map{_ in" "}.joined()+c+" \($0%2==0 ?c:" ") "+c)}

[0,1,2] instead of [-1,0,1].

Try it online!

Explanation

let c=["\\","|","/"][d]

Determines the street sign to use. (I bet this can be shortened somehow)

(0..<n).map{

Iterates over the length of the street.

(0..<n-$0*(d-1)).map{_ in" "}.joined()

Adds the spaces in front of the street.

\($0%2==0 ?c:" ")"

Adds the middle sign to every other line.

My very first one ☝️, I'm happy about any optimization advices. Learned mostly from that thread: Tips for golfing in Swift.


1
Welcome to the site! It seems like you forgot to remove the space in between in and " " in your code even though you have removed it in your examples.
Wheat Wizard

1
I don't know swift but it looks like for your interpolations on the ends of the strings (\(c) in both cases). You would save bytes by just concatenating the c to the string. Try it online!
Wheat Wizard

1
Thanks, you are right! saved us 3 bytes 🚀
palme

1

Perl 6, 66 bytes

->\n,\d{{(' 'x--$ *d%-+^n~(' ',<\ | />[d+1])[1,(n+$++)%2,1])xx n}}

Try it online!

Returns a list of lines.

Explanation

->\n,\d{                                                         }  # Block taking n, d
        {                                                       }   # Reset $ variables
         (                                                 )xx n    # Repeat n times
          ' 'x  # Space times
              --$ *d  # (-1,-2,-3,...) if d=1
                      # (0,0,0,...) if d=0
                      # (1,2,3,...) if d=-1
                    %-+^n  # modulo -~n = n+1
                         ~  # Concat
                          (' ',<\ | />[d+1])  # Space or line
                                            [1,(n+$++)%2,1]  # Alternate middle char

1

Ruby, 90 bytes

n,a=*$*.map{|i|-i.to_i}
c='|\/'[a]
n.upto(-1){|i|puts' '*(i*a-n)+c+' '+[' ',c][i%2]+' '+c}

Try it online!

UPDATE: Thank you, Kevin, for pointing out that my original submission was missing spaces between the road edges and markers (i.e., 3-width roads instead of 5-width.) That said, there might be a shorter fix for that than c+' '+...+' '+c.

Directional information: -1, 0, 1 maps to { north-west, north, north-east }

Arguments: this reads command-line arguments such as 4 -1 (a four row road, slanted to the north-west).

Additional note: This was tested locally with Ruby v2.6.1, and it appears that Try It Online uses Ruby v2.5.3. I have no reason to think it would not work with all other Ruby versions.


Hi there, welcome to PPCG! The directions and altering roads are correct in your output, so well done. There is just one minor error in the current output: the road should be three spaces wide instead of 1. Currently your road is ||| or |<sp>|, but it should be |<sp>|<sp>| or |<sp><sp><sp>| (where <sp> is a space). I don't know Ruby, but It seems you can solve it by changing c+[' ',c][i%2]+c to c+' '+[' ',c][i%2]+' '+c. :)
Kevin Cruijssen

Ah good catch! Thanks for pointing that out, @KevinCruijssen.
Spencer D


1

Japt -R, 40 bytes

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw

Try it online!

Explanation:

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw
                                            // U = road size
                                            // V = direction
Æ                                     Ã     // Loop X through [0...U]
 =        ;                                 //   Set U to:
    "|\\/"                                  //       "|\/"
  Vg                                        //            [V]
           ²                                //  Double U
            i1          )                   //  Insert at index 1:
              S+                            //    " " +
                 X%2?S:U                    //         X%2?" ":U
                i                           //                  + " "
                         i                  //  Insert at index 0:
                          Sp                //    " " repeated this many times:
                            [TZÊ-YY]        //      [0,U.length - X,X]
                                    gV      //                        [V]
                                        w   // Reverse output

There seems to be a minor mistake in the output. Currently the road separator for even inputs starts at the top instead of the bottom. Everything else looks ok, so I hope it's not too hard of a fix.
Kevin Cruijssen

@KevinCruijssen Ah, thanks for catching that. Before I update my answer, can you confirm that this solution is okay?
Oliver

Yep, that looks completely correct. :)
Kevin Cruijssen

1
@KevinCruijssen Added an explanation since I know you like those :P
Oliver

Thanks, appreciated. :) I indeed always like to have explanation for golfing languages. I sometimes already have trouble understanding the JavaScript answers, let alone the golfed language of JS. ;)
Kevin Cruijssen

1

Stax, 23 bytes

ù╒←∩♂2Ωⁿ¡├∩22♀Ç○=÷â╧δÖ↑

Run and debug it

Input is two integers separated by a space.
The first is d. -1 specifies north-east. 0 for north. 1 for north-west. The second parameter is n. These two values will get implicitly parsed from input and placed on the input stack with n on top. Additionally d will be accessible from the stax's x register since it's the first implicitly parsed value.

For example, input "1 7"

            Main stack      Explanation
            ----------      -----------
;           [7]             peek from input stack
m                           map over integers [1..n] using the rest of the program
                            output each produced value implicitly
  ;         [1 7]           peek from input stack
  +         [8]             add
  .*"       [8 [42 34]]     2 character string literal with codepoints 42 and 34
  @         [42]            get the element at the specified modular index (8)
  0         [42 0]          literal zero
  "|\/"x@   [42 0 92]       get codepoint from string literal at input d (from x register)
  \         [42 [0 92]]     make pair
  :B        ['\ \ \ ']      encode in custom base; it's binary with custom codepoints
  _x*       ['\ \ \ ' 1]    (loop variable) * (input d)
  ;^        ['\ \ \ ' 1 8]  peek from input stack and increment
  %         ['\ \ \ ' 1]    modulus
  6+        ['\ \ \ ' 7]    add 6
  )         [' \ \ \ ']     left-pad to length

Run this one


Would you mind adding an explanation? :)
Kevin Cruijssen

1
@KevinCruijssen: Not at all.
recursive

0

perl -M5.010 -Mfeature=signatures, 97 bytes

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
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.