Chaos adalah tangga ASCII

43

Anda tidak tahu apa - apa Hal-hal yang saya lakukan untuk " Chaos is a ladder " adalah kalimat yang mengesankan dari serial televisi Game of Thrones .

Tujuan dari tantangan ini adalah untuk membangun tangga dari kekacauan, dalam seni ASCII.

Tantangan

Memasukkan

  • Lebar tangga, W >= 3(integer)
  • Tinggi langkah, H >= 2(bilangan bulat)
  • Jumlah anak tangga, N >= 2(bilangan bulat).

Keluaran

Tangga dengan anak tangga horizontal dan rel vertikal , semuanya memiliki 1 karakter. Lebar tangga ( W) termasuk dua rel, dan tinggi langkah ( H) termasuk anak tangga yang sesuai.

Semua anak tangga, termasuk yang paling atas dan yang paling bawah, akan memiliki sepotong rel vertikal yang panjangnya H-1langsung di atas dan di bawah. Contohnya akan membuat ini lebih jelas.

Tangga akan dibuat dari karakter ASCII yang dapat dicetak dan bukan spasi , yaitu rentang inklusif dari !(titik kode 33) ke ~(titik kode 126). Karakter aktual akan dipilih secara acak . Mengingat input, masing-masing pilihan karakter acak harus memiliki probabilitas nol. Selain itu, distribusi probabilitas bersifat arbitrer.

Ruang putih terkemuka atau trailing , baik horisontal maupun vertikal, diizinkan.

Contoh

Diberikan W=5, H=3, N=2, satu output yang mungkin adalah sebagai berikut.

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

Perhatikan bahwa tinggi total adalah H*(N+1)-1, karena ada Nanak tangga dan N+1bagian vertikal.

Aturan tambahan

  • Sarana input dan format fleksibel seperti biasa. Misalnya, Anda dapat memasukkan tiga angka dalam urutan apa pun, atau larik yang memuatnya.

  • Output dapat melalui STDOUT atau argumen yang dikembalikan oleh suatu fungsi. Dalam hal ini mungkin string dengan baris baru, array karakter 2D, atau array string.

  • Program atau fungsi dapat disediakan.

  • Celah standar dilarang.

  • Kode terpendek dalam byte menang.

Uji kasus

Untuk setiap W, H, Noutput yang mungkin ditampilkan.

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
sumber
dapatkah Anda menambahkan rentang (numerik) untuk karakter ascii?
Rod
@Rod Ide bagus. Selesai
Luis Mendo
1
Apa batas bawah pada kualitas keacakan yang ada? Saya berasumsi mulai dari titik acak dan modulo tambahan (126-33) tidak akan memenuhi syarat karena korelasi yang jelas antara nilai-nilai yang berdekatan. Atau apakah itu harus mampu menghasilkan setiap urutan yang mungkin? (Jadi generator 8-bit linear congruential tidak akan berfungsi, karena satu karakter secara unik menentukan karakter selanjutnya?)
Peter Cordes
@PeterCordes Tidak ada masalah dengan memiliki beberapa korelasi, selama setiap kombinasi yang mungkin dapat terjadi. Pendekatan yang Anda gambarkan adalah, seperti yang Anda katakan, tidak valid karena memperkenalkan ketergantungan statistik yang terlalu kuat antara karakter pada posisi yang berbeda, membuat beberapa kombinasi menjadi tidak mungkin
Luis Mendo
1
@PeterCordes Ya, maksud saya secara teoritis. Jangan khawatir tentang kekuatan RNG; Anda dapat menganggap RNG ideal. Ada beberapa konsensus meta tentang itu. Saya pikir ada sesuatu yang lebih spesifik, tetapi yang bisa saya temukan adalah ini dan ini
Luis Mendo

Jawaban:

6

Jelly ,  24 23  22 byte

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

Sebuah program penuh mengambil tiga argumen W, H, Ndan mencetak hasilnya.

Cobalah online!

Bagaimana?

Membangun topeng array 2d dari satu anak tangga dan bagian vertikal di bawahnya, mengulanginya N+1berkali-kali dan menghapus anak tangga teratas kemudian menempatkan karakter atau spasi acak tergantung pada nilai topeng.

«þỊ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
sumber
34

Pengoperasian Bahasa skrip Flashpoint , 643 624 byte

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}

Sangat panjang karena tidak ada cara untuk membuat karakter dari kode karakter.

Telepon dengan:

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

Keluaran:

Tangga ekstra kacau karena font tidak monospace.

