ความโกลาหลเป็นบันได ASCII


43

คุณจะรู้ว่าไม่มีอะไร ในสิ่งที่ฉันทำเพื่อ " ความโกลาหลเป็นบันได "เป็นเส้นที่น่าจดจำจากทีวีซีรีส์ Game of Thrones

จุดประสงค์ของการท้าทายนี้คือการสร้างบันไดจากความโกลาหลในศิลปะ ASCII

ความท้าทาย

อินพุต

  • ความกว้างของบันไดW >= 3(จำนวนเต็ม)
  • ขั้นสูงH >= 2(จำนวนเต็ม)
  • จำนวนของ rungs N >= 2(จำนวนเต็ม)

เอาท์พุต

บันไดที่มีรางแนวนอนและรางแนวตั้งกว้าง 1 ตัวอักษร ความกว้างของบันได ( W) รวมถึงรางทั้งสองและความสูงของบันได ( H) รวมถึงร่องที่เกี่ยวข้อง

Rungs ทั้งหมดรวมถึงสุดยอดและต่ำสุดจะมีรางแนวตั้งที่มีความยาว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ส่วนแนวตั้ง

กฎ Aditional

  • วิธีการป้อนข้อมูลและรูปแบบมีความยืดหยุ่นตามปกติ ตัวอย่างเช่นคุณสามารถป้อนตัวเลขสามตัวในลำดับใดก็ได้หรืออาร์เรย์ที่มีตัวเลขอยู่

  • เอาต์พุตอาจผ่าน 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

@Rod ความคิดที่ดี เสร็จสิ้น
Luis Mendo

1
ขีด จำกัด ล่างแบบใดที่มีต่อคุณภาพของการสุ่ม ฉันถือว่าเริ่มต้นที่จุดสุ่มและโมดูโล่แบบเพิ่ม (126-33) จะไม่ผ่านการคัดเลือกเนื่องจากความสัมพันธ์ที่ชัดเจนระหว่างค่าที่อยู่ติดกัน หรือว่าจะต้องมีความสามารถในการผลิตทุกลำดับที่เป็นไปได้? (ดังนั้นเครื่องกำเนิดความสอดคล้องเชิงเส้นแบบ 8 บิตจะไม่ทำงานเพราะตัวละครตัวหนึ่งจะกำหนดตัวละครตัวต่อไปโดยไม่ซ้ำกันหรือไม่?)
Peter Cordes

@PeterCordes มีปัญหากับการต้องไม่เป็นบางความสัมพันธ์ตราบใดที่ได้ทุกชุดสามารถเกิดขึ้นได้ วิธีการที่คุณอธิบายคือตามที่คุณพูดไม่ถูกต้องเพราะมันแนะนำการพึ่งพาทางสถิติที่มากเกินไประหว่างตัวละครในตำแหน่งที่แตกต่างกันทำให้การผสมบางอย่างเป็นไปไม่ได้
Luis Mendo

1
@ PeterCordes ใช่ฉันหมายถึงในทางทฤษฎี ไม่ต้องกังวลกับความแข็งแกร่งของ RNG คุณสามารถสันนิษฐานได้ว่า RNG นั้นสมบูรณ์แบบ มีฉันทามติบางอย่างเกี่ยวกับเรื่องนี้ ฉันคิดว่ามีบางอย่างที่เฉพาะเจาะจงมากขึ้น แต่ทั้งหมดที่ฉันสามารถหาได้คือสิ่งนี้และสิ่งนี้
Luis Mendo

คำตอบ:


6

เยลลี่ ,  24 23  22 ไบต์

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

โปรแกรมการเต็มรูปแบบสามข้อโต้แย้งW, H, Nและการพิมพ์ผล

ลองออนไลน์!

อย่างไร?

สร้างมาสก์อาร์เรย์ 2d ของ rung เดี่ยวและส่วนแนวตั้งด้านล่างทำซ้ำN+1เวลาและลบ rung ด้านบนจากนั้นวางอักขระหรือช่องว่างแบบสุ่มขึ้นอยู่กับค่ารูปแบบ

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

ดูเหมือนว่าเป็น "\n"งาน"\xa3"ได้รับสิ่งที่ต้องการ£ไม่ทำงาน? หากคุณสามารถใช้ยูนิโค้ดหลบหนีคุณอาจจะสามารถตัดแต่งอาร์เรย์ของคุณ
Tschallacka

ฉันจะเรียกใช้ตัวเองได้อย่างไร : D
Geeky ฉัน

22
ดูเหมือนว่าสคริปต์จะถูกเขียนและมีการเว้นวรรคและบรรทัดใหม่ มันเป็นเพียงการ upvotes เพราะภาพของบันไดหรือฉันพลาดการเล่นกอล์ฟที่ชาญฉลาด?
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
@ user544262772 ทำไมถึงเป็นเช่นนั้น
Jonathan Allan

