Bir merdiven çizin ve kaydırın


24

Göreviniz, girdi olarak, n1 ile 25 (dahil) arasında doğal bir sayı ( ) alan ve basamaklarla birlikte bir slaydın ve merdivenin izometrik bir gösterimini basan bir program veya işlev oluşturmaktır n.

Merdiven ve slayt özellikleri

Merdiven her zaman sola ve sağa doğru kaydırılır. Onu merdiven tarafından görüntülüyoruz, yani slaydın bir kısmı üst üç seviyede gizlenmiş durumda. Basamaklar, dört çizgi ( ----) ve merdivenin kenarları ve eğik çizgiler ( /ve \) ile kaydırılır . Aşağıdaki, beş basamaklı bir slayt için gerekli boşluk modellerini temsil eden bir şemadır.

Slide              Blank space count
    /----/\        1234/----/\ 
   /----/  \       123/----/12\ 
  /----/    \      12/----/1234\ 
 /----/ \    \     1/----/1\1234\ 
/----/   \    \    /----/123\1234\

Örnekler

>>1
/----/\

>>3
  /----/\ 
 /----/  \ 
/----/    \ 

>>4
   /----/\ 
  /----/  \ 
 /----/    \ 
/----/ \    \ 

>>10
         /----/\ 
        /----/  \ 
       /----/    \ 
      /----/ \    \ 
     /----/   \    \ 
    /----/     \    \ 
   /----/       \    \ 
  /----/         \    \ 
 /----/           \    \ 
/----/             \    \ 

Bu kod-golf, bu yüzden en düşük bayt sayısı ile cevap kazanır.

Not: İzinde beyaz boşluk olması, çizgi uzunluğunu geçmediği sürece çıktıda kabul edilebilir.


14
Bacağının sonunda bacaklarını kırardın!
16'da

13
@Fatalize bu olurdu ... Ölümcül.
Ven,

7
@ En altta bir havuz çizerseniz sizin için bonus puanlarını artırın;)
atlasologist

8
@atlasologist Bir kan havuzu mu?
Neil,

Bu aptalca bir soru ise özür dilerim, ancak aşağıdaki yanıtların bir kısmı (Python, JavaScript) yazdırmak yerine bir dize döndüren bir işlev tanımlamaktadır. Kaşer mi?
Jordan,

Yanıtlar:


17

Retina , 81 72 52 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

.+
$* /\    \
^.

+` /(.+)$
$&¶$%`/  $1
/.{5}
/----/

Çevrimiçi deneyin!

açıklama

