Хаос - это лестница ASCII

43

Вы ничего не знаете То, что я делаю для « Хаоса - это лестница » - это запоминающаяся строка из телесериала « Игра престолов» .

Цель этой задачи - построить лестницу из хаоса в искусстве ASCII.

Соревнование

вход

  • Ширина лестницы, W >= 3(целое число)
  • Высота шага, H >= 2(целое число)
  • Количество ступеней, N >= 2(целое число).

Выход

Лестница с горизонтальными перекладинами и вертикальными направляющими шириной всего 1 символ. Ширина лестницы ( W) включает в себя два рельса, а высота ступеньки ( H) включает соответствующую ступеньку.

Все ступени, включая самый верхний и самый нижний, будут иметь кусок вертикального рельса длиной H-1непосредственно над и под ним. Пример прояснит это.

Лестница будет состоять из печатных непробельных символов ASCII , то есть включающего диапазона от !(кодовой точки 33) до ~(кодовой точки 126). Фактические символы будут выбраны случайным образом . Учитывая входные данные, каждый случайный выбор символов должен иметь ненулевую вероятность. Помимо этого, распределение вероятностей является произвольным.

Допускаются начальные или конечные пробелы , горизонтальные или вертикальные.

пример

Учитывая W=5, H=3, N=2, один из возможных выводов заключается в следующем.

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

Обратите внимание, что общая высота есть H*(N+1)-1, так как есть Nперекладины и N+1вертикальные секции.

Дополнительные правила

  • Средства ввода и формат являются гибкими, как обычно. Например, вы можете ввести три числа в любом порядке или массив, содержащий их.

  • Вывод может быть через STDOUT или аргумент, возвращаемый функцией. В этом случае это может быть строка с символами новой строки, двумерный массив символов или массив строк.

  • Программа или функция может быть предоставлена.

  • Стандартные лазейки запрещены.

  • Самый короткий код в байтах побеждает.

Контрольные примеры

Для каждого 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?
Род
@ Род Хорошая идея. Готово
Луис Мендо
1
Какого рода нижний предел качества случайности существует? Я полагаю, что начинать со случайной точки и увеличивать по модулю (126-33) было бы невозможно из-за очевидной корреляции между соседними значениями. Или он должен быть способен производить все возможные последовательности? (Таким образом, 8-разрядный линейный конгруэнтный генератор не будет работать, потому что один символ однозначно определяет следующий символ?)
Питер Кордес
@PeterCordes Нет проблем с наличием некоторой корреляции, если возможна любая возможная комбинация. Подход, который вы описываете, как вы говорите, недопустим, потому что он вводит слишком сильную статистическую зависимость между персонажами в разных позициях, делая невозможными некоторые комбинации
Луис Мендо
1
@PeterCordes Да, я имел в виду теоретически. Не беспокойтесь о силе ГСЧ; Вы можете предположить, что ГСЧ является идеальным. Есть мета-консенсус по этому поводу. Я думал, что есть что-то более конкретное, но все, что я мог найти, было это и это
Луис Мендо

Ответы:

6

Желе ,  24 23  22 байта

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

Полная программа принимает три аргумента W, H, Nи печать результата.

Попробуйте онлайн!

Как?

Создает 2-мерную маску массива для одной ступени и ее вертикальных секций ниже, повторяет ее 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

Язык сценариев работы Flashpoint , 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
}
Steadybox
источник
Кажется, как "\n"работает, "\xa3"получить что-то вроде £не работает? если вы можете использовать экранирование Юникода, вы можете обрезать свой массив.
Чаллака
Как я могу запустить это сам? : D
Geeky I
22
Это похоже на то, что сценарий был написан, а пробелы и символы новой строки были удалены. Это только из-за образа лестницы, или я пропустил какой-то умный гольф?
Джонатан Аллан
@steadybox Используете ли вы контекстные снимки экрана после того, как я запросил снимок, не относящийся к пастбищам, по этому одному вопросу xD?
Волшебная Урна Осьминога
@ 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
Emigna
источник
Это немного обманывает.
vdegenne
4
@ user544262772 почему так?
Джонатан Аллан
Вы можете объяснить это немного?
Миша
@MischaBehrend: Конечно, я добавил объяснение сейчас.
Эминья,
3
@ user544262772, может быть довольно сложно дать хороший гольф-ответ на языке игры в гольф, поверьте мне, они предназначены для игры в гольф, но их использование обычно требует некоторой мысли (если только это не «встроенный модуль, который делает именно то, что вы хотите» «).
Джонатан Аллан
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);}
orlp
источник
8

R , 138 129 111 98 93 байт

-13 байтов благодаря Нилу Фульцу!

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

Попробуйте онлайн!

Анонимная функция; возвращает результат в виде матрицы.

Благодаря этому вопросу Word Grids я думал о матрицах намного больше, чем обычно. Я заметил, что ступеньки находятся в тех строках матрицы, которые кратны высоте шага 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циклы короче, чем построение и печать матрицы (но не если я ее не распечатаю!)

Giuseppe
источник
m[-H*(1:N),3:W-1]=" "кажется немного короче - вы всегда можете заменить тестирование rowи col2-й срез.
Нил Фульц
@NealFultz Вау, это отлично! Спасибо!
Джузеппе
-1 байт путем замены sample(33:126,...)на 32+sample(94,...).
Робин Райдер
6

Perl 5 , 81 байт

80 байт код + 1 для -p.

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

Попробуйте онлайн!

