Kaos bir ASCII merdivenidir


43

Hiçbir şey bilmiyorsun " Kaos merdivendir " için yaptığım şeyler , televizyon dizisi Game of Thrones'ın unutulmaz bir çizgisidir.

Bu zorluğun amacı ASCII sanatında kaostan bir merdiven inşa etmektir.

Meydan okuma

Giriş

  • Merdiven genişliği, W >= 3(tam sayı)
  • Adım yüksekliği, H >= 2(tam sayı)
  • Basamak sayısı, N >= 2(tam sayı).

Çıktı

Her biri 1 karakter genişliğinde, yatay basamaklı ve dikey raylı merdiven . Merdiven genişliği ( W) iki rayı içerir ve adım yüksekliği ( H) karşılık gelen basamağı içerir.

En üst ve en alt kısım dahil olmak üzere tüm basamaklar, H-1doğrudan yukarının ve aşağısında bir dikey dikey ray parçasına sahip olacaktır . Örnek bunu daha net hale getirecek.

Merdiven basılabilir, beyaz olmayan ASCII karakterlerinden oluşacaktır , yani !(kod noktası 33) ile ~(kod noktası 126) arasında değişen aralık . Gerçek karakterler rastgele seçilecektir . Girdiler göz önüne alındığında, rastgele karakter seçeneklerinin her birinin sıfır olasılığı bulunmalıdır. Bunun dışında, olasılık dağılımı keyfidir.

Yatay veya dikey olarak lider veya iz bırakan boşluklara izin verilir.

Örnek

Verilen W=5, H=3, N=2, olası bir çıktı aşağıdaki gibidir.

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

Basamakların ve dikey bölümlerin H*(N+1)-1olduğu gibi toplam yüksekliğin de olduğuna dikkat edin .NN+1

Ek kurallar

  • Giriş araçları ve format her zamanki gibi esnektir . Örneğin, üç sayıyı herhangi bir sırayla veya bunları içeren bir dizi girebilirsiniz.

  • Çıktı, STDOUT veya bir işlev tarafından döndürülen bir argüman olabilir. Bu durumda, yeni satırlı bir dize, 2B karakter dizisi veya bir dizge dizisi olabilir.

  • Bir program veya bir işlev sağlanabilir.

  • Standart boşluklar yasaktır.

  • Bayt cinsinden en kısa kod kazanır.

Test durumları

Her biri W, H, Niçin olası bir çıktı gösterilir.

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    

ascii karakterleri için (sayısal) aralığı ekleyebilir misiniz?
Rod

@Rod İyi fikir. Tamamlandı
Luis Mendo

1
Rasgelelik kalitesi konusunda ne tür bir alt sınır vardır? Rastgele bir noktada başlamanın ve artan modulo (126-33) 'nin bitişik değerler arasındaki bariz korelasyon nedeniyle kalifiye olmayacağını varsayıyorum. Yoksa mümkün olan her sekansı üretebilmesi mi gerekiyor? (8 bitlik doğrusal bir eşlenik üretici işe yaramaz, çünkü bir karakter bir sonraki karakteri benzersiz bir şekilde belirler mi?)
Peter Cordes

@PeterCordes Her olası kombinasyon ortaya çıkabildiği sürece, bazı korelasyonlarda sorun yoktur . Tanımladığınız yaklaşım, dediğiniz gibi, geçerli değil çünkü farklı konumlardaki karakterler arasında çok güçlü istatistiksel bağımlılık yaratıyor, bazı kombinasyonları imkansız kılıyor
Luis Mendo

1
@PeterCordes Evet, teorik olarak demek istedim. RNG gücü hakkında endişelenmeyin; RNG'nin ideal olduğunu varsayabilirsin. Bununla ilgili bazı meta fikir birliği var. Daha spesifik bir şey olduğunu düşünmüştüm, fakat bulabildiğim tek şey bu ve bu oldu
Luis Mendo

Yanıtlar:


6

Jöle ,  24 23  22 bayt

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

Tam bir programı üç argüman alarak W, H, Nve sonucu baskı.

Çevrimiçi deneyin!

Nasıl?