Program, tümü regex ikameleri olan (birkaç Retina'ya özgü özellik ile) dört aşamadan oluşmaktadır. Giriş 5için açıklama olarak örnek olarak kullanacağım .

1. Aşama

.+
$* /\    \

Bu, girişi n, nardından /\ \merdivenin / slaydın üstünde olacak şekilde boşluklara dönüştürür :

     /\    \

Şimdilik, sadece slaydı tam olarak göstereceğiz ve merdiveni yalnızca sol tarafıyla temsil edeceğiz /.

2. aşama

^.

Ne yazık ki, nboşluklar ihtiyacımızdan daha fazla, bu yüzden ilk karakteri tekrar kaldırıyoruz. Şimdi biz var:

    /\    \

Sahne 3

+` /(.+)$
$&¶$%`/  $1

Tüm yapıyı genişletme zamanı. Üstün nerede olduğunu bilmek , her şeyi inşa etmek için yeterlidir, çünkü her seferinde bir çizgiyi uzatabiliriz, merdiveni ve slaydı iki boşlukla ayırabiliriz.

+Çıktı değişen durana kadar (bu durumda Normal ifade eşlemeyi durdurur çünkü) bir döngü içinde bu aşamaya tekrarlamak Retina söyler. Regex'in kendisine gelince, sadece /son satırda ve ondan sonraki her şeyle eşleşiriz ve ayrıca önünde bir boşlukla eşleşiriz; bu, /ilk sütuna ulaştığında artık eşleşmeyeceği anlamına gelir .

İşte bununla değiştirdiğimiz şey:

 $&    The match itself. We don't want to remove the line we already have.
 ¶     A linefeed, because we want to append a new line.
 $%`   This is a very recent addition to Retina: it's like the normal $` but
      is bounded by linefeeds. That means this inserts everything in front
      of the match which is on the same line. In particular this one space
      less than the indentation of the matched line, hence we are shifting
      the / one column left.
 /     A literal /, representing the left edge of the ladder.
>  <   Two spaces, so that we can shift the slide one column right.
 $1    Capturing group 1 which contains the slide and its separation from
      the ladder.

Her yinelemede, bu, sonuna kadar, dizgeye bir satır ekler:

    /\    \
   /  \    \
  /    \    \
 /      \    \
/        \    \

4. Aşama

/.{5}
/----/

Geriye kalan tek şey merdiveni sağa döndürmek. Bu gerçekten basit, sadece /ve sonraki 5 karakterle eşleşip doğru merdiven gösterimini ekliyoruz, böylece zaten orada olan slaydı veya boşlukları geçersiz kılıyoruz:

    /----/\
   /----/  \
  /----/    \
 /----/ \    \
/----/   \    \

9

V , 38, 37, 36, 34, 33, 32, 31, 30 29 bayt

Àé r\2é/4é-òhYpX$2P^ò3GEòjlr\

Çevrimiçi deneyin!

Ben belki Osabie yetişirim. Osabie'den bir bayt daha kısa. \o/2sable ile bağlandı! Bir bayt daha kısa!

Diğer yandan, bu kesinlikle şimdiye kadar yaptığım en uzun çizili başlık.

Açıklama:

Àé              "Insert 'arg1' spaces
   r\           "Turn the last one into a '\'
     2é/        "Insert 2 '/'
        4é-     "Insert 4 '-'

ò        ò      "Recursivly:
 h              "  Move one to the left
  Yp            "  Duplicate this line
    X           "  Delete one space from the left
     $2P        "  Paste two spaces at the end of this line
        ^       "  Move back to the beginning of this line.

Bu, "sola git" komutu ('h') sayesinde 'arg1' kez olacak olan bir hata oluşana kadar çalışır.

Şimdi sadece iç bacağını eklememiz gerekiyor

3GE             "Move to the second slash of line 3
   ò    ò       "Recursively: (The second 'ò' is implicit)
    jl          "  Move down and to the right
      r\        "  And replace the character under the cursor with a '\'

Rekabet etmeyen sürüm (28 bayt)


8

Pyth, 39 35 bayt

VQ++*dt-QN"/----/">+*+ddN"\    \\"5

Açıklama:

VQ                                  # Interate over 0 -> Q-1 (Q is the input)
  +                                 # Concatenate the 2 halfs of the slide
   +                                # Concatenate the whitespace block and the ladder
    *d                              # Multiply d (whitespace) by this number \/
      t-QN                          # Calculate the amount of spaces before : input - step of the iterarion -1
          "/----/"                  # Ladder
                  >               5 # Remove the first 5 chars  from the string generated in the following lines 
                   +                # Concatenate the whitespace block and the slide
                    *+ddN           # Multiply "+dd" (2 whitespace) by the step of the iterarion to generate the space between the ladder and the slide
                         "\    \\"  # Slide

Burada test et



7

PowerShell v2 +, 99 90 82 bayt

param($n)1..$n|%{" "*($n-$_)+"/----/"+-join(" "*($_+$i++)+"\    \")[6..(6+$_+$i)]}

Girişi alır $n, bir döngü başlar 1etmek $nile |%{...}. Her yineleme, bir dize inşa ediyoruz. Uygun sayıda boşluk " "*($n-$_)ve merdivenle başlıyoruz "/----/".

Bunun için, dilimlenmiş [...]ve bir -joinaraya getirilen başka bir dize ekleriz . İkinci dize, slayttır ve tüm slaydın her zaman görünür olduğunu varsayarız. Slayt başlamadan önce boşluk sayısı " "*($_+$i++), ardından slaytın kendisi "\ \". Bu, kısmen merdivenin gizlediği "boşluklar ve slaydın" bir parçası olarak hesaplanan bir aralıkla dilimlenir.

Örnekler

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 7
      /----/\
     /----/  \
    /----/    \
   /----/ \    \
  /----/   \    \
 /----/     \    \
/----/       \    \

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15
              /----/\
             /----/  \
            /----/    \
           /----/ \    \
          /----/   \    \
         /----/     \    \
        /----/       \    \
       /----/         \    \
      /----/           \    \
     /----/             \    \
    /----/               \    \
   /----/                 \    \
  /----/                   \    \
 /----/                     \    \
/----/                       \    \

7
+1, dizininizdeki eğik çizgiler, test çıktısındaki eğik çizgiler ile aynı hizada olduğundan :D
DJMcMayhem

Kişisel \golfingklasör çok organize edilmelidir._.
Conor O'Brien

6

Python 2 - 79 76 75 bayt

x=input()
for i in range(x):print(x-i)*' '+'/----/'+(i*'  '+'\\    \\')[5:]

Programımı yazdırdığımdan beri beni diskalifiye ettiği için Hubert Grzeskowiak'a teşekkürler, 3 bayt kurtardı! 1 bayt daha kaydettiğiniz için Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ'ye de teşekkürler!


Güzel! Bu arada, lambda iyiydi, bence, kesinlikle konuşmaktan bir tür fonksiyon. Lambda kullanarak bir yeni hat ve alandan tasarruf edebilirsiniz :-)
Hubert Grzeskowiak

Bekle, aslında lambda ile denedim ve işe yaramadı. Baskının bc'si sanırım?
Hubert Grzeskowiak,

@HubertGrzeskowiak Peki zorluk şartname bağlıdır. Bir slaydın bir dize gösterimini döndüren bir program / işlev sorulursa, cevaplarımdan biri geçerli olur. Belirttiğiniz gibi "yazdır" ı belirttiğinden, lambda işlevini adlandırmaya ve bir çağrı yazdırmaya ya da yukarıda yaptığım şeyi daha kısa olanı yapmam gerekirdi.
Cowabunghole

Teknik özellikler, fonksiyonun isimlendirilmesi veya çağrılması gerektiğini söylemez ;-)
Hubert Grzeskowiak,

Tam programa dönüştürmek: değiştirmek def f(x):ile x=input(), ikinci satırda girinti kaldırın. Bu size 1 byte kazandırır.
Outgolfer Erik,

6

Vim, 71 tuş vuruşlarını

Bu çok aptalca bir yol, ama biraz eğlenceli. Giriş, bir tamsayı içeren tek bir satır içeren bir metin dosyası olarak verilir. Bu büyük olasılıkla oldukça golf oynamaktadır ancak şu an için geçerli olacaktır ( düzenleme: istek üzerine isteğe bağlı kontrol karakterlerinin tarzı ):

A@qyyPgg<c-v><c-v>GkI <c-v><esc>G$i  <c-v><esc><esc>
Tq"qDI/----/\^[lD@"ddh<c-v>god:%s/     \\/\\    \\<cr>

<c-v>, <esc>Ve <cr>ayrı ayrı tüm tuş vuruşlarını; ctrl + v, kaçış ve satır başı sırasıyla (enter). Doğru değişmezleri olan basit bir sürümü sindirmek için, işte ladder.keysçalışan dosya xxd:

00000000: 4140 7179 7950 6767 1616 476b 4920 161b  A@qyyPgg..GkI ..
00000010: 4724 6920 2016 1b1b 5471 2271 4449 2f2d  G$i  ...Tq"qDI/-
00000020: 2d2d 2d2f 5c1b 6c44 4022 6464 6816 676f  ---/\.lD@"ddh.go
00000030: 643a 2573 2f20 2020 2020 5c5c 2f5c 5c20  d:%s/     \\/\\
00000040: 2020 205c 5c0d 0d0a                         \\...

Denemek için (uygun araçlarla bir nix varsayarak) yukarıdakileri alın, çalıştırın xxd -rve dosyaya koyun ladder.keys. ladder.txtİçinde bir tamsayı olan bir dosya oluşturun . O zaman yapın:

vim -s ladder.keys -u NONE ladder.txt

Biz genellikle yazma ^Volarak <c-v>burada.
Leaky Nun

@Jordan Her biri bir tuşa basar, değiştirilmiş tuşlara (shift, ctrl veya alt tuşunu başka bir tuşla) sayar. Tuş vuruşları Ctrl + v, kaçış ve girin.
algmyr

@algmyr Benim hatam. Cevabını daha önce yanlış anladım.
Ürdün

6

bash, 61

for((;i<$1;)){ printf "%$[$1+i]s\    \^M%$[$1-++i]s/----/\n";}

^Mdeğişmez satır başı ücreti nerede

$ ./ladder 1
/----/\
$ ./ladder 4
   /----/\
  /----/  \
 /----/    \
/----/ \    \
$ ./ladder 10
         /----/\
        /----/  \
       /----/    \
      /----/ \    \
     /----/   \    \
    /----/     \    \
   /----/       \    \
  /----/         \    \
 /----/           \    \
/----/             \    \

/Dördüncü satırda ve \ \ arasında bir boşluk ve slayt kenarları arasında 1 daha az boşluk olması gerektiğini düşünüyorum .
Leibrug

5 değil 4 çizgi olmalıdır.
algmyr 28:16

@algmyr 2 bayt kaydeder teşekkür ederim
izabera

5

JavaScript (ES6), 79 bayt

f=
n=>" ".repeat(n).replace(/./g,"$'/$`$`\\    \\\n").replace(/\/...../g,"/----/")
;
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

Bir dizi nboşluk alarak , ardından slaydı bir desteğe almak için egzotik bir ikame yaparak, ardından desteği bir merdivenin yerine koyarak çalışır.


4

Ruby, 61 bayt

->n{n.times{|i|puts"%*s\\    \\\r%*s----/"% [n+i,"",n-i,?/]}}

Ungolfed

->(num_rows) {
  num_rows.times {|row_idx|
    puts "%*s\\    \\\r%*s----/" % [ num_rows + row_idx, "", num_rows - row_idx, "/" ]
  }
}

Biçim dizgisi için iki satır bayt alabilirim '%*s\ \^M%*s----/'( ^Mdeğişmez satır başına satır başı), ancak Ruby " warning: encountered \r in middle of line, treated as a mere space" uyarısını yazdırır . ¯ \ _ (ツ) _ / ¯

Önceki çözüm (64 bayt)

->n{n.times{|i|puts" "*(n+i)+"\\    \\\r"+" "*(n-i-1)+"/----/"}}

3

Toplu iş, 194 bayt

@echo off
for /l %%i in (1,1,%1)do call:l %1 %%i
exit/b
:l
set s=\    \
for /l %%j in (1,1,%2)do call set s=  %%s%%
set s=/----/%s:~7%
for /l %%j in (%2,1,%1)do call set s= %%s%%
echo%s%

Mantıklı olduğu ortaya çıktı: slaydı girin, ilk 7 karakteri çıkarın, merdiveni girin, öndeki boşluğu çıkarın. Bu son bit olsa biraz hile içerir!


2

Java, 116 bayt

c->{for(int i=0;i<c;i++)System.out.format("%"+(5+c-i)+"s%"+(i<3?i*2+1:2*(i-2))+"s%5s\n","/----/","\\",i<3?"":"\\");};

Ne yazık ki, Java'daki [dizeleri] kolayca kopyalayamazsınız, bu yüzden format işlevini kötüye kullanıyorum.


2

Scala, 95 bayt

def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+("  "*i+"\\    \\").substring(5))}

