Narysuj drabinę i zsuń się

24

Twoim zadaniem jest stworzenie programu lub funkcji, która przyjmuje jako liczbę naturalną ( n) od 1 do 25 (włącznie) i drukuje izometryczną reprezentację slajdu i drabiny z nliczbą szczebli.

Specyfikacja drabiny i zjeżdżalni

Drabina jest zawsze ustawiona z lewej strony, a zjeżdżalnia z prawej strony. Oglądamy go od strony drabiny, więc część slajdu jest zasłonięta na trzech najwyższych poziomach. Szczeble są reprezentowane przez cztery myślniki ( ----), a boki drabiny i przesuwane przez myślniki ( /i \). Poniżej znajduje się schemat przedstawiający wzory przestrzeni potrzebnych do slajdu z pięcioma szczeblami.

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

Przykłady

>>1
/----/\

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

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

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

To jest golf golfowy, więc wygrywa odpowiedź z najmniejszą liczbą bajtów.

Uwaga: końcowe białe znaki są dopuszczalne na wyjściu, o ile nie przekraczają długości linii.

atlasolog
źródło
14
Złamałbyś nogi na końcu tego slajdu!
Fatalize
13
@ Fatalizuj to byłoby ... Śmiertelne.
Ven
7
@Zatrzymaj dla siebie punkty bonusowe, jeśli narysujesz pulę na dole;)
atlasolog
8
@atlasologist Pula krwi?
Neil,
Przepraszamy, jeśli jest to głupie pytanie, ale kilka poniższych odpowiedzi (Python, JavaScript) definiuje funkcję, która zwraca łańcuch zamiast go drukować. Czy to koszerne?
Jordan

Odpowiedzi:

17

Retina , 81 72 52 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

.+
$* /\    \
^.

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

Wypróbuj online!

Wyjaśnienie

Program składa się z czterech etapów, z których wszystkie są substytucjami wyrażeń regularnych (z kilkoma funkcjami specyficznymi dla siatkówki). 5Jako wyjaśnienia użyję danych wejściowych .

Scena 1

.+
$* /\    \

To zamienia dane wejściowe nw nspacje, po /\ \których stanie się szczyt drabiny / zjeżdżalni:

     /\    \

Na razie pokażemy slajd w całości i przedstawimy drabinę tylko lewą ręką /.

Etap 2

^.

Niestety, nspacje są o jeden więcej, niż potrzebujemy, więc ponownie usuwamy pierwszą postać. Mamy teraz:

    /\    \

Etap 3

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

Czas rozwinąć pełną strukturę. Wiedza, gdzie jest góra, jest wystarczająca, aby zbudować całość, ponieważ możemy po prostu przedłużyć ją o jedną linię na raz, przesuwając drabinę i zjeżdżalnię o dwie spacje.

+Mówi Retina powtórzyć ten etap w pętli aż wyjście przestaje zmianę (w tym przypadku, ponieważ regex zatrzymuje dopasowanie). Jeśli chodzi o sam regex, po prostu dopasowujemy /ostatnią linię i wszystko po niej, a także dopasowujemy jedną spację przed nią, co oznacza, że ​​nie może ona już pasować po /osiągnięciu pierwszej kolumny.

Oto, co zastępujemy:

 $&    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.

Tak więc przy każdej iteracji dodaje to jedną linię do łańcucha, aż do tego:

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

Etap 4

/.{5}
/----/

Wszystko, co pozostało, to dobrze ustawić drabinę. To naprawdę proste, po prostu dopasowujemy /i kolejne 5 znaków i wstawiamy poprawną reprezentację drabinki, zastępując w ten sposób slajd lub spacje, które już tam są:

    /----/\
   /----/  \
  /----/    \
 /----/ \    \
/----/   \    \
Martin Ender
źródło
9

V , 38, 37, 36, 34, 33, 32, 31, 30 29 bajtów

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

Wypróbuj online!

I może dogonić Osabie. Jeden bajt krótszy niż Osabie. \o/Związany z 2sable! Jeden bajt krótszy!

W innych wiadomościach jest to zdecydowanie najdłuższy przekreślony nagłówek, jaki kiedykolwiek zrobiłem.

Wyjaśnienie:

Àé              "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.

Będzie to działało do momentu wystąpienia błędu, który dzięki poleceniu „przesuń w lewo” („h”) będzie razy „arg1”.

Teraz musimy tylko dodać wewnętrzną nogę

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 '\'