Tek basamağın 2d dizisi maskesini ve altındaki düşey bölümlerini oluşturur, N+1zamanlarını tekrarlar ve üst basamağı kaldırır, ardından maske değerine bağlı olarak rasgele karakterler veya boşluklar yerleştirir.

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

İşlem Flashpoint kodlama dili, 643 624 bayt

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}

Gülünç derecede uzun çünkü karakter kodlarından karakter oluşturmanın yolu yok.

İle ara:

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

Çıktı:

Merdiveni fazla karmakarışık çünkü yazı tipi monospaced değil.

unrolled:

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
}

Sanki görünüyor "\n", işlerin "\xa3"gibi bir şey almak için £çalışmıyor? unicode kaçışlarını kullanabilirseniz, bu dizinizi düzeltebilirsiniz.
Tschallacka

Bunu kendim nasıl yönetebilirim? : D
Geeky

22
Bu sadece bir senaryo yazılmış ve boşluklar ve yeni satırlar kaldırılmış gibi görünüyor. Sadece bir merdiven görüntüsü yüzünden mi yükseliyor, yoksa akıllıca bir golf oynamayı mı kaçırdım?
Jonathan Allan,

@steadybox, şu xD sorusunda otlak olmayan bir ekran görüntüsü talep ettikten sonra bağlamsal ekran görüntüleri kullanıyor musunuz?
Magic Octopus Urn

