카오스는 ASCII 사다리입니다


43

당신은 아무것도 몰라 I가하는 일 " 혼돈은 사다리이다가 " 텔레비전 시리즈에서 기억에 남는 라인 왕좌의 게임 .

이 과제의 목적은 ASCII 기술로 혼란에서 사다리를 만드는 것입니다.

도전

입력

  • 사다리 폭 W >= 3(정수)
  • 스텝 높이 H >= 2(정수)
  • 렁 수 N >= 2(정수).

산출

사다리와 수평 렁수직 레일 모두 1 개 문자 폭. 래더 폭 ( W)에는 2 개의 레일이 포함되며 계단 높이 ( H)에는 해당 렁이 포함됩니다.

맨 위와 맨 아래를 포함한 모든 렁은 H-1바로 위와 아래 에 세로 길이의 세로 레일이 있습니다. 이 예는 이것을 더 명확하게합니다.

사다리가보기로한다 인쇄, 공백이 아닌 ASCII 문자 ,의 포함 범위, !(코드 포인트 33에) ~(코드 포인트 126국지적 실제 문자가 선택됩니다) 무작위로 . 입력이 주어지면, 임의의 문자 선택은 각각 0이 아닌 확률을 가져야합니다. 그 외에 확률 분포는 임의적입니다.

가로 또는 세로의 선행 또는 후행 공백 이 허용됩니다.

주어진 W=5, H=3, N=2하나의 가능한 출력은 다음과 같습니다.

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

가로대와 세로 섹션 H*(N+1)-1이 있으므로 총 높이는입니다 .NN+1

중재 규칙

  • 입력 수단과 형식은 평소처럼 유연 합니다. 예를 들어, 3 개의 숫자를 임의의 순서로 입력하거나 숫자를 포함하는 배열을 입력 할 수 있습니다.

  • 출력은 STDOUT 또는 함수에 의해 리턴 된 인수를 통해 이루어질 수 있습니다. 이 경우 개행 문자가 포함 된 문자열, 2D 문자 배열 또는 문자열 배열 일 수 있습니다.

  • 프로그램이나 기능 을 제공 할 수 있습니다.

  • 표준 허점 은 금지되어 있습니다.

  • 바이트 단위의 최단 코드가 이깁니다.

테스트 사례

각각 W, H, N가능한 출력이 표시됩니다.

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 문자의 (숫자) 범위를 추가 할 수 있습니까?
Rod

@로드 좋은 생각. 완료
Luis Mendo

1
임의의 품질에 어떤 종류의 하한이 있습니까? 나는 임의의 지점에서 시작하고 인접한 값 사이의 명백한 상관 관계 때문에 모듈로 (126-33)를 증가시키는 것이 적합하지 않다고 가정합니다. 아니면 가능한 모든 시퀀스를 생성 할 수 있어야합니까? (그래서 합동 생성기 선형 8 비트 것하지 작업 한 문자는 고유의 다음 문자를 결정하기 때문에?)
피터 코르

@PeterCordes 가능한 모든 조합이 발생할 수있는 한, 약간의 상관 관계에 문제가 없습니다 . 설명하는 접근 방식은 다른 위치에있는 문자 사이에 너무 강력한 통계적 의존성을 도입하여 일부 조합을 불가능하게하기 때문에 유효하지 않습니다.
Luis Mendo

1
@PeterCordes 네, 이론적으로 의미했습니다. RNG 강도에 대해 걱정하지 마십시오. RNG가 이상적이라고 가정 할 수 있습니다. 그것에 대한 메타 합의가 있습니다. 좀 더 구체적인 것이 있다고 생각했지만 이것이것
Luis Mendo

답변:


6

젤리 ,  24 23  22 바이트

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

전체 프로그램은 세 개의 인수를 복용 W, H, N그 결과를 인쇄.

온라인으로 사용해보십시오!

어떻게?

단일 렁과 아래의 수직 섹션으로 2D 배열 마스크를 만들고 반복 N+1하고 상단 렁을 제거한 다음 마스크 값에 따라 임의의 문자 또는 공백을 배치합니다.

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

인화점 스크립팅 언어, 643 624 바이트

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}

문자 코드에서 문자를 만들 수있는 방법이 없기 때문에 엄청나게 길다.

전화 :

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

산출:

글꼴이 고정 폭이 아니기 때문에 사다리는 더욱 혼란 스럽다.

풀림 :

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
}

"\n"작동 하지 않는 "\xa3"것 같은 것을 얻는 것이 작동하는 것 같습니다 £. 유니 코드 이스케이프를 사용할 수 있으면 해당 배열을자를 수 있습니다.
Tschallacka

이걸 어떻게 직접 실행할 수 있습니까? : D
Geeky I

22
이것은 스크립트가 작성되고 공백과 줄 바꿈이 제거 된 것처럼 보입니다. 사다리 모양의 이미지만으로 공감대를 얻거나 영리한 골프를 놓친 적이 있습니까?
Jonathan Allan

@steadybox 당신은 지금 하나의 질문 xD에 비 잔디 스크린 샷을 요청한 후 상황에 맞는 스크린 샷을 사용하고 있습니까?
Magic Octopus Urn

@Tschallacka \n는 인정되는 유일한 탈출구입니다. (그리고 ""내부 인용 부호는 하나를 나타냄 ")
Steadybox

14

05AB1E , 29 바이트

순서대로 입력 N, H, W

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

온라인으로 사용해보십시오!

설명

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

이것은 약간의 속임수입니다.
vdegenne

4
왜 그래?
Jonathan Allan

이것을 조금 설명해 주시겠습니까?
Mischa

@MischaBehrend : 물론, 지금 설명을 추가했습니다.
Emigna

3
@ user544262772 골프 언어로 골프를 치는 대답을하는 것은 상당히 어려울 수 있습니다. 저를 믿으십시오. 골프 용으로 설계되었지만 일반적으로 "원하는 것이 바로 여기에 있지 않다면" ").
Jonathan Allan

13

C, 95 바이트

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 바이트

Neal Fultz 덕분에 -13 바이트!

Robin Ryder 덕분에 -1 바이트

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}

온라인으로 사용해보십시오!

익명의 기능; 결과를 행렬로 반환합니다.

단어 그리드 질문 으로 인해, 나는 평소보다 훨씬 더 행렬에 대해 생각했습니다. 렁은 계단 높이의 배수 인 H(R은 1- 인덱싱 된) 행렬 행에 있고 레일은 첫 번째 및 마지막 열 1이며 W. 그래서 임의의 ASCII 문자로 구성된 행렬을 만들고 해당 기준과 일치하지 않는 문자를 공백으로 바꾸고 행렬을 반환합니다. TIO 링크가 멋지게 인쇄합니다.

닐 퓰츠 다른 우주 문자 색인 제안 [-H*(1:N),3:W-1]의 배수의 행에있는 사람들을 제외한 모든 문자를 대체 H: -H*(1:N)가장자리에하지 3:W-1<==>을 2:(W-1).

R , 121 바이트

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

온라인으로 사용해보십시오!

내가 시작한 원래의 매트릭스 기반 접근법에 대한 개선; 그것은 동일한 알고리즘이지만 for루프는 행렬을 구성하고 인쇄하는 것보다 짧습니다 (그러나 인쇄하지 않으면 안됩니다!)


m[-H*(1:N),3:W-1]=" "조금 더 짧은 것 같습니다-항상 테스트 rowcol2 차원 슬라이스로 바꿀 수 있습니다 .
Neal Fultz

@NealFultz 와우, 그것은 아주 훌륭합니다! 감사합니다!
주세페

로 교체 sample(33:126,...)하여 -1 바이트 32+sample(94,...).
로빈 라이더


6

, 34 32 바이트

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

온라인으로 사용해보십시오! N, H, W 순서로 입력을 받습니다. Verbose 근사값 ( Plus(InputNumber(), 1)현재 TIO에서는 깨짐). 설명:

E…¹×⁺¹NN

범위를 넘는지도 1..H*(N+1). 이것은 횡선 i이의 배수 일 때 나타납니다 H.

다음의 결과에 참여하십시오.

EIζ

암시 적 범위의 매핑 0..W:

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

열이없는 경우 0또는 W-1상기 행의 배수가 아닌 H다음 출력 공간;

§⮌γ‽⁹⁴

그렇지 않으면, 사전 정의 된 ASCII 문자 변수를 가져 와서 뒤집어 (공간을 94 위에두고), 현재 첫 번째 94부터 임의의 문자를 인쇄하십시오 Slice.

