Chaos to drabina ASCII

43

Nic nie wiesz Rzeczy, które robię dla Chaosu to drabina to niezapomniany wiersz z serialu Gra o tron .

Celem tego wyzwania jest zbudowanie drabiny z chaosu w sztuce ASCII.

Wyzwanie

Wejście

  • Szerokość drabiny, W >= 3(liczba całkowita)
  • Wysokość H >= 2stopnia (liczba całkowita)
  • Liczba szczebli N >= 2(liczba całkowita).

Wynik

Drabina z poziomymi szczeblami i pionowymi szynami , wszystkie o szerokości 1 znaku. Szerokość drabiny ( W) obejmuje dwie szyny, a wysokość stopnia ( H) obejmuje odpowiedni szczebel.

Wszystkie szczeble, w tym najwyższy i najniższy, będą miały kawałek pionowej szyny o długości H-1bezpośrednio powyżej i poniżej. Przykład uczyni to bardziej zrozumiałym.

Drabina będzie się składać z drukowalnych znaków ASCII , które nie są białymi znakami , tzn. Zawiera zakres od !(punkt kodowy 33) do ~(punkt kodowy 126). Rzeczywiste znaki zostaną wybrane losowo . Biorąc pod uwagę dane wejściowe, każdy losowy wybór znaków musi mieć niezerowe prawdopodobieństwo. Poza tym rozkład prawdopodobieństwa jest dowolny.

Dozwolone są wiodące lub końcowe białe znaki , poziome lub pionowe.

Przykład

Biorąc pod uwagę W=5, H=3, N=2, jeden z możliwych wyników jest następujący.

x   :
g   h
q$UO{
t   T
6   <
bUZXP
8   T
5   g

Należy pamiętać, że całkowita wysokość jest H*(N+1)-1, ponieważ istnieją Nszczeble i N+1sekcje pionowe.

Zasady dodatkowe

  • Środki wprowadzania i format są jak zwykle elastyczne . Na przykład możesz wprowadzić trzy liczby w dowolnej kolejności lub tablicę je zawierającą.

  • Dane wyjściowe mogą być przekazywane przez STDOUT lub argument zwracany przez funkcję. W tym przypadku może to być ciąg znaków z nowymi liniami, tablica znaków 2D lub tablica ciągów.

  • Można zapewnić program lub funkcję .

  • Standardowe luki są zabronione.

  • Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

Dla każdego W, H, Nz nich wyświetlana jest możliwa wydajność.

W=5, H=3, N=2:

\   ~
:   K
ke:[E
5   u
0   _
8Fr.D
#   r
7   X


W=3, H=2, N=2:

$ X
Mb)
0 ]
(T}
j 9


W=12, H=4, N=5:

d          Y
P          `
5          3
p$t$Ow7~kcNX
D          x
`          O
*          H
LB|QX1'.[:[F
p          p
x          (
2          ^
ic%KL^z:KI"^
C          p
(          7
7          h
TSj^E!tI&TN8
|          [
<          >
=          Q
ffl`^,tBHk?~
O          +
p          e
n          j


W=20, H=5, N=3:

G                  %
o                  y
%                  3
-                  7
U'F?Vml&rVch7{).fLDF
o                  }
U                  I
h                  y
a                  g
;W.58bl'.iHm\8v?bIn&
,                  U
N                  S
4                  c
5                  r
F3(R|<BP}C'$=}xK$F]^
'                  h
h                  u
x                  $
6                  5    
Luis Mendo
źródło
czy możesz dodać (numeryczny) zakres znaków ascii?
Rod
@Rod Dobry pomysł. Sporządzono
Luis Mendo,
1
Jaki jest dolny limit jakości losowości? Zakładam, że rozpoczęcie od losowego punktu i zwiększenie modułu (126-33) nie kwalifikuje się z powodu oczywistej korelacji między sąsiednimi wartościami. Czy może musi być w stanie wygenerować każdą możliwą sekwencję? (Czyli 8-bitowy liniowy generator kongruencjalny nie zadziałałby, ponieważ jeden znak jednoznacznie określa następny znak?)
Peter Cordes
@PeterCordes Nie ma problemu z pewną korelacją, o ile może wystąpić każda możliwa kombinacja. Podejście, które opisujesz, jest, jak mówisz, nieważne, ponieważ wprowadza zbyt silną statystyczną zależność między postaciami na różnych pozycjach, uniemożliwiając niektóre kombinacje
Luis Mendo
1
@PeterCordes Tak, miałem na myśli teoretycznie. Nie martw się o siłę RNG; możesz założyć, że RNG jest idealny. Istnieje pewien meta konsensus w tej sprawie. Myślałem, że jest coś bardziej konkretnego, ale wszystko, co mogłem znaleźć, to to i to
Luis Mendo

Odpowiedzi:

6

Galaretka ,  24 23  22 bajtów

«þỊoU$ẋ⁵‘¤Ḋ×94X€€+32ỌY

Pełen program, biorąc trzy argumenty W, H, Ni drukowanie wyników.

Wypróbuj online!

W jaki sposób?

Tworzy maskę tablicy 2d pojedynczego szczebla i jego pionowych sekcji poniżej, powtarza go N+1razy i usuwa górny szczebel, a następnie umieszcza losowe znaki lub spacje w zależności od wartości maski.

«þỊoU$ẋ⁵‘¤Ḋ×94X€€+32ỌY - Main link: W, H (N is third input / 5th command line argument)
 þ                     - outer product (build a table using):
«                      -  minimum
                       -  ...note: þ implicitly builds ranges of W and H prior
  Ị                    - insignificant? (abs(z)<=1) - yields a W by H 2-d array,
                       -   all zeros except the left and top edges which are 1s
     $                 - last two links as a monad:
    U                  -   upend (reverse each row)
   o                   -   or (vectorises) - giving us our |‾| shape of 1s
         ¤             - nilad followed by link(s) as a nilad:
       ⁵               -   5th command line argument, N
        ‘              -   increment -> N+1
      ẋ                - repeat list - giving us our ladder-mask plus a top rung)
          Ḋ            - dequeue - remove the top rung
            94         - literal ninety-four
           ×           - multiply (vectorises) - replace the 1s with 94s
              X€€      - random for €ach for €ach - 0 -> 0; 94 -> random integer in [1,94]
                  32   - literal thirty-two
                 +     - add (vectorises) - 0 -> 32; random integers now from [33,126]
                    Ọ  - character from ordinal (vectorises)
                     Y - join with newlines
                       - implicit print
Jonathan Allan
źródło
34

Operacyjny język skryptowy Flashpoint , 643 624 bajtów

f={l=["""","!","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"];t=_this;w=t select 0;r={l select random 92};v="";s=v;i=2;while{i<w}do{i=i+1;v=v+" "};p={i=1;while{i<t select 1}do{i=i+1;s=s+call r+v+call r+"\n"}};k=0;call p;while{k<t select 2}do{k=k+1;i=0;while{i<w}do{i=i+1;s=s+call r};s=s+"\n";call p};s}

Śmiesznie długo, ponieważ nie ma możliwości stworzenia znaków z kodów znaków.

Zadzwoń z:

hint ([5, 3, 2] call f)

Wynik:

Drabina jest wyjątkowo chaotyczna, ponieważ czcionka nie jest monospacowana.

Rozwinięty:

f =
{
    l = ["""","!","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"];

    t = _this;
    w = t select 0;

    r =
    {
        l select random 92
    };

    v = "";
    s = v;

    i = 2;
    while {i < w} do 
    {
        i = i + 1;
        v = v + " "
    };

    p =
    {
        i = 1;
        while {i < t select 1} do 
        {
            i = i + 1;
            s = s + call r + v + call r + "\n"
        }
    };

    k = 0;
    call p;
    while {k < t select 2} do 
    {
        k = k + 1;

        i = 0;
        while {i < w} do
        {
            i = i + 1;
            s = s + call r
        };
        s = s + "\n";

        call p
    };

    s
}
Steadybox
źródło
Wydaje się, że "\n"działa, "\xa3"aby uzyskać coś takiego £nie działa? jeśli możesz użyć znaków ucieczki unicode, możesz być w stanie przyciąć tę tablicę.
Tschallacka
Jak mogę to uruchomić samodzielnie? : D
Geeky I
22
Wygląda na to, że skrypt został napisany, a spacje i znaki nowej linii zostały usunięte. Czy zdobywają poparcie tylko z powodu obrazu drabiny, czy też przegapiłem sprytnego golfa?
Jonathan Allan
@steadybox używasz teraz kontekstowych zrzutów ekranu po tym, jak poprosiłem o zrzut ekranu inny niż użytki zielone na to jedno pytanie xD?
Magic Octopus Urn
@Tschallacka \njest jedyną rozpoznawaną ucieczką. ( ""Wewnątrz cytaty stanowią jeden ")
Steadybox
14

05AB1E , 29 bajtów

Dane wejściowe są pobierane w kolejności N, H, W

>*GNUžQ¦©.RIÍFð®.R«X²Öè}®.RJ,

Wypróbuj online!

Wyjaśnienie

>*G                              # for N in [1 ... (N+1)*H)-1] do:
   NU                            # store N in variable X
     žQ                          # push a string of printable ascii
       ¦©                        # remove the first (space) and save a copy in register
         .R                      # pick a random character
           IÍF                   # W-2 times do:
              ð                  # push a space
               ®.R               # push a random ascii character
                  «              # concatenate
                   X²Ö           # push X % H == 0
                      è          # index into the string of <space><random_char> with this
                       }         # end inner loop
                        ®.R      # push a random ascii character
                           J,    # join everything to a string and print
Emigna
źródło
To trochę oszustwo.
vdegenne
4
@ user544262772 dlaczego tak?
Jonathan Allan
możesz to trochę wyjaśnić?
Mischa,
@MischaBehrend: Jasne, dodałem teraz wyjaśnienie.
Emigna
3
@ user544262772 udzielenie dobrze golfowej odpowiedzi w języku golfowym może być dość trudne, uwierz mi, są one przeznaczone do gry w golfa, ale korzystanie z nich zazwyczaj wymaga przemyślenia (chyba że jest to po prostu „tutaj wbudowany program, który robi dokładnie to, czego chcesz” „).
Jonathan Allan
13

C, 95 bajtów

f(w,h,n,i){++w;for(i=0;i++<w*~(h*~n);)putchar(i%w?~-i%w%(w-2)*((i/w+1)%h)?32:33+rand()%94:10);}
orlp
źródło
8

R , 138 129 111 98 93 bajtów

-13 bajtów dzięki Nealowi Fultzowi!

-1 bajt dzięki Robin Ryder

function(W,H,N){m=matrix(intToUtf8(32+sample(94,W*(h=H*N+H-1),T),T),h)
m[-H*1:N,3:W-1]=" "
m}

Wypróbuj online!

Funkcja anonimowa; zwraca wynik jako macierz.

Dzięki temu pytaniu Word Grids dużo więcej niż zwykle myślałem o matrycach. Zauważyłem, że szczeble znajdują się w tych rzędach macierzy, które są wielokrotnością wysokości stopnia H(R ma indeks 1), i że szyny są pierwszą i ostatnią kolumną, 1i W. Więc tworzę macierz losowych znaków ASCII i zastępuję te litery, które nie pasują do tych kryteriów, spacjami, i zwracam macierz. Łącze TIO ładnie to drukuje.

Neal Fultz zasugerował inne indeksowanie znaków spacji [-H*(1:N),3:W-1], które zastępuje wszystkie znaki oprócz tych w rzędach wielokrotności H: -H*(1:N)a nie na krawędzi, 3:W-1<==> 2:(W-1).

R , 121 bajtów

function(W,H,N)for(i in 1:(H*N+H-1)){for(j in 1:W)cat("if"(!(i%%H&j-1&j-W),sample(intToUtf8(33:126,T),1)," "))
cat("\n")}

Wypróbuj online!

Ulepszenie w stosunku do pierwotnego podejścia opartego na matrycy, od którego zacząłem; to ten sam algorytm, ale forpętle są krótsze niż konstruowanie i drukowanie matrycy (ale nie, jeśli jej nie wydrukuję!)

Giuseppe
źródło
m[-H*(1:N),3:W-1]=" "Wygląda trochę krótszy - zawsze można zastąpić testowania rowi colz 2-d plaster.
Neal Fultz,
@NealFultz wow, to całkiem doskonałe! Dziękuję Ci!
Giuseppe,
-1 bajt, zastępując sample(33:126,...)w 32+sample(94,...).
Robin Ryder
6

Perl 5 , 81 bajtów

Kod 80 bajtów + 1 dla -p.

/ \d+ /;$_=(($}=(_.$"x($`-2)._.$/)x($&-1))._ x$`.$/)x$'.$};s/_/chr 33+rand 94/ge

Wypróbuj online!

Dom Hastings
źródło
spacja po \ d + może zostać usunięta z powodu chciwego meczu
Nahuel Fouilleul
6

Węgiel drzewny , 34 32 bajty

E…¹×⁺¹NN⪫EIζ⎇∧﹪ιIη﹪λ⁻Iζ¹ §⮌γ‽⁹⁴ω

Wypróbuj online! Pobiera dane wejściowe w przybliżeniu N, H, W. Pełne przybliżenie ( Plus(InputNumber(), 1)obecnie jest przerwane w TIO). Wyjaśnienie:

E…¹×⁺¹NN

Mapa w zasięgu 1..H*(N+1). Oznacza to, że szczeble pojawiają się, gdy ijest wielokrotnością H.

Dołącz do wyniku:

EIζ

mapowanie w zakresie domyślnym 0..W:

⎇∧﹪ιIη﹪λ⁻Iζ¹ 

jeśli kolumna nie jest 0lub W-1wiersz nie jest wielokrotnością, Hwówczas wypisuje spację;

§⮌γ‽⁹⁴

w przeciwnym razie weź predefiniowaną zmienną znakową ASCII, odwróć ją (umieszczając spację na 94. miejscu) i wydrukuj losowy znak z tego, co jest teraz pierwszą 94. (Ponieważ Slicejest do bani).

ω

Dołącz używając pustego ciągu. Ostateczny wynik jest domyślnie wydrukowany.

Neil
źródło
Nie jestem pewien, czy to jest pomocne, ale można narysować drabinę, a następnie zerknąć i odwrócić losową mapę, tak myślę? EDYCJA Wygląda na zepsuty. Ups
Tylko ASCII,
Spróbuję to naprawić (całkiem pewne, że wcześniej działało), ale byłem trochę zajęty, więc może to chwilę potrwać
tylko ASCII
@ Tylko ASCII Zakładam, że myślisz NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«? Cóż, a0a6316podzieliłem się na dwie części i popełniłem je.
Neil
@ Tylko ASCII Właściwie to nie do końca prawda. Wystąpił niepowiązany błąd w Mapmiejscu, w którym był używany, not is_commandgdy miał na myśli is_command. Więc miałeś napisać, NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴gdyby nie ten błąd.
Neil
6

C (gcc) , 141 131 114 109 107 bajtów

Powinieneś być w stanie zagrać w golfa trochę ...

i,j,c;f(w,h,n){for(i=1;i<h*n+h;i+=j==w)printf(i%h?i++,j=0,"%c%*c\n":"%c",++j^w?c^8:10,w-2,c=33+rand()%94);}

Wypróbuj online!

cleblanc
źródło
czy możemy edytować i=1w deklaracji globalnej?
Mukul Kumar,
6

Perl 6 , 76 73 bajtów

->\h,\n,\w{map {chrs (roll(w,1..94)Z*1,|($_%%h xx w-2),1)X+32},1..^h*n+h}

Wypróbuj online!

Bierze (h, n, w) jako argumenty. Zwraca listę ciągów.

Wyjaśnienie:

-> \h, \n, \w {  # Block taking arguments h, n, w
    map {
        # String from codepoints
        chrs
             # Generate w random numbers between 1 and 94
             (roll(w, 1..94)
              # Set inner numbers on non-rungs to zero
              Z* 1, |($_%%h xx w-2), 1)
             # Add 32 to numbers
             X+ 32
    }
    # Map h*n+h-1 row numbers (1-indexed)
    1..^h*n+h
}
nwellnhof
źródło
Alternatywny 73 bajter przy użyciu xxi ++$zamiast map. Może znajdziesz miejsce do gry w golfa?
Jo King
5

PowerShell , 132 124 bajty

param($w,$h,$n)-join([char[]]((($a=('#'+' '*($w-2)+"#`n")*--$h)+'#'*$w+"`n")*$n+$a)|%{($_,[char](33..126|Random))[$_-eq35]})

Wypróbuj online!

Budujemy drabiny składający się z tylko #pierwszy ( przykład ), a następnie pętli |%{...}przez każdego znaku i ifjest to -eqseksualnego do 35, możemy wyciągnąć nową Randompostać z odpowiednim zakresie. W przeciwnym razie wypisujemy (tj. Spację lub znak nowej linii).

AdmBorkBork
źródło
5

JavaScript (ES6), 117 115 bajtów

Funkcja rekurencyjna budująca wynik po znaku.

„Spójrz Ma, nie dosłowny wiersz!”

(w,h,n)=>(g=x=>y<h*n+h-1?String.fromCharCode(x++<w?x%w>1&&-~y%h?32:Math.random()*94+33|0:10)+g(x>w?!++y:x):'')(y=0)

Próbny

Arnauld
źródło
Cholera! Byłem w trakcie gry w golfa, kiedy to zobaczyłem. : \ Wygrywasz ponownie! : p
Shaggy,
Skończyłem grać w golfa w dół (na razie) - wyznaczyłem granicę w przenoszeniu wszystkich trójskładników w środku String.fromCharCode, ponieważ nie mogłem szczerze powiedzieć, że sam to wymyślę po zobaczeniu. Daj mi znać, jeśli uważasz, że moje jest teraz zbyt podobne do twojego.
Kudłaty
@Shaggy Bez obaw! (Właściwie widziałem twoją odpowiedź dopiero po opublikowaniu mojej. Gdybym ją widział wcześniej, prawdopodobnie bym się
poddał
1
Ach, taka jest natura gry! :) Nawiasem mówiąc, połączenie naszych rozwiązań daje 113 bajtów
Shaggy
5

Python 2 , 142 bajty

lambda w,h,n,e=lambda:chr(randint(33,126)):[e()+[eval(("e()+"*(w-2))[:-1])," "*(w-2)][-~i%h>0]+e()for i in range(h*-~n-1)]
from random import*

Wypróbuj online!

Zaoszczędzone bajty dzięki ovs!

Pan Xcoder
źródło
@LuisMendo Myślę, że teraz to naprawiłem.
Pan Xcoder,
@LuisMendo To moja wina, że ​​nie sprawdziłem dokładnie.
Pan Xcoder,
42 bajty
ovs
@ovs Thanks! Zapomniałeś a 1z przodu> _>
Pan Xcoder
3

Python 2 , 114 bajtów

lambda w,h,n:[[chr(32+randint(1,94)*(x%~-w*(y%h)<1))for x in range(w)]for y in range(1,h*-~n)]
from random import*

Wypróbuj online!

Lynn
źródło
3

SOGL V0.12 , 32 31 bajtów

 ~ΔkψR
I{e{R}¶bH{Re⁾⌡@R¶}}¹∑e⌡k

Wypróbuj tutaj!

Wprowadź dane w kolejności N, W, H.

Wyjaśnienie:

 ~ΔkψR

     R  a function named "R", pushes a random character:
 ~       push "~"
  Δ      get the charasters from " " to "~"
   k     remove the 1st character
    ψ    choose a random character from that

I{e{R}¶bH{Re⁾⌡@R¶}}¹∑e⌡k  main program

I                         increase the 1st input - N
 {                }       N times do
  e                         push the variable e, which is here initialised to the next input - W
   { }                      E times do
    R                         execute R
      ¶                     push a newline
       bH                   push b-1, where b is initialised to the next input - H
         {       }          B-1 times do
          R                   execute R
           e⁾                 push e-2 aka width-2
             ⌡@               push that many spaces
               R              execute R
                ¶             push a newline
                   ¹∑     join the stack together
                     e⌡k  remove the first width characters

18 bajtów bez losowych znaków: /

dzaima
źródło
3

Java 8, 203 188 168 133 132 130 128 126 bajtów

W->H->N->{for(double i=0,j,q;++i<H*N+H;)for(j=W,q=10;j-->=0;q=i%H*j<1|j>W-2?33+Math.random()*94:32)System.out.print((char)q);}

Wypróbuj online!

Roberto Graham
źródło
133 bajty:W->H->N->{for(int i=0,j;i++<H*N+H-1;){char c=10;for(j=W;j-->0;c=i%H<1|j>W-2|j<2?(char)(Math.random()*94+33):32)System.out.print(c);}}
Nevay
Obecnie drukujesz wynik W-1, wewnętrzna pętla musi wykonać dodatkową iterację ( >=0+1 bajt).
Nevay
1
132 bajty:W->H->N->{for(int i=0,j;i++<H*N+H-1;){char c=10;for(j=W;j-->=0;c=i%H*j<1|j>W-2?(char)(Math.random()*94+33):32)System.out.print(c);}}
Nevay
2
;++i<H*N+H;: -2 bajty.
Olivier Grégoire,
3

Haskell , 226 220 211 190 bajtów

import System.Random
a=mapM id
b=(putStr.unlines=<<).a
c=randomRIO('!','~')
r w=a$c<$[1..w]
s w=a$c:(return ' '<$[3..w])++[c]
(w#h)0=b$s w<$[2..h]
(w#h)n=do{b$(s w<$[2..h])++[r w];(w#h)$n-1}

Wypróbuj online!

Zaoszczędzono 9 bajtów dzięki Laikoni

Zaoszczędzono 21 bajtów dzięki wchargin

Powinny być grywalne ( b$(s w)<$[2..h]i b$((s w)<$[2..h])++[r w]). Nie czuję się dobrze z IO i golfem.

Jferard
źródło
Można używać notacji Infix dla t w h n= ...: (w#h)n= .... puremożna użyć zamiast return. Możesz upuścić nawiasy wokół (d ' ')<$i (s w)<$.
Laikoni
@Laikoni Następnym razem nie zapomnę notacji infix! Dzięki.
Jferard
1
Zaoszczędź kilka bajtów za pomocą c=randomRIO('!','~'), co również pozwoli Ci wstawić d=return. Ponadto mapM idjest o jeden bajt krótszy niż sequence.
wchargin
1
@wchargin Thanks. Nauczyłem się dziś czegoś!
Jferard
2

JavaScript (ES6), 144 bajty

(w,h,n)=>Array(n+1).fill(("#".padEnd(w-1)+`#
`).repeat(h-1)).join("#".repeat(w)+`
`).replace(/#/g,_=>String.fromCharCode(33+Math.random()*94|0))

Tworzy drabinę z #postaci, a następnie zamienia każdą z nich na losowy znak ASCII.

Test Snippet

Justin Mariner
źródło
String.fromCharCode i Math.random w jednym rozwiązaniu - dlaczego JavaScript nas nienawidzi ?! Wymyśliłem to dla 137 bajtów, co jest bardzo podobne do twojego, tylko bez tablicy. Zastanawiam się teraz, czy rekurencyjne rozwiązanie może być jeszcze krótsze; zbada później.
Kudłaty
2

JavaScript (ES6), 129 117 bajtów

Niestety, kiedy grałem w golfa, Arnauld pobił mnie do podobnego, ale krótszego rozwiązania . Łącząc nasze 2 rozwiązania, może to być 113 bajtów

Zawiera końcowy znak nowej linii.

(w,h,n)=>(g=c=>l?(c++<w?c%w>1&&l%h?` `:String.fromCharCode(94*Math.random()+33|0):`
`)+g(c>w?!--l:c):``)(0,l=h*++n-1)

Spróbuj

o.innerText=(f=
(w,h,n)=>(g=c=>l?(c++<w?c%w>1&&l%h?` `:String.fromCharCode(94*Math.random()+33|0):`
`)+g(c>w?!--l:c):``)(0,l=h*++n-1)
)(i.value=5,j.value=3,k.value=2);oninput=_=>o.innerText=f(+i.value,+j.value,+k.value)
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;padding:0 0 0 5px;width:100px;}
<label for=i>W: </label><input id=i min=3 type=number><label for=j>H: </label><input id=j min=2 type=number><label for=k>N: </label><input id=k min=2 type=number><pre id=o>

Kudłaty
źródło
2

Japt -R , 42 41 40 37 34 28 25 bajtów

Pobiera dane wejściowe w kolejności H,W,N.

;*°WÉ ÆJ²ùVXgJùU¹r,@EÅöÃé

Spróbuj

Kudłaty
źródło
1

QBIC , 76 bajtów

[:*:+b-1|G=chr$(_r33,126|)~a%b\[:-2|G=G+@ `]][e|G=G+chr$(_r33,126|)]?_sG,1,e