คุณช่วยอธิบายหน่อยได้ไหม?
Mischa

@MischaBehrend: แน่นอนว่าฉันได้เพิ่มคำอธิบายแล้ว
Emigna

3
@ user544262772 มันค่อนข้างท้าทายที่จะทำให้คำตอบที่ดีในภาษากอล์ฟตีกอล์ฟฉันเชื่อว่าพวกเขาถูกออกแบบมาสำหรับการเล่นกอล์ฟ แต่การใช้พวกเขามักจะต้องมีความคิดบางอย่าง ")
Jonathan Allan


8

R , 138 129 111 98 93 ไบต์

-13 ไบต์ขอบคุณ Neal Fultz!

-1 ไบต์ขอบคุณ 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}

ลองออนไลน์!

ฟังก์ชั่นไม่ระบุชื่อ; ส่งคืนผลลัพธ์เป็นเมทริกซ์

ขอบคุณที่Word Grids คำถามฉันคิดเกี่ยวกับเมทริกซ์มากกว่าปกติ ผมสังเกตเห็นว่าขั้นอยู่ในบรรดาแถวเมทริกซ์ที่มีหลายขั้นตอนความสูงH(R คือ 1 การจัดทำดัชนี) และทางรถไฟเป็นคอลัมน์แรกและครั้งสุดท้าย, และ1 Wดังนั้นฉันจึงสร้างเมทริกซ์ของอักขระ ASCII แบบสุ่มและแทนที่ตัวอักษรเหล่านั้นที่ไม่ตรงกับเกณฑ์เหล่านั้นด้วยช่องว่างและส่งคืนเมทริกซ์ ลิงค์ TIO พิมพ์ออกมาอย่างสวยงาม

โอนีล Fultz แนะนำการจัดทำดัชนีที่แตกต่างกันสำหรับตัวอักษรพื้นที่[-H*(1:N),3:W-1]ซึ่งแทนที่ตัวอักษรทั้งหมดยกเว้นสำหรับผู้ที่อยู่ในแถวของหลายรายการH: -H*(1:N)และไม่อยู่ในขอบ<==>3:W-12:(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]=" "ดูเหมือนว่าจะสั้นกว่าเล็กน้อย - คุณสามารถแทนที่การทดสอบrowและcolด้วยชิ้นแบบ 2 มิติได้ตลอดเวลา
Neal Fultz

@NealFultz ว้าวมันยอดเยี่ยมมาก! ขอขอบคุณ!
Giuseppe

-1 ไบต์โดยการแทนที่ด้วยsample(33:126,...) 32+sample(94,...)
Robin Ryder


6

ถ่าน , 34 32 ไบต์

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

ลองออนไลน์! รับอินพุตในคำสั่ง N, H, W. โดยประมาณ verbose ( Plus(InputNumber(), 1)ปัจจุบันเสียกับ TIO) คำอธิบาย:

E…¹×⁺¹NN

1..H*(N+1)แผนที่มากกว่าช่วง ซึ่งหมายความว่าขั้นจะปรากฏเมื่อมีหลายiH

เข้าร่วมผลลัพธ์ของ:

EIζ

การทำแผนที่ในช่วงโดยนัย0..W:

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

หากคอลัมน์ไม่ใช่0หรือW-1และแถวนั้นไม่ใช่จำนวนมากจากHนั้นส่งออกช่องว่าง

§⮌γ‽⁹⁴

มิฉะนั้นให้ใช้ตัวแปรตัวอักษร ASCII ที่กำหนดไว้ล่วงหน้ากลับรายการ (วางช่องว่างในตำแหน่งที่ 94) และพิมพ์ตัวอักษรแบบสุ่มจากตอนนี้เป็น 94 ตัวแรก (เพราะSlicesucks)

ω

เข้าร่วมโดยใช้สตริงว่าง ผลลัพธ์สุดท้ายจะถูกพิมพ์โดยปริยาย


ไม่แน่ใจว่ามันมีประโยชน์หรือไม่ แต่คุณสามารถวาดบันไดแล้วมองและทำแผนที่พิมพ์แบบสุ่มฉันคิดว่า? แก้ไขดูเหมือนว่าจะเสีย อุ่ย
ASCII เฉพาะ

ฉันจะพยายามที่จะแก้ไข (ค่อนข้างแน่ใจว่ามันทำงานมาก่อน) แต่ฉันยุ่งเล็กน้อยดังนั้นอาจใช้เวลาสักครู่
ASCII เท่านั้น

@ ASCII เท่านั้นผมถือว่าคุณกำลังความคิดของNθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θ¿EKA§⮌γ‽⁹⁴«? ฉันแบ่งออกเป็นสองส่วนและa0a6316ทำลายมัน
Neil