ω

빈 문자열을 사용하여 결합하십시오. 최종 결과는 암시 적으로 인쇄됩니다.


그것이 도움이되는지 확실하지 않지만 사다리를 그린 다음 무작위로 인쇄 가능한 것을 피킹하고 매핑 할 있습니까? 편집 깨진 것 같습니다. 죄송합니다.
ASCII 전용

나는 그것을 고치려고 노력할 것이다. (이전에는 잘 작동하고 있었지만) 조금 바빠서 시간이 걸릴 수도있다
ASCII-only

@ASCII 전용 나는 당신이 생각하고 있다고 생각 NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«합니까? 글쎄, 나는 이등분하고 커밋 a0a6316했다.

@ ASCII-only 사실 그것은 사실이 아닙니다 . 그것이 의미 할 때 Map사용 된 곳에 관련이없는 버그가있었습니다 . 그래서 당신은 그 버그가 없었다면 글을 쓰 도록되어있었습니다. not is_commandis_commandNθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴
Neil


6

펄 6 , 76 73 바이트

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

온라인으로 사용해보십시오!

인수로 (h, n, w)를 사용합니다. 문자열 목록을 반환합니다.

설명:

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

xx++$대신에 73을 사용하는 대안map . 아마도 당신은 어떤 바이트에서 골프를 할 수있는 장소를 찾을 수 있습니까?
조 왕

5

PowerShell , 132124 바이트

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

온라인으로 사용해보십시오!

우리는 단지 구성 사다리 구축 #첫 번째 ( ), 다음 루프 |%{...}각 문자를 통해 if그것의 -eq에 연간를 35우리는 새로운 꺼내, Random적절한 범위에서 문자를. 그렇지 않으면 우리는 출력합니다 (즉, 공백이나 줄 바꿈).


5

자바 스크립트 (ES6) 117 115 바이트

문자별로 출력 문자를 작성하는 재귀 함수입니다.

"봐, 문자 그대로 줄 바꿈하지 마라!"

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

데모


젠장! I이었다 과정에서 나는이를봤을 때 내 아래로 골프의. : \ 또 이겼어! : p
얽히고 설킨

나는 골프를 끝냈다. (현재)-나는 String.fromCharCode이것을 본 후에 내가 스스로 그것을 생각 해낼 것이라고 말할 수 없었기 때문에 모든 삼항을 움직일 수있는 선을 그렸다 . 내 것이 지금 당신과 너무 비슷 하다고 느끼면 알려주십시오 .
얽히고 설킨

@Shaggy 걱정 마세요! (실제로, 나는 내 게시물을 게시 한 후에 만 ​​귀하의 답변을 보았습니다. 더 일찍 본 적이 있다면 아마도 포기했을 것입니다.)
Arnauld

1
아, 그것은 게임의 본질입니다! :) 우리의 솔루션을 결합하면 113 바이트 가됩니다
Shaggy

5

파이썬 2 , 142 바이트

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*

온라인으로 사용해보십시오!

ov 덕분에 바이트를 절약했습니다!


@LuisMendo 나는 그것을 고쳤다 고 생각한다.
Mr. Xcoder

@LuisMendo주의 깊게 확인하지 않은 것은 제 잘못입니다.
Mr. Xcoder


@ovs 감사합니다! 1> _>을 (를) 통해 앞면에서 잊어 버렸습니다
Mr. Xcoder

4

Pyth, 33 바이트

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

온라인으로 사용해보십시오 : 데모



3

SOGL V0.12 , 32 31 바이트

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

여기 사용해보십시오!

N, W, H 순서로 입력하십시오.

설명:

 ~Δ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 바이트 : /


3

자바 (8) 203 188 168 133 132 130 128 126 바이트

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

온라인으로 사용해보십시오!


133 바이트 :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

에 대한 결과를 현재 인쇄 중입니다 W-1. 내부 루프는 추가 반복을 수행해야합니다 ( >=0+1 바이트).
Nevay

1
132 바이트 :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 바이트
Olivier Grégoire

3

하스켈 , 226 220 211 190 바이트

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}

온라인으로 사용해보십시오!

Laikoni 덕분에 9 바이트 절약

wchargin 덕분에 21 바이트 절약