Wersja niekonkurencyjna (28 bajtów)

DJMcMayhem
źródło
8

Pyth, 39 35 bajtów

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

Wyjaśnienie:

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

Przetestuj tutaj

Pręt
źródło
8

2sable , 40 36 32 30 bajtów

Hmmm, V zbliża się okropnie blisko ...

F¹N-<ð×…/--«ðð«N×…\  ««5F¦}¶

Wykorzystuje kodowanie CP-1252 . Wypróbuj wersję zgodną z 05AB1E! .

Adnan
źródło
A bitwa trwa: codegolf.stackexchange.com/a/85985/31716 :P
DJMcMayhem
@DrGreenEggsandIronMan Hmmm !!?!?!
Adnan
Jest jeszcze jedna i jeszcze raz, gdy wrócę do domu. Również ja nie przełączania języków. : P
DJMcMayhem
7

PowerShell v2 +, 99 90 82 bajtów

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

Pobiera dane wejściowe $n, rozpoczyna pętlę od 1do $nz |%{...}. W każdej iteracji tworzymy ciąg. Zaczynamy od odpowiedniej liczby pól " "*($n-$_)i drabiny "/----/".

Do tego dodajemy kolejny ciąg, który został pocięty na plasterki [...]i z -joinpowrotem połączony. Drugi ciąg to slajd i zakładamy, że cały slajd jest zawsze widoczny. Jest to liczba spacji przed rozpoczęciem slajdu " "*($_+$i++), a następnie sam slajd "\ \". Jest to podzielone na zakres obliczony jako część „spacji plus zjeżdżalni”, która jest częściowo ukryta przez drabinę.

Przykłady

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

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15
              /----/\
             /----/  \
            /----/    \
           /----/ \    \
          /----/   \    \
         /----/     \    \
        /----/       \    \
       /----/         \    \
      /----/           \    \
     /----/             \    \
    /----/               \    \
   /----/                 \    \
  /----/                   \    \
 /----/                     \    \
/----/                       \    \
AdmBorkBork
źródło
7
+1, ponieważ ukośniki w twoim katalogu pokrywają się z ukośnikami na wyjściu testowym. :D
DJMcMayhem
Twój \golfingfolder musi być bardzo zorganizowany._.
Conor O'Brien,
6

Python 2 - 79 76 75 bajtów

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

Dziękuję Hubertowi Grzeskowiakowi za „dyskwalifikację” mnie, ponieważ mój program wydrukował tak naprawdę 3 bajty! Dziękujemy również Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ za oszczędność 1 bajtu więcej!

Cowabunghole
źródło
Miły! Nawiasem mówiąc, myślę, że lambda była w porządku, ponieważ ściśle mówiąc, jest to rodzaj funkcji. Za pomocą lambda możesz zaoszczędzić nowy wiersz i spację :-)
Hubert Grzeskowiak
Zaczekaj, próbowałem go z lambda i nie mogłem go uruchomić. Chyba jest to część druku?
Hubert Grzeskowiak,
@HubertGrzeskowiak Cóż, to zależy od specyfikacji wyzwania. Jeśli pytanie zadane dla programu / funkcji, która zwraca ciąg znaków reprezentujący slajd, jedna z moich odpowiedzi byłaby poprawna. Ponieważ określa „drukuj”, jak wskazałeś, musiałbym albo nazwać funkcję lambda i wydrukować do niej wywołanie, albo zrobić to, co zrobiłem powyżej, co było krótsze.
Cowabunghole,
Specyfikacje nie mówią, że funkcja musi zostać nazwana lub wywołana ;-)
Hubert Grzeskowiak,
Przekonwertować go na pełnym programem zamienić def f(x):z x=input()i usunąć wcięcie w drugim wierszu. To oszczędza 1 bajt.
Erik the Outgolfer
6

Vim, 71 naciśnięć klawiszy

To taki głupi sposób, ale to trochę zabawne. Dane wejściowe są podawane jako plik tekstowy z pojedynczym wierszem zawierającym liczbę całkowitą. Jest to prawdopodobnie gra w golfa, ale na razie wystarczy ( edytuj: zmiana stylu znaków kontrolnych na żądanie ):

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>I <cr>są wszystkie pojedyncze naciśnięcia klawiszy; ctrl + v, escape i return return (enter) odpowiednio. Dla wersji łatwej do strawienia z odpowiednimi literałami, oto plikladder.keys uruchamiamyxxd :