Дом Гастингс
источник
пробел после \ d + может быть удален из-за жадного совпадения
Науэль Фуйе
6

Древесный уголь , 34 32 байта

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

Попробуйте онлайн! Принимает входные данные в порядке N, H, W. Подробное приближение ( 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
@ ASCII-только я полагаю, вы думаете NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«? Ну, я разделил пополам и a0a6316сломал его.
Нил
@ ASCII-only На самом деле это не совсем так, была несвязанная ошибка в том, Mapгде он использовался, not is_commandкогда имел в виду is_command. Таким образом, вы должны были написать, NθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴если бы не эта ошибка.
Нил
6

C (gcc) , 141 131 114 109 107 байт

Должен быть в состоянии сыграть в гольф немного вниз ...

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

Попробуйте онлайн!

cleblanc
источник
мы можем редактировать i=1в глобальной декларации?
Мукул Кумар
6

Perl 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
}
nwellnhof
источник
Альтернатива 73 байта с использованием xxи ++$вместо map. Может быть, вы можете найти место для игры в гольф от байтов?
Джо Кинг
5

PowerShell , 132 124 байта

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

Попробуйте онлайн!

Мы строим лестницу, состоящую только из #первого ( пример ), затем |%{...}перебираем каждый символ, и if, -eqконечно же 35, мы вытаскиваем нового Randomперсонажа из соответствующего диапазона. В противном случае мы выводим (то есть, пробел или перевод строки).

AdmBorkBork
источник
5

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

демонстрация

Arnauld
источник
Черт возьми! Я был в процессе игры в гольф, когда увидел это. :\ Ты опять выйграл! : p
Лохматый
Я закончил игру в гольф (пока) - я подвел черту в перемещении всех троих внутри String.fromCharCode, поскольку я не мог честно сказать, что сам придумал это, увидев это. Дайте мне знать, если вы чувствуете, что мое сейчас слишком похоже на ваше.
Лохматый
@ Shaggy Не беспокойся! (На самом деле, я увидел твой ответ только после того, как опубликовал свой. Если бы я видел его раньше, я бы, вероятно, сдался.)
Арно
1
Ах, это природа игры! :) Комбинация наших решений дает 113 байтов , кстати
Shaggy
5

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

Попробуйте онлайн!

Сохраненные байты благодаря ovs!

Мистер Xcoder
источник
@ LuisMendo Я думаю, я исправил это сейчас.
г-н Xcoder
@ LuisMendo Я виноват в том, что не проверил внимательно.
г-н Xcoder
42 байта
овс
@ovs Спасибо! 1
Впрочем,
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 байт без случайных символов: /

dzaima
источник
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);}}
Невай
В настоящее время вы печатаете результат для W-1, внутренний цикл должен выполнить дополнительную итерацию ( >=0+1 байт).
Неваи,
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);}}
Невай
2
;++i<H*N+H;: -2 байта.
Оливье Грегуар,
3

Haskell , 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}

Попробуйте онлайн!

Сохранено 9 байтов благодаря Laikoni

Сохранено 21 байт благодаря wchargin

Должно быть пригодным для игры в гольф ( b$(s w)<$[2..h]и b$((s w)<$[2..h])++[r w]). Я не чувствую себя комфортно с IO и игрой в гольф.

jferard
источник
Вы можете использовать инфиксное обозначение t w h n= ...: (w#h)n= .... pureможно использовать вместо return. Вы можете опустить круглые скобки (d ' ')<$и (s w)<$.
Лайкони
@ Laikoni Я не забуду запись инфикса в следующий раз! Спасибо.
jferard
1
Сохраните несколько байтов с помощью c=randomRIO('!','~'), что также позволяет вам встроить d=return. Кроме того, mapM idна один байт короче sequence.
wchargin
1
@wchargin Спасибо. Я кое-что узнал сегодня!
jferard
2

JavaScript (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 байтов, что очень похоже на ваше, только без массива. Интересно, может ли рекурсивное решение быть еще короче? буду расследовать позже.
Лохматый
2

JavaScript (ES6), 129 117 байт

К сожалению, пока я занимался игрой в гольф, Арно выбил мне подобное, но более короткое решение . Объединив наши 2 решения, это может быть 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   ,
steenbergh
источник
1

MATL , 63 50 байт

-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 матрицы:

  • Top: 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).
Giuseppe
источник
Вот несколько простых советов: X"это 3$по умолчанию. 6Y2может быть удобно , а не 13:106... 20+. ~~есть g. J3G&Ol5LZ(можно использовать вместо1F3G2-Y"h1hJT3$X"
Луис Мендо
@ LuisMendo Ах, я не совсем прошел через все документы, иначе я бы узнал об этом X". В последнем совете 5Lесть, [1 0]но я не уверен, как это используется в сочетании с Z(- я понимаю, что он присваивается 1первому и последнему столбцам, но я не понимаю, как этого 5LZ(добиться. Я, вероятно, позже напишу вам об этом в MATL CHATL, так что пока не беспокойтесь об этом.
Джузеппе
1
Индексирование является модульным, так 0же как и «конец». Z(присваивает столбцам. Конечно, не стесняйтесь пинговать меня в чате!
Луис Мендо
1

Powershell, 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
Mazzy
источник
1

Рубин , 71 байт

РЕДАКТИРОВАТЬ: Ой, я думал, что это была новая проблема из-за недавнего редактирования, чтобы исправить опечатку. Я все еще оставляю это, хотя, потому что нет никакого ответа Руби для этого еще.

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

Попробуйте онлайн!

Значение чернил
источник