Belum dibuka:

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
sumber
Sepertinya "\n"bekerja, "\xa3"untuk mendapatkan sesuatu seperti £tidak berhasil? jika Anda dapat menggunakan unicode escapes, Anda mungkin dapat memotong array milik Anda.
Tschallacka
Bagaimana saya bisa menjalankan ini sendiri? : D
Geeky I
22
Ini hanya terlihat seperti skrip yang ditulis dan spasi serta baris baru dihapus. Apakah ini hanya mendapatkan upvotes karena gambar tangga atau apakah saya melewatkan golf yang cerdas?
Jonathan Allan
@steadybox apakah Anda menggunakan tangkapan layar kontekstual sekarang setelah saya meminta tangkapan layar non-rumput pada satu pertanyaan xD?
Magic Octopus Guci
@Tschallacka \nadalah satu-satunya jalan keluar yang dikenali. (Dan ""kutipan di dalam untuk mewakili satu ")
Steadybox
14

05AB1E , 29 byte

Masukan diambil dalam urutan N, H, W

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

Cobalah online!

Penjelasan

>*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
sumber
Ini agak curang.
vdegenne
4
@ user544262772 mengapa demikian?
Jonathan Allan
dapatkah kamu menjelaskan ini sedikit?
Mischa
@MischaBehrend: Tentu, saya sudah menambahkan penjelasan sekarang.
Emigna
3
@ user544262772 bisa sangat menantang untuk membuat jawaban yang golf dengan baik dalam bahasa golf, percayalah, mereka dirancang untuk bermain golf, tetapi menggunakannya biasanya memerlukan beberapa pemikiran (kecuali hanya "inilah built-in yang melakukan apa yang Anda inginkan." ").
Jonathan Allan
13

C, 95 byte

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
sumber
8

R , 138 129 111 98 93 byte

-13 byte berkat Neal Fultz!

-1 byte terima kasih kepada 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}

Cobalah online!

Fungsi anonim; mengembalikan hasilnya sebagai matriks.

Berkat pertanyaan Word Grids , saya telah memikirkan matriks jauh lebih banyak dari biasanya. Saya mengamati bahwa anak tangga berada pada baris matriks yang merupakan kelipatan dari tinggi langkah H(R adalah 1-diindeks), dan bahwa rel adalah kolom pertama dan terakhir, 1dan W. Jadi saya membuat matriks karakter ASCII acak, dan mengganti huruf-huruf yang tidak cocok dengan kriteria tersebut dengan spasi, dan mengembalikan matriks. TIO link mencetaknya dengan baik.

Neal Fultz menyarankan pengindeksan yang berbeda untuk karakter spasi [-H*(1:N),3:W-1],, yang menggantikan semua karakter kecuali untuk yang ada dalam baris kelipatan dari H: -H*(1:N)dan tidak di tepi, 3:W-1<==> 2:(W-1).

R , 121 byte

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

Cobalah online!

Peningkatan atas pendekatan berbasis matriks asli yang saya mulai dengan; itu algoritma yang sama tetapi forloop lebih pendek daripada membangun dan mencetak matriks (tetapi tidak jika saya tidak mencetaknya!)

Giuseppe
sumber
m[-H*(1:N),3:W-1]=" "tampaknya sedikit lebih pendek - Anda selalu dapat mengganti pengujian rowdan coldengan irisan 2-d.
Neal Fultz
@NealFultz wow, itu sangat bagus! Terima kasih!
Giuseppe
-1 byte dengan mengganti sample(33:126,...)dengan 32+sample(94,...).
Robin Ryder
6

Perl 5 , 81 byte

80 byte kode +1 untuk -p.

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

Cobalah online!

Dom Hastings
sumber
ruang setelah \ d + dapat dihapus karena pertandingan serakah
Nahuel Fouilleul
6

Arang , 34 32 byte

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

Cobalah online! Mengambil input dalam urutan N, H, W. Verbose ( Plus(InputNumber(), 1)saat ini rusak pada TIO). Penjelasan:

E…¹×⁺¹NN

Peta lebih dari jangkauan 1..H*(N+1). Ini berarti bahwa anak tangga muncul ketika ikelipatan H.

Bergabunglah dengan hasil:

EIζ

pemetaan rentang implisit 0..W:

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

jika kolom tidak 0atau W-1baris bukan kelipatan Hmaka output spasi;

§⮌γ‽⁹⁴

jika tidak, ambil variabel karakter ASCII yang telah ditentukan, balikkan (menempatkan spasi di tempat ke-94), dan cetak karakter acak dari apa yang sekarang menjadi 94. (Karena Slicepayah.)

ω

Bergabunglah menggunakan string kosong. Hasil akhir dicetak secara implisit.

Neil
sumber
Tidak yakin apakah itu membantu tetapi Anda bisa menggambar tangga dan kemudian mengintip dan memetakan melalui cetak acak saya pikir? EDIT Tampaknya rusak. Ups.
ASCII-only
Saya akan mencoba memperbaikinya (cukup yakin itu bekerja sebelumnya) tapi saya sudah agak sibuk sehingga mungkin butuh waktu
ASCII-hanya
@ ASCII-saja saya menganggap Anda sedang memikirkan NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«? Yah, saya membagi dua dan melakukan a0a6316merusaknya.
Neil
@ ASCII-only Sebenarnya itu tidak sepenuhnya benar, ada bug yang tidak terkait di Mapmana ia digunakan not is_commandsaat itu berarti is_command. Jadi, Anda seharusnya menulis NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴jika bukan karena bug itu.
Neil
6

C (gcc) , 141 131 114 109 107 byte

Harus bisa bermain golf ini sedikit ...

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

Cobalah online!

Cleblanc
sumber
dapatkah kita mengedit i=1dalam deklarasi global?
Mukul Kumar
6

Perl 6 , 76 73 byte

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

Cobalah online!

Mengambil (h, n, w) sebagai argumen. Mengembalikan daftar string.

Penjelasan:

-> \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
sumber
Alternatif 73 byter menggunakan xxdan ++$bukannya map. Mungkin Anda dapat menemukan tempat untuk bermain golf dengan byte apa pun?
Jo King
5

PowerShell , 132 124 byte

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

Cobalah online!

Kami membangun tangga terdiri dari hanya #pertama ( misalnya ), maka loop |%{...}melalui masing-masing karakter dan ifitu -equal untuk 35, kita tarik keluar baru Randomkarakter dari kisaran yang tepat. Kalau tidak, kita output (yaitu, spasi atau baris baru).

AdmBorkBork
sumber
5

JavaScript (ES6), 117 115 byte

Fungsi rekursif membangun karakter keluaran dengan karakter.

"Lihat Ma, tidak ada umpan garis literal!"

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

Demo

Arnauld
sumber
Sial! Saya sedang dalam proses bermain golf turun ketika saya melihat ini. :\ Kamu menang lagi! : p
Shaggy
Saya menyelesaikan permainan golf saya (untuk saat ini) - Saya menarik garis untuk memindahkan semua terner di dalam String.fromCharCode, karena saya tidak bisa dengan jujur ​​mengatakan saya akan mendapatkan itu sendiri setelah melihat ini. Beri tahu saya jika Anda merasa milik saya sekarang terlalu mirip dengan milik Anda.
Shaggy
@ Shaggy, jangan khawatir! (Sebenarnya, saya melihat jawaban Anda hanya setelah memposting milik saya. Jika saya melihatnya sebelumnya, saya mungkin akan menyerah.)
Arnauld
1
Ah, itu sifat permainannya! :) Menggabungkan solusi kami menghasilkan 113 byte , omong-omong
Shaggy
5