골프를 탈 수 있어야합니다 ( b$(s w)<$[2..h]b$((s w)<$[2..h])++[r w]). 나는 IO와 골프에 익숙하지 않다.


당신을 위해 중위 표기법을 사용할 수 있습니다 t w h n= ...: (w#h)n= .... pure대신에 사용할 수 있습니다 return. (d ' ')<$및 괄호를 묶을 수 있습니다 (s w)<$.
Laikoni

@Laikoni 나는 다음에 접두사 표기법을 잊지 않을 것입니다! 감사.
jferard

1
로 많은 바이트를 저장 c=randomRIO('!','~')하면 인라인 할 수 있습니다 d=return. 또한 mapM id1 바이트보다 짧습니다 sequence.
wchargin

1
@wchargin 감사합니다. 나는 오늘 무언가를 배웠다!
jferard

2

자바 스크립트 (ES6), 144 바이트

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

#문자로 래더를 생성 한 다음 각각을 임의의 ASCII 문자로 바꿉니다.

테스트 스 니펫


String.fromCharCode그리고 Math.random하나의 솔루션으로 JavaScript가 왜 우리를 미워합니까?! 137 바이트에 대해이 문제 가 발생했습니다 . 배열이 없어도 매우 비슷합니다. 재귀 솔루션이 여전히 더 짧은 지 궁금합니다. 나중에 조사하겠습니다.
Shaggy


2

자바 스크립트 (ES6) 129 117 바이트

불행히도, 내가 이것을 골퍼하는 과정에서 Arnauld는 나를 비슷하지만 짧은 해결책으로 이겼습니다 . 두 가지 솔루션을 결합하면 113 바이트 가 될 수 있습니다.

후행 줄 바꿈을 포함합니다.

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

시도 해봐

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 바이트

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

설명

[                       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

샘플 런

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

1

MATL , 63 50 바이트

Luis Mendo 덕분에 -13 바이트

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

온라인으로 사용해보십시오!

저는 여전히 MATL에서 골프를 처음 접합니다 (그리고 그 문제 때문에 MATLAB에 능숙하지 않습니다). 이것이 아마도 이것이 최적에 가깝지 않다는 것을 알고 있습니다. 팁을 환영합니다. 순서대로 입력을 N,H,W받습니다.

여기 우리는 간다 :

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.

이제 임의의 문자 행렬이 있습니다.

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

이제 레일에 대한 논리 행렬도 있습니다.

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

이제 스택에 3 개의 행렬이 있습니다.

  • 위 : 렁이 아닌 경우 0, 그렇지 않은 경우 1
  • 중간 : 레일이 아닌 경우 0, 그렇지 않은 경우 1
  • 하단 : 임의 문자, -20

그래서 우리는 다음을 수행합니다.

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

여기에 몇 가지 간단한 도움말입니다 : X"이다 3$기본적으로. ... 6Y2대신 편리 할 수 ​​있습니다 . 입니다 . 대신 사용할 수 있습니다13:10620+~~gJ3G&Ol5LZ(1F3G2-Y"h1hJT3$X"
Luis Mendo

@LuisMendo 아, 나는 모든 문서를 통해 그것을 완전히 만들지 않았거나 그것에 대해 발견했을 것 X"입니다. 마지막 팁에서는 5L입니다 [1 0]하지만 난 그이와 함께 사용되는 확인하는 방법을 모르겠어요 Z(- 나는 그것이 할당 있다고 얻을 1첫 번째와 마지막 컬럼에하지만 난 어떻게하지 않는 5LZ(것을 수행합니다. 아마 나중에 이것에 대해 MATL CHATL에서 핑 할 것이므로 지금은 걱정하지 마십시오.
주세페

1
인덱싱은 모듈 식이므로 0"end"와 동일합니다. Z(열에 할당합니다. 물론, 채팅에 나를 핑 자유롭게!
Luis Mendo

1

파워 쉘, 102 바이트

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

덜 골프 테스트 스크립트 :

$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

산출:

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

루비 , 71 바이트

편집 : 죄송합니다. 오타 롤을 수정하기위한 최근 편집으로 인해 이것이 새로운 도전이라고 생각했습니다. 아직 루비 답변이 없기 때문에 여전히 이것을 남겨두고 있습니다.

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.