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    

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

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
}

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

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

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ę!)


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

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.


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!


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
}

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).


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


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




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: /


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!


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.


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


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>



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   ,

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).

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

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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.