@Tschallacka \ntanınan tek kaçış. (Ve ""içini alıntı yapmak için tırnak işaretleri içindedir ")
Steadybox 15:17

14

05AB1E , 29 bayt

Siparişte alınan giriş N, H, W

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

Çevrimiçi deneyin!

açıklama

>*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

Bu biraz aldatma.
vdegenne

4
@ user544262772 neden öyleyse?
Jonathan Allan,

Bunu biraz açıklayabilir misin?
Mischa

@MischaBehrend: Tabii, şimdi bir açıklama ekledim.
Emigna

3
@ user544262772 bir golf dilinde iyi bir golf yanıtı vermek oldukça zor olabilir, inan bana, golf için tasarlandılar, ancak bunları kullanmak genellikle biraz düşünmeyi gerektiriyor (tam olarak istediğin gibi bir yerleşik değil. ").
Jonathan Allan,

13

C, 95 bayt

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 bayt

Neal Fultz sayesinde -13 bayt!

Robin Ryder sayesinde -1 bayt

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}

Çevrimiçi deneyin!

Anonim işlev; sonucu matris olarak döndürür.

O sayesinde Kelime Izgaralar sorusuna , ben daha çok normalden daha matrisleri hakkında düşünme oldum. Basamakların, basamak yüksekliğinin bir katı olan H(R, 1 indeksli) matris satırlarında olduğunu ve rayların ilk ve son sütunlar olduğunu 1ve W. Böylece, rastgele ASCII karakterlerinden oluşan bir matris yaratıyorum ve bu ölçütlere uymayan harfleri boşluklarla değiştiriyorum ve matrisi döndürüyorum. TIO bağlantısı güzel yazdırıyor.

Neal Fultz, boşluk karakterleri için farklı katmanlar dizisi önerdi [-H*(1:N),3:W-1]; bu, katları olmayan satırlar dışındaki tüm karakterleri değiştirir H: -H*(1:N)kenarda değil, 3:W-1<==> 2:(W-1).

R , 121 bayt

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

Çevrimiçi deneyin!

Başladığım orijinal matris tabanlı yaklaşım üzerinde bir gelişme; aynı algoritmadır, ancak fordöngüler bir matris oluşturmaktan ve yazdırmaktan daha kısadır (ancak yazdırmazsam olmaz!)


m[-H*(1:N),3:W-1]=" "biraz daha kısa görünüyor - testi her zaman rowve col2 boyutlu dilimle değiştirebilirsiniz.
Neal Fultz 19:17

@NealFultz vay, bu oldukça mükemmel! Teşekkür ederim!
Giuseppe

Değiştirerek -1 bayt sample(33:126,...)ile 32+sample(94,...).
Robin Ryder


6

Kömür , 34 32 bayt

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

Çevrimiçi deneyin! N, H, W. sırayla girdi alır. Ayrıntılı yaklaşım ( Plus(InputNumber(), 1)şu an TIO'da bozulmuştur). Açıklama:

E…¹×⁺¹NN

Aralığın üzerinde eşleyin 1..H*(N+1). Bunun anlamı, basamakların ibir çok olduğu zaman görünmesidir H.

Sonuçlarına katılın:

EIζ

örtülü aralık üzerinde haritalama 0..W:

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

Sütun değilse 0veya W-1ve satırın katı değilse, Hbir boşluk çıkar;

§⮌γ‽⁹⁴

Aksi takdirde, önceden tanımlanmış ASCII karakter değişkenini alın, ters çevirin (boşluğu 94. sıraya koymak) ve şimdi ilk 94 olandan rastgele bir karakter yazdırın Slice. (Çünkü berbat.)

ω

Boş dizgiyi kullanarak katılın. Nihai sonuç dolaylı olarak yazdırılır.


Değil emin yararlı olur ama eğer olabilir merdiveni çizin ve ardından peekall ve rastgele yazdırılabilir Bence üzerinde map? EDIT Kırılmış gibi görünüyor. Hata.
ASCII sadece

Düzeltmeye çalışacağım (daha önce çalıştığından eminim) ama biraz meşguldüm, bu yüzden biraz zaman alabilir
ASCII-sadece

@ ASCII-Sadece düşündüğünüzü varsayıyorum NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«? Ben ikiye böldüm ve a0a6316kırdım.
Neil

@ ASCII-only Aslında bu tam olarak doğru değil, ne zaman Mapkullanıldığı not is_commandanlamında ilgisiz bir hata vardı is_command. Demek NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴o böceğin olmasaydı yazman gerekiyordu .
Neil

6

C (gcc) , 141 131 114 109 107 bayt

Bu biraz golf oynamak mümkün olmalı ...

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

Çevrimiçi deneyin!


i=1küresel bildirimde düzenleme yapabilir miyiz ?
Mukul Kumar

6

Perl 6 , 76 73 bayt

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

Çevrimiçi deneyin!

Argümanlar olarak (h, n, w) alır. Dizelerin bir listesini döndürür.

Açıklama:

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

Alternatif 73 byter kullanarak xxve ++$yerine map. Belki baytlarda golf oynamak için bir yer bulabilirsin?
Jo King,

5

PowerShell , 132 124 bayt

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

Çevrimiçi deneyin!

Sadece #ilk önce oluşturulmuş bir merdiven inşa ediyoruz ( örnek ), sonra |%{...}her karakterin etrafında dönüyoruz ve ifbunun için uygun bir aralıktan yeni bir karakter çıkarıyoruz . Aksi takdirde çıktı (yani, bir boşluk veya yeni satır).-eq35Random


5

JavaScript (ES6), 117 115 bayt

Çıktı karakterini karakter karakterine göre tekrarlayan bir fonksiyon.

"Bak anne, değişmez satır besleme yok!"

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

gösteri


Lanet olsun! Bunu gördüğümde golf oynama sürecindeydim . : \ Yine kazandın! : p
Shaggy

Golf madenini düşürdüm (şimdilik) - İçimdeki tüm saydamları harekete geçirme çizgisini çizdim String.fromCharCode, çünkü bunu gördükten sonra kendimle geleceğimi söyleyemedim. Benimkini şimdi seninkine çok benziyorsa bana bildir .
Shaggy

@Shaggy Endişelenme! (Aslında, cevabını sadece benim gönderimden sonra gördüm. Daha önce görseydim, muhtemelen
pes

1
Ah, oyunun niteliği bu! :) Çözümlerimizi birleştirmek , bu arada 113 byte verir
Shaggy




3

SOGL V0.12 , 32 31 bayt

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

Burada dene!

N, W, H sırasıyla giriş

Açıklama:

 ~Δ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

Rastgele karakterler olmadan 18 bayt : /


3

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

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

Çevrimiçi deneyin!


133 bayt: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

Şu anda sonucu yazdırıyorsunuz, W-1iç döngü ek bir yineleme yapmak zorunda ( >=0+1 byte).
Nevay

1
132 bayt: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 bayt.
Olivier Grégoire

3

Haskell , 226 220 211 190 bayt

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}

Çevrimiçi deneyin!

Laikoni sayesinde 9 bayt kaydedildi

Wchargin sayesinde 21 bayt kaydedildi

Golf edilebilir ( b$(s w)<$[2..h]ve b$((s w)<$[2..h])++[r w]) olmalı . IO ve golf ile rahat hissetmiyorum.


Aşağıdakiler için infix gösterimini kullanabilirsiniz t w h n= ...: (w#h)n= .... pureyerine kullanılabilir return. Parantezleri (d ' ')<$ve çevresine bırakabilirsiniz (s w)<$.
Laikoni,

@Likonikon Bir dahaki sefere infix gösterimini unutmayacağım! Teşekkürler.
43'te

1
c=randomRIO('!','~')Satır içi için izin veren bir grup baytı da kaydedin d=return. Ayrıca, mapM idbir bayttan daha kısa sequence.
wchargin

1
@wchargin Teşekkürler. Bugün bir şey öğrendim!
17'de

2

JavaScript (ES6), 144 bayt

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

#Karakterlerin dışına çıkan merdiveni oluşturur, ardından her birini rastgele bir ASCII karakteri ile değiştirir.

Test Parçacığı


String.fromCharCodeve Math.randombir çözümde - JavaScript neden bizden nefret ediyor ?! İle geldi bu sadece dizinin olmadan, sizinkine çok benzer 137 bayt için. Şimdi özyinelemeli bir çözüm hala daha kısa olabilir mi merak ediyorum; daha sonra araştıracak.
Shaggy


2

JavaScript (ES6), 129 117 bayt

Ne yazık ki, ben bu golf oynamak sürecinde iken, Arna beni benzer ama daha kısa bir çözümle yenmişti . 2 çözümümüzü birleştirerek, bu 113 bayt olabilir

Takip eden bir yeni hat içerir.

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

Dene

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 bayt

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

açıklama

[                       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

Örnek çalışma

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

1

Matl , 63 50 bayt

-13 byte Luis Mendo sayesinde

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

Çevrimiçi deneyin!

MATL'de golf oynamak için hala yeniyim (ve bu konuda MATLAB'da çok iyi değilim), bu yüzden muhtemelen optimal olamayacağını biliyorum. İpuçları açıktır. Sırayla girişi alır N,H,W.

İşte başlıyoruz:

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.

Şimdi rastgele bir karakter matrisimiz var.

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

Şimdi raylar için mantıklı bir matris de var.

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

Şimdi yığında 3 matrisimiz var:

  • Üst: basamak olmayanlar için 0, aksi takdirde 1
  • Orta: demiryolu olmayanlar için 0, aksi takdirde 1
  • Alt: rastgele karakterler, -20

Bu yüzden aşağıdakileri yaparız:

+                         # add the top two matrices.
 g                        # convert to logical so 0->0, nonzero->1
   *                      # elementwise multiply
    c                     # convert to char, implicit output (0 -> space).

İşte birkaç kısa ipucu: X"olup 3$varsayılan olarak. ... 6Y2yerine kullanışlı olabilir . olduğunu . yerine kullanılabilir13:10620+~~gJ3G&Ol5LZ(1F3G2-Y"h1hJT3$X"
Luis Mendo

@ LouisMendo Ah, ben tüm dokümanlar üzerinden tam olarak yapmadım ya da ben bu konuda keşfettim X". Bu son ipucu olarak, 5Lolduğunu [1 0]ama bununla birlikte kullanıldığında emin nasıl değilim Z(- Ben atadığına olsun 1ilk ve son sütunlara ama nasıl alamadım 5LZ(o yapar. Muhtemelen bir süre sonra bu konuda MATL CHATL'a ping atıyorum, bu yüzden şimdilik endişelenme.
Giuseppe

1
İndeksleme modülerdir, 0"son" ile aynıdır. Z(sütunlara atar. Tabii ki, beni sohbete atmaktan çekinmeyin!
Luis Mendo

1

Powershell, 102 bayt

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

Daha az golf oynadığı test senaryosu:

$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

Çıktı:

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

Ruby , 71 bayt

EDIT: Hata! Bir yazım hatası lol düzeltmek için son düzenleme nedeniyle bunun yeni bir sorun olduğunu düşündüm. Yine de bunu bırakıyorum çünkü bunun için henüz Ruby cevabı yok.

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

Çevrimiçi deneyin!

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.