Wyjaśnienie

[                       FOR a = 1 TO
 :                         input 1 (Height, now in var b)
  *                        times
   :                       input 2 (# of rungs, now in var c)
    +b-1|                  plus one bottom rung without crossbar
G=chr$(_r33,126|)       Assign to G a random char (_r is the RAND() function, chr$() is BASIC's num-to-char)
~a%b|                   IF we are not at a crossbar (the modulo returns anything but 0), 
  [:-2|G=G+@ `            add to G x spaces, where x is width (input 3, now 'e') - 2
                        Note that G is now either 'X' or 'X   '  (for rnd char X and W=5)
]]                      Close the spacing FOR, close the IF 
[e|                     FOR f = 1 to width
  G=G+chr$(_r33,126|)]     Append to G a rnd char
                        G is now either 'XXXXXX'  or 'X   XXXXX' (for rnd char X and W=5)
?_sG,1,e                PRINT the first w characters of G, and on to the next line

Przykładowy przebieg

Command line: 3 2 5
N   F
M   `
Bj#=y
!   (
S   N
q(.Ho
%   7
g   ,
Steenbergh
źródło
1

MATL , 63 50 bajtów

-13 bajtów dzięki Luisowi Mendo

Q*qXJ*6Y2HY)wT3$ZrJ3G3$eJ3G&Ol5LZ(J:HG\~3GTX"!+g*c

Wypróbuj online!

Nadal jestem nowy w golfie w MATL (i nie jestem zbyt dobry w MATLAB pod tym względem), więc wiem, że prawdopodobnie nie jest to optymalne. Wskazówki są mile widziane. Porządkuje dane wejściowe w kolejnościN,H,W .

No to ruszamy:

Q*qXJ                     # compute H*(N+1)-1, store as J
     *                    # multiply by W
      6Y2HY)              # push printable ASCII
            wT3$Zr        # sample uniformly with replacement
                  J3G3$e  # reshape to make a matrix of the appropriate shape.

Mamy teraz macierz losowego char.

J3G                       # push J,W
   &O                     # zero matrix, J x W
     l5LZ(                # assign 1 to first and last columns

Teraz istnieje również logiczna matryca dla szyn.

J:                        # push J, range, so 1...J
  HG                      # take second input (H)
    \~                    # mod and bool negate (so it's 1 for rows of multiples of H)
      3GTX"!              # repmat and transpose so we have 1's for rungs

Teraz na stosie mamy 3 macierze:

  • Góra: 0 dla szczebli bez, 1 w przeciwnym razie
  • Środkowy: 0 dla non-rail, 1 w przeciwnym razie
  • U dołu: losowe postacie, -20

Więc wykonujemy następujące czynności:

+                         # add the top two matrices.
 g                        # convert to logical so 0->0, nonzero->1
   *                      # elementwise multiply
    c                     # convert to char, implicit output (0 -> space).
Giuseppe
źródło
Oto kilka szybkich wskazówek: X"jest 3$domyślnie. 6Y2może być przydatny zamiast 13:106... 20+. ~~jest g. J3G&Ol5LZ(można użyć zamiast1F3G2-Y"h1hJT3$X"
Luis Mendo
@LuisMendo Ah, nie do końca przeszedłem przez wszystkie dokumenty, inaczej bym to odkrył X". W tej ostatniej wskazówce 5Ljest, [1 0]ale nie jestem pewien, jak to jest używane w połączeniu z Z(- Rozumiem, że przypisuje 1do pierwszej i ostatniej kolumny, ale nie rozumiem, jak to się robi 5LZ(. Pewnie później będę cię pingować w MATL CHATL, więc nie przejmuj się tym na razie.
Giuseppe,
1
Indeksowanie jest modułowe, więc 0jest takie samo jak „koniec”. Z(przypisuje do kolumn. Oczywiście, możesz pingować mnie na czacie!
Luis Mendo,
1

PowerShell, 102 bajty

param($w,$h,$n)1..(++$n*$h-1)|%{$l=$_%$h
-join(1..$w|%{[char](32,(33..126|Random))[!$l-or$_-in1,$w]})}

Skrypt testu mniej golfowego:

$f = {

param($w,$h,$n)
1..(++$n*$h-1)|%{       # for each lines of the ladder
    $l=$_%$h            # line number in a step
    -join(1..$w|%{      # make a line
        [char](32,(33..126|Random))[!$l-or$_-in1,$w]
    })                  # a random character if the line number in a step is a rung line or char position is 1 or width
                        # otherwise a space
}

}

&$f 5 3 2
&$f 3 2 2
&$f 12 4 5
&$f 20 5 3

Wynik:

0   {
H   S
']UxR
G   ]
3   t
q^R8O
q   y
t   J
U h
YQZ
_ i
3#D
I #
=          m
&          <
]          6
8nmuyw2'Y7%+
o          l
;          !
D          M
Fn[zGfT";RYt
@          B
$          e
z          @
@J[1|:-IS~y<
(          L
:          [
|          q
zBow0T0FnY8)
/          *
e          B
R          p
9{d2(RacBdRj
u          ~
`          l
J          h
v                  t
T                  -
v                  H
'                  Y
IS7{bx2&k@u7]o}>[Vq?
F                  U
?                  U
|                  Q
}                  T
:wv1wEfc6cS;430sigF|
<                  L
:                  }
*                  `
H                  =
L8k5Q/DQ=0XIUujK|c6|
j                  =
!                  p
V                  :
#                  w
mazzy
źródło
1

Rubinowy , 71 bajtów

EDYCJA: Ups Myślałem, że to nowe wyzwanie ze względu na ostatnią edycję, aby naprawić literówkę. Nadal jednak to zostawiam, ponieważ nie ma jeszcze na to odpowiedzi Ruby.

->w,h,n{(1..h*-~n-1).map{|i|[*?!..?~].sample(x=i%h>0?2:w)*(' '*(w-x))}}

Wypróbuj online!

Wartość tuszu
źródło