Python 2 , 142 byte

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*

Cobalah online!

Bytes yang disimpan berkat ovs!

Tuan Xcoder
sumber
@LuisMendo Saya pikir saya sudah memperbaikinya sekarang.
Tn. Xcoder
@LuisMendo Ini salah saya karena tidak memeriksa dengan cermat.
Tn. Xcoder
42 byte
ovs
@ terima kasih! Anda lupa 1di depan> _>
Tn. Xcoder
4

Pyth, 33 byte

VhEjtW!Nmsm?&d}kr1tQ\ Or\!C127Qvz

Cobalah online: Demonstrasi

Jakube
sumber
3

Python 2 , 114 byte

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*

Cobalah online!

Lynn
sumber
3

SOGL V0.12 , 32 31 byte

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

Coba Di Sini!

Input dalam urutan N, W, H.

Penjelasan:

 ~Δ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 byte tanpa karakter acak: /

dzaima
sumber
3

Java 8, 203 188 168 133 132 130 128 126 byte

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

Cobalah online!

Roberto Graham
sumber
133 byte: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
Anda saat ini mencetak hasilnya W-1, loop dalam harus melakukan iterasi tambahan ( >=0+1 byte).
Nevay
1
132 byte: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 byte.
Olivier Grégoire
3

Haskell , 226 220 211 190 byte

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}

Cobalah online!

Disimpan 9 byte berkat Laikoni