2

Haskell, 81 bayt

a n=[1..n]>>" "
f n=[1..n]>>=(\i->a(n-i)++"/----/"++drop 7(a(2*i)++"\\    \\\n"))

do i<-[1..n];a(n-i)++"/----/"++drop 7(a(2*i)++"\\ \\\n")iki bayt kaydeder.
Lynn,

0

eacal , rekabetçi olmayan, 386 bayt

init .
define @ curry push .
define ~ curry exec .--func
alias $ strap
alias ' string
set n set m cast number arg number 0
set s empty string
label l
@ get n
set n ~ dec
@ space
@ get n
$ ~ repeat
$ ' /----/
@ space
@ get m
@ get n
@ ~ sub
@ ~ dec
@ number 2
@ ~ mul
$ ~ repeat
$ ' \
$ newline
@ get n
@ number 0
if ~ more
goto l
@ $
@ regex gm '   ( {4})(?=.$)
@ '  \$1
print ~ replace

Resmen mümkün olan en ayrıntılı dili mümkün kıldım. Yorumu jest ve alaycılıkta yaptım. Lütfen sakin ol. Başlığa bağlı github deposunda nasıl çalıştırılacağına dair talimatlar.

Ungolfed

init .
set n set m cast number arg number 0
set s empty string
label loop
    push . get n
    set n exec .--func dec
    push . space
    push . get n
    strap exec .--func repeat
    strap string /----/
    push . space
    push . get m
    push . get n
    push . exec .--func sub
    push . exec .--func dec
    push . number 2
    push . exec .--func mul
    strap exec .--func repeat
    strap string \
    strap newline
    push . get n
    push . number 0
    if exec .--func more
        goto loop

push . strap
push . regex gm string   ( {4})(?=.$)
push . string  \$1
print exec .--func replace

1
Resmen mümkün olan en ayrıntılı dili mümkün kıldım. ” Afedersiniz, AppleScript'i duydunuz mu?
Addison Crump,

@VTCAKAVSMoACE Tamam, bir anlaşma yapalım. Bu soruyu el yazısıyla cevapla. O zaman size bunun daha ayrıntılı olduğunu söyleyeceğim.
Conor O'Brien,

4
Bunu çözebilirsen yeterince ayrıntılı değil.
Neil,

@VTC, TimmyD ve Neil: Geez. Şimdi mutlu musun
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Belli ki şaka yapıyoruz, lol
Addison Crump
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.