00000000: 4140 7179 7950 6767 1616 476b 4920 161b  [email protected] ..
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                         \\...

Aby to wypróbować (zakładając, że nix z odpowiednimi narzędziami) weź powyższe, uruchom je xxd -ri umieść w pliku ladder.keys. Utwórz plik ladder.txtz liczbą całkowitą. Następnie wykonaj:

vim -s ladder.keys -u NONE ladder.txt
algmyr
źródło
Zwykle piszemy ^Vjak <c-v>tutaj.
Leaky Nun
@Jordan Są to jedno naciśnięcie klawisza, licząc zmodyfikowane klawisze (Shift, Ctrl lub Alt z innym klawiszem) jako jedno naciśnięcie klawisza. Klawisze to Ctrl + v, klawisz Escape i Enter.
algmyr
@algmyr Mój błąd. Źle odczytałem twoją odpowiedź wcześniej.
Jordan
6

bash, 61

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

gdzie ^Mjest dosłowny powrót karetki

$ ./ladder 1
/----/\
$ ./ladder 4
   /----/\
  /----/  \
 /----/    \
/----/ \    \
$ ./ladder 10
         /----/\
        /----/  \
       /----/    \
      /----/ \    \
     /----/   \    \
    /----/     \    \
   /----/       \    \
  /----/         \    \
 /----/           \    \
/----/             \    \
izabera
źródło
Myślę, że powinieneś mieć jedną spację między /i `\ w czwartym rzędzie i 1 mniej miejsca między krawędziami suwaka.
Leibrug
Powinno to być 4 myślniki, a nie 5.
algmyr
@algmyr dziękuję, że oszczędza 2 bajty
izabera
5

JavaScript (ES6), 79 bajtów

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

Działa poprzez zajęcie szeregu nspacji, następnie wykonanie egzotycznej zamiany, aby uzyskać slajd ze wspornikiem, a następnie zastąpienie podpory drabiną.

Neil
źródło
4

Rubin, 61 bajtów

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

Bez golfa

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

Mógłbym zapisać dwa bajty, używając '%*s\ \^M%*s----/'(gdzie ^Mjest dosłowny znak powrotu karetki) dla ciągu formatu, ale wtedy Ruby wypisuje ostrzeżenie „ warning: encountered \r in middle of line, treated as a mere space”. ¯ \ _ (ツ) _ / ¯

Poprzednie rozwiązanie (64 bajty)

->n{n.times{|i|puts" "*(n+i)+"\\    \\\r"+" "*(n-i-1)+"/----/"}}
Jordania
źródło
3

Partia, 194 bajty

@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%

Okazało się dość proste: wcięcie slajdu, usunięcie pierwszych 7 znaków, wcięcie drabiny, usunięcie spacji wiodącej. Ten ostatni kawałek wymaga jednak trochę podstępu!

Neil
źródło
2

Java, 116 bajtów

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?"":"\\");};

Niestety nie można [łatwo] powielić łańcuchów w Javie, więc ostatecznie nadużywam funkcji formatowania.


źródło
2

Scala, 95 bajtów

def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+("  "*i+"\\    \\").substring(5))}
leonidv
źródło
2

Haskell, 81 bajtów

a n=[1..n]>>" "
f n=[1..n]>>=(\i->a(n-i)++"/----/"++drop 7(a(2*i)++"\\    \\\n"))
Damien
źródło
do i<-[1..n];a(n-i)++"/----/"++drop 7(a(2*i)++"\\ \\\n")oszczędza dwa bajty.
Lynn,
0

eacal , niekonkurencyjny, 386 bajtów

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

Oficjalnie stworzyłem możliwie najbardziej szczegółowy język. Komentowałem to żartem i sarkazmem. Proszę, uspokój się. Instrukcje uruchamiania w repozytorium github połączone w nagłówku.

Bez golfa

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
Conor O'Brien
źródło
1
Oficjalnie stworzyłem możliwie najbardziej szczegółowy język. Przepraszam, słyszałeś o AppleScript?
Addison Crump,
@VTCAKAVSMoACE W porządku, zawrzyjmy umowę. Odpowiedzisz na to pytanie w Applecript. Więc powiem ci, że to jest bardziej szczegółowe.
Conor O'Brien
4
Nie jest wystarczająco gadatliwy, jeśli możesz go odhaczyć.
Neil
@VTC, TimmyD i Neil: Geez. Teraz jesteś szczęśliwy?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Oczywiście żartujemy, lol
Addison Crump