Disimpan 21 byte berkat wchargin

Harus golf ( b$(s w)<$[2..h]dan b$((s w)<$[2..h])++[r w]). Saya tidak merasa nyaman dengan IO dan golf.

jferard
sumber
Anda dapat menggunakan notasi infix untuk t w h n= ...: (w#h)n= .... purebisa digunakan sebagai ganti return. Anda dapat meletakkan tanda kurung di sekitar (d ' ')<$dan (s w)<$.
Laikoni
@Laikoni Saya tidak akan lupa notasi infix di waktu mendatang! Terima kasih.
jferard
1
Menyimpan banyak byte dengan c=randomRIO('!','~'), yang juga memungkinkan Anda sebaris d=return. Juga, mapM idsatu byte lebih pendek dari sequence.
wchargin
1
@wchargin Terima kasih. Saya belajar sesuatu hari ini!
jferard
2

JavaScript (ES6), 144 byte

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

Buat tangga #karakter lalu ganti masing-masing dengan karakter ASCII acak.

Cuplikan Tes

Justin Mariner
sumber
String.fromCharCodedan Math.randomdalam satu solusi - mengapa JavaScript membenci kami ?! Datang dengan ini untuk 137 byte, yang sangat mirip dengan Anda, hanya tanpa array. Saya bertanya-tanya sekarang apakah solusi rekursif mungkin masih lebih pendek; akan menyelidiki nanti.
Shaggy
2

JavaScript (ES6), 129 117 byte

Sayangnya, ketika saya sedang dalam proses bermain golf ini, Arnauld mengalahkan saya ke solusi yang sama tetapi lebih pendek . Dengan menggabungkan 2 solusi kami, ini bisa menjadi 113 byte

Termasuk baris baru yang tertinggal.

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

Cobalah

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>

Shaggy
sumber
2

Japt -R , 42 41 40 37 34 28 25 byte

Mengambil input dalam urutan H,W,N.

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

Cobalah

Shaggy
sumber
1

QBIC , 76 byte

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

Penjelasan

[                       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

Contoh dijalankan

Command line: 3 2 5
N   F
M   `
Bj#=y
!   (
S   N
q(.Ho
%   7
g   ,
steenbergh
sumber
1

MATL , 63 50 byte

-13 byte berkat Luis Mendo

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

Cobalah online!

Saya masih baru bermain golf di MATL (dan saya tidak terlalu bagus di MATLAB dalam hal ini), jadi saya tahu ini mungkin tidak mendekati optimal. Kiatnya diterima. Mengambil input secara berurutan N,H,W.

Kita mulai:

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.

Kami sekarang memiliki matriks char acak.

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

Sekarang ada juga matriks logis untuk rel.

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

Sekarang kita memiliki 3 matriks di stack:

  • Atas: 0 untuk non-anak tangga, 1 sebaliknya
  • Tengah: 0 untuk non-rel, 1 sebaliknya
  • Bawah: karakter acak, -20

Jadi kami melakukan yang berikut:

+                         # 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
sumber
Berikut adalah beberapa tip cepat: X"secara 3$default. 6Y2mungkin berguna bukan 13:106... 20+. ~~adalah g. J3G&Ol5LZ(dapat digunakan sebagai ganti1F3G2-Y"h1hJT3$X"
Luis Mendo
@LuisMendo Ah, saya tidak cukup berhasil melewati semua dokumen atau saya akan menemukan itu X". Pada tip terakhir, 5Ladalah [1 0]tetapi saya tidak yakin bagaimana itu digunakan bersama dengan Z(- Saya mendapatkan bahwa itu menugaskan 1ke kolom pertama dan terakhir tetapi saya tidak mendapatkan bagaimana 5LZ(melakukannya. Saya mungkin akan mem-ping Anda di MATL CHATL beberapa waktu kemudian tentang ini jadi jangan khawatir tentang itu untuk saat ini.
Giuseppe
1
Pengindeksan adalah modular, jadi 0sama dengan "end". Z(ditugaskan ke kolom. Tentu saja, silakan ping saya di chat!
Luis Mendo
1

Powershell, 102 byte

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

Skrip uji yang kurang golf:

$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

Keluaran:

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
sumber
1

Ruby , 71 byte

EDIT: Ups Saya pikir ini adalah tantangan baru karena hasil edit baru-baru ini untuk memperbaiki kesalahan ketik. Saya masih meninggalkan ini karena belum ada jawaban Ruby untuk itu.

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

Cobalah online!

Nilai Tinta
sumber