@ ASCII เท่านั้นจริงว่าไม่เป็นความจริงค่อนข้างมีข้อผิดพลาดที่ไม่เกี่ยวข้องในการMapที่จะใช้ในเมื่อมันมีความหมายnot is_command is_commandดังนั้นคุณควรจะเขียนNθGH↓θ→N↑θ*‖O↓F⁻N¹C⁰θUMKA§⮌γ‽⁹⁴ถ้ามันไม่ได้เป็นข้อผิดพลาดที่
Neil


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
}

ทางเลือก 73 byterใช้xxและแทน++$ mapบางทีคุณสามารถหาสถานที่ที่จะเล่นกอล์ฟจากไบต์ใด ๆ ?
Jo King

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มัน-eqUAL เพื่อ35เราดึงออกใหม่Randomตัวละครจากช่วงที่เหมาะสม มิฉะนั้นเราจะเอาท์พุท (เช่นช่องว่างหรือขึ้นบรรทัดใหม่)


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)

การสาธิต


Damnit! ฉันอยู่ระหว่างการตีกอล์ฟเมื่อฉันเห็นสิ่งนี้ : \ คุณชนะอีกครั้ง! : p
Shaggy

ฉันเล่นกอล์ฟจบลง (ตอนนี้) - ฉันวาดเส้นเพื่อย้ายสิ่งที่ประกอบไปด้วยทั้งหมดในString.fromCharCodeขณะที่ฉันไม่สามารถพูดได้อย่างแท้จริงว่าฉันจะเกิดขึ้นกับตัวเองหลังจากที่ได้เห็นสิ่งนี้ แจ้งให้เราทราบหากคุณรู้สึกว่าตอนนี้ฉันคล้ายกับคุณมากเกินไป
ขนปุย

@Shaggy ไม่ต้องกังวล! (ที่จริงแล้วฉันเห็นคำตอบของคุณหลังจากโพสต์ของฉันเท่านั้นถ้าฉันเห็นมันก่อนหน้านี้ฉันอาจจะยอมแพ้)
Arnauld

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!


@ LuisMendo ฉันคิดว่าฉันคงตอนนี้
Mr. Xcoder

@ LuisMendo มันเป็นความผิดของฉันที่ไม่ได้ตรวจสอบอย่างระมัดระวัง
Mr. Xcoder


@ovs ขอบคุณ! คุณลืม1ด้านหน้าแม้ว่า> _>
Mr. Xcoder



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

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

ขณะนี้คุณกำลังพิมพ์ผลลัพธ์สำหรับ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);}}
2560

2
;++i<H*N+H;: -2 ไบต์
Olivier Grégoire

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 และการเล่นกอล์ฟ


คุณสามารถใช้สัญกรณ์มัดสำหรับ:t w h n= ... สามารถนำมาใช้แทน คุณสามารถวางวงเล็บรอบและ (w#h)n= ...purereturn(d ' ')<$(s w)<$
Laikoni

@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 ไบต์ซึ่งคล้ายกับของคุณมากโดยไม่ต้องอาร์เรย์ ฉันสงสัยว่าตอนนี้หากโซลูชันแบบเรียกซ้ำอาจสั้นกว่านี้หรือไม่ จะตรวจสอบในภายหลัง
Shaggy


2

JavaScript (ES6), 129 117 ไบต์

แต่น่าเสียดายที่ในขณะที่ผมอยู่ในกระบวนการของการเล่นกอล์ฟลงนี้, Arnauld เอาชนะฉันไปเหมือนกัน แต่วิธีการแก้ปัญหาที่สั้นกว่า ด้วยการรวมโซลูชัน 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   ,

1

MATL , 63 50 ไบต์

-13 ไบต์ขอบคุณ Luis Mendo

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:106 เป็น สามารถใช้แทน20+~~gJ3G&Ol5LZ(1F3G2-Y"h1hJT3$X"
ลูอิสเมนโดได้

@LuisMendo X"โอ้ฉันไม่ได้ค่อนข้างทำให้มันผ่านเอกสารทั้งหมดหรือฉันจะได้ค้นพบว่าเกี่ยวกับ ในเคล็ดลับสุดท้ายนั้น5Lคือ[1 0]แต่ฉันไม่แน่ใจว่าวิธีการใช้ร่วมกับZ(- ฉันได้รับมันได้รับมอบหมาย1ให้คอลัมน์แรกและสุดท้าย แต่ฉันไม่ได้รับวิธีการที่5LZ(ประสบความสำเร็จ ฉันอาจจะปิงคุณใน MATL CHATL ในภายหลังเกี่ยวกับเรื่องนี้ดังนั้นไม่ต้องกังวลเกี่ยวกับเรื่องนี้ในตอนนี้
Giuseppe

1
การจัดทำดัชนีเป็นแบบแยกส่วนดังนั้นจึง0เหมือนกับ "สิ้นสุด" Z(กำหนดให้กับคอลัมน์ แน่นอนอย่าลังเลที่จะ ping ฉันในการแชท!
Luis Mendo

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

1

Ruby , 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.