กระเบื้อง Minesweeper รอบตัวฉันคืออะไร


31

เรือกวาดทุ่นระเบิดเป็นเกมไขปริศนาที่มีการซ่อนทุ่นอยู่รอบ ๆ แผ่นกระดานที่มีวัตถุประสงค์เพื่อระบุตำแหน่งของทุ่นระเบิดทั้งหมด การคลิกที่เหมืองจะสูญเสียเกม แต่การคลิกที่ไทล์อื่น ๆ จะแสดงตัวเลขตั้งแต่ 0-8 ซึ่งหมายถึงจำนวนเหมืองที่ล้อมรอบมันโดยตรง

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

* ต้องมีโอกาสที่ไม่เป็นศูนย์เพื่อให้ชุดค่าผสมทั้งหมดเกิดขึ้น


ตัวอย่าง

_ = blank square
X = mine

0

___
_0_
___

1

_X_
_1_
___

1

___
_1_
X__

___
_1_
__X

4

_X_
X4X
_X_

4

X_X
_4_
X_X

4

___
X4X
X_X

8

XXX
X8X
XXX

อินพุต

  • จำนวนเหมืองรอบ ๆ ศูนย์กึ่งกลาง (0-8)

เอาท์พุต

  • รูปแบบผลลัพธ์ที่เหมาะสมใด ๆ ที่แสดงอาร์เรย์ 3x3 ของกระเบื้อง

กฎอื่น ๆ

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

"ใด ๆ 2 ตัวอักษรสามารถเลือกสำหรับฉันและกระเบื้องว่างเปล่า" เราอาจจะยังคงใช้การพูด1และ0?
Jonathan Allan

3
@JanathanAllan ฉันจะบอกว่าใช่กล่องใส่ 0/1 อาจจะสับสนเล็กน้อย แต่ฉันไม่คิดว่ามันเป็นเรื่องใหญ่อะไร
aoemica

รายการองค์ประกอบ 9 แบบเรียบคือ 'รูปแบบผลลัพธ์ที่สมเหตุสมผล' หรือไม่
Chas Brown

@ChasBrown ไม่รายการแบนไม่เท่ากันจริงๆ
aoemica

คำตอบ:


4

เยลลี่ขนาด 9 ไบต์

<Ɱ8Ẋs4js3

ลองออนไลน์!

ว่างเปล่า1
Mine =0

โปรดทราบว่า1และ0เป็นจำนวนเต็ม

อีกหมายเหตุ: นี่ค่อนข้างคล้ายกับคำตอบขนาด 10 ไบต์ของ Jonathan Allan แต่ไม่ได้รับอิทธิพลใด ๆ จากมัน แต่อย่างใดและกลไกถ้าคุณให้ความสนใจอย่างใกล้ชิดจริงๆแล้วมันแตกต่างกว่าเมื่อมองผ่านครั้งแรก


อ๊ะฉันพลาดกลอุบาย :)
Jonathan Allan

@JonathanAllan คุณเชื่อไหมว่านี่ใกล้กับคุณมากพอหรือยัง? คำต่อท้ายจะเหมือนเดิมอยู่แล้ว ...
Erik the Outgolfer

1
มันแตกต่างกันเล็กน้อย ถ้าฉันอ่านโพสต์และหาสนามกอล์ฟที่รวดเร็วฉันแสดงความคิดเห็น; ถ้าฉันแค่พยายามที่จะแก้ปัญหาที่ฉันโพสต์ ฉันโพสต์รหัสที่เหมือนกันก่อนที่จะเป็นอิสระ
Jonathan Allan

@JanathanAllan วิธีการของฉันที่แตกต่างกันเล็กน้อยถ้าฉันพบว่าทางออกที่เป็นอิสระของฉันเกือบจะเหมือนกับคนอื่น แต่มีองค์ประกอบที่แตกต่างกันเล็กน้อยซึ่งช่วยประหยัดไบต์หรือสอง (ความเห็นส่วนตัว) ฉันแสดงความคิดเห็นมิฉะนั้นฉัน outgolf นั่นเป็นเหตุผลที่ฉันถาม แต่ดูเหมือนว่าคุณจะชอบฉันที่โพสต์ที่นี่ดังนั้น ...
Erik the Outgolfer

9

APL (Dyalog Unicode) , 28 15 ไบต์

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

{3 35⌽⍵,⍵≥8?8}

คำอธิบาย:

{...}ฟังก์ชั่นโดยตรง (D-Fn) เป็นอาร์กิวเมนต์ที่ถูกต้อง

8?8 จัดการ 8 ตัวเลขสุ่มจากรายการ 1..8:

      8?8                         
7 2 1 8 4 6 5 3

⍵≥ อาร์กิวเมนต์มีค่ามากกว่าหรือเท่ากับแต่ละข้อ:

      5  7 2 1 8 4 6 5 3   
0 1 1 0 1 0 1 1

⍵, เพิ่มอาร์กิวเมนต์ลงในรายการบูลีน:

      5 , 0 1 1 0 1 0 1 1
5 0 1 1 0 1 0 1 1

5⌽ หมุนรายการ 5 ตำแหน่งไปทางซ้ายเพื่อให้อาร์กิวเมนต์อยู่กึ่งกลาง:

      5  5 0 1 1 0 1 0 1 1
1 0 1 1 5 0 1 1 0

3 3⍴ เปลี่ยนรายการเป็นเมทริกซ์ 3x3:

      3 3  1 0 1 1 5 0 1 1 0
1 0 1
1 5 0
1 1 0

ลองออนไลน์!

J , 15 ไบต์

หลายไบต์ต้องขอบคุณ ngn!

3 3$5|.],]>8?8:

ลองออนไลน์!


1
(8↑1⍴⍨⍵)[8?8]-> ⍵>8?8(สมมติว่า⎕io←0)
ก.ย.

1
3 3⍴1↓,⍵,2 4⍴->3 3⍴5⌽⍵,
ngn

@ngn ขอบคุณ! ผมรู้สึกละอายใจจากความพยายามอย่างละเอียดของฉัน ...
เลน Ivanov

1
ไม่จำเป็นต้องอับอาย :) ขอบคุณ - คำตอบนี้ให้โอกาสฉันในการเรียนรู้บางอย่าง J
ngn

1
คำตอบ J นั้นน่ารักจริงๆ
Jonah

8

JavaScript (ES6), 67 ไบต์

รุ่นที่สั้นกว่าที่แนะนำโดย @tsh

ช่องว่างที่มีเหมืองเป็น01

n=>`___
_${t=9,n}_
___`.replace(/_/g,_=>n-(n-=Math.random()<n/--t))

ลองออนไลน์!


เวอร์ชั่นทดลองและข้อผิดพลาดดั้งเดิมขนาด 78 ไบต์

ช่องว่างที่มีเหมืองเป็น_7

f=(n,o=`___
_${k=n}_
___`.replace(/_/g,c=>Math.random()<.5?--k|7:c))=>k?f(n):o

ลองออนไลน์!

แสดงความคิดเห็น

f = (                         // f = recursive function
  n,                          // n = input
  o = `___\n_${k = n}_\n___`  // o = minesweeper field / k = backup of n
    .replace(/_/g, c =>       // for each underscore character c in o:
      Math.random() < .5 ?    //   random action:
        --k | 7               //     either decrement k and yield 7
      :                       //   or:
        c                     //     let the underscore unchanged
    )                         // end of replace()
) =>                          //
  k ?                         // if k is not equal to 0:
    f(n)                      //   try again
  :                           // else:
    o                         //   stop recursion and return o


6

เยลลี่ ,  13  10 ไบต์

8Ẉ>RẊs4js3

รายการที่ส่งคืนของรายการที่มีจำนวนเต็มแสดงในศูนย์ที่ล้อมรอบด้วย 0s และ 1s แสดงถึงเหมืองและช่องว่างตามลำดับ

ลองออนไลน์! (ส่วนท้ายสวยพิมพ์อาร์เรย์)

อย่างไร?

8Ẉ>RẊs4js3 - Link: integer, n                   e.g.  3
8          - eight                                    8
 Ẉ         - length of each (implicit range of eight) [1,1,1,1,1,1,1,1]
   R       - range of n                               [1,2,3]
  >        - greater than? (vectorises)               [0,0,0,1,1,1,1,1]
    Ẋ      - shuffle                                  [1,1,1,0,0,1,1,0]
     s4    - split into chunks of 4                   [[1,1,1,0],[0,1,1,0]]
       j   - join (with n)                            [1,1,1,0,3,0,1,1,0]
        s3 - split into chunks of 3                   [[1,1,1],[0,3,0],[1,1,0]]

1
เป็นบันทึกขนาดเล็กนอกจากนี้ยังทำงานในสถานที่ของŒH s4
Mr. Xcoder

; s4s3 ยังใช้งานได้
dylnan

@dylnan ฉันโพสต์โดยมี TIO ที่มีรหัสเดียวกันที่จุดหนึ่งในระหว่างการเล่นกอล์ฟของฉัน (แต่ใส่กลับอย่างรวดเร็วดังนั้นฉันไม่ต้องเขียนคำอธิบายใหม่)
Jonathan Allan

6

Pyth, 16 14 ไบต์

c3jQc2.S.[d8*N

บันทึก 2 ไบต์ต้องขอบคุณ isaacg
ใช้ช่องว่างสำหรับจุดที่ปลอดภัยและราคาสำหรับเหมือง
ลองที่นี่

คำอธิบาย

c3jQc2.S.[d8*N
            *NQ     Get (implicit) input number of quotes...
        .[d8        ... and pad to length 8 with spaces.
      .S            Shuffle.
  jQc2              Stick the input in the middle.
c3                  Split into three.

.[d8แทน>8+*8d
isaacg

5

Oracle 18 SQL, 230 ไบต์

ไม่ใช่ภาษากอล์ฟ แต่ ...

WITH v(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1))SELECT v.v||b.v||c.v||'
'||d.v||n||e.v||'
'||f.v||g.v||h.v
FROM n,v,v b,v c,v d,v e,v f,v g,v h
WHERE v.v+b.v+c.v+d.v+e.v+f.v+g.v+h.v=n
ORDER BY DBMS_RANDOM.VALUE
FETCH NEXT ROW ONLY

ค่าอินพุตอยู่ในตารางที่nมีคอลัมน์n:

CREATE TABLE n(n) AS
SELECT 7 FROM DUAL;

ลองออนไลน์ - เข้าสู่https://livesql.oracle.comแล้ววางลงในแผ่นงาน

เอาท์พุท:

V.V||B.V||C.V||''||D.V||N||E.V||''||F.V||G.V||H.V
-------------------------------------------------
101 
171 
111

วิธีรับชุดค่าผสมที่เป็นไปได้ทั้งหมด (183 ไบต์):

WITH v(v)AS(SELECT*FROM SYS.ODCINUMBERLIST(0,1))SELECT v.v||b.v||c.v||'
'||d.v||n||e.v||'
'||f.v||g.v||h.v
FROM n,v,v b,v c,v d,v e,v f,v g,v h
WHERE v.v+b.v+c.v+d.v+e.v+f.v+g.v+h.v=n

เอาท์พุท:

V.V||B.V||C.V||''||D.V||N||E.V||''||F.V||G.V||H.V
-------------------------------------------------
111 
171 
110

111 
171 
101

111 
171 
011

111 
170 
111

111 
071 
111

110 
171 
111

101 
171 
111

011 
171 
111


3

QBasic 1.1 , 206 186 bytes

RANDOMIZE TIMER
INPUT N
O=N
Z=8-N
FOR I=0TO 7
IF O*Z THEN
R=RND<.5
O=O+R
Z=Z-1-R
A(I)=-R
ELSEIF O THEN
O=O-1
A(I)=1
ELSE
Z=Z-1
A(I)=0
ENDIF
NEXT I
?A(0)A(1)A(2)
?A(3)N;A(4)
?A(5)A(6)A(7)

-20 ขอบคุณDLosc (เคล็ดลับการตีกอล์ฟที่เพิ่งโพสต์)

ว่างเปล่า = 0
Mine =1

โปรดทราบว่า0และ1เป็นจำนวนเต็ม แต่ฉันใช้ STDOUT อยู่แล้วดังนั้น ...

ผลลัพธ์ปรากฏดังนี้:

 A  B  C
 D  x  E
 F  G  H

โดยที่ AH คือ 0/1 และ x คืออินพุต


เคล็ดลับดีที่ทำงานกับการส่งออกจำนวนมากของ QBasic โดยใช้ตัวเลขสำหรับการขุดและไทล์ว่างเปล่า!
DLosc

3

ถ่าน 19 ไบต์

W¬⁼ΣIKA⁸«E³⭆³‽²↑↗↖θ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้0สำหรับเหมือง1สำหรับพื้นที่ว่าง คำอธิบาย:

     KA             Peek the entire canvas
    I               Cast to integer
   Σ                Take the sum
       ⁸            Literal 8
  ⁼                 Equals
 ¬                  Logical Not
W       «           While
          ³ ³       Literal 3
         E          Map over implicit range
           ⭆        Map over implicit range and join
              ²     Literal 2
             ‽      Random element of implicit range
                    Implicitly print on separate lines
               ↑↗↖θ Print the original input in the middle
  • Peekส่งกลับอาร์เรย์ของสตริงซึ่งSumเพียงแค่เชื่อมโยงกันซึ่งเป็นเหตุผลที่เราต้องโยนเป็นจำนวนเต็มก่อน ( Sum(Sum(PeekAll()))ใช้ได้เช่นกัน)
  • SumผลตอบแทนNoneสำหรับอาร์เรย์ที่ว่างเปล่า (วงแรก) Not(Equals(...))ดังนั้นการเปรียบเทียบความปลอดภัยเพียงอย่างเดียวคือ
  • Nilary Randomจะส่งคืนเสมอ0แม้ว่าเอกสารนั้นจะระบุเป็นอย่างอื่น

โซลูชันทางเลือกคือ 19 ไบต์ตอนนี้ 17 ไบต์หลังจากข้อผิดพลาด Charcoal:

θ←9W⁻ΣIKA⁸UMKMI‽²

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้0สำหรับเหมือง1สำหรับพื้นที่ว่าง คำอธิบาย:

θ

พิมพ์อินพุตต้นฉบับ

←9

พิมพ์9ทางซ้าย สิ่งนี้จะย้ายเคอร์เซอร์กลับไปที่อินพุตดั้งเดิมและบังคับให้ทำซ้ำอย่างน้อยหนึ่งรอบของ while loop (มิฉะนั้นอินพุต8จะไม่ทำอะไรเลย)

W⁻ΣIKA⁸

ทำซ้ำขณะที่ความแตกต่างระหว่างผลรวมของตัวเลขทั้งหมดบนผืนผ้าใบและ 8 คือไม่ใช่ศูนย์:

UMKMI‽²

แทนที่แต่ละตัวละครรอบสุ่มหรือ01


3

R , 67 63 62 59 ไบต์

matrix(c(sample(rep(1:0,c(n<-scan(),8-n))),n),6,5)[2:4,1:3]

ลองออนไลน์!

การใช้ประโยชน์และ1 0สร้างn* 1 +(8-n)* 0เวกเตอร์สับมันต่อท้ายnสร้างเมทริกซ์ที่ใหญ่กว่าที่แสดงด้านล่าง (โดยย่อa...iมาจากองค์ประกอบของเวกเตอร์ดั้งเดิม) และแยกเมทริกซ์ย่อยที่เหมาะสมที่แสดงเป็นตัวพิมพ์ใหญ่:

     [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "g"  "d"  "a"  "g" 
[2,] "B"  "H"  "E"  "b"  "h" 
[3,] "C"  "I"  "F"  "c"  "i" 
[4,] "D"  "A"  "G"  "d"  "a" 
[5,] "e"  "b"  "h"  "e"  "b" 
[6,] "f"  "c"  "i"  "f"  "c"

หนึ่งไบต์สั้นกว่า:matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Gregor

1
@Gregor คุณขวาอาร์เรย์อาจจะเป็นรูปแบบที่เหมาะสมของการส่งออกเพื่อแสดงอาร์เรย์ :)
Jayce

2

Python 2 , 93 ไบต์

from random import*
def f(n):a=[1]*n+[0]*(8-n);shuffle(a);a[4:4]=[n];return zip(*[iter(a)]*3)

ลองออนไลน์!

0สำหรับว่าง 1สำหรับเหมือง และnเพื่อตัวเอง


การใช้iterสมาร์ท!
Jonathan Allan

@ Jonathan Allan: xnor แสดงให้ฉันเห็นว่าเมื่อวันก่อน
Chas Brown

2

ทูต , 51 ไบต์

{[3,3]&Rotate[Sample[{Sum@_=_2}&_\BinBelow@8]'_,4]}

ลองออนไลน์!

คำอธิบาย

เช่นเดียวกับคำตอบ J / APL ของ Galenเทคนิคพื้นฐานคือการสร้างอาร์เรย์ 1s และ 0s ด้วยจำนวนที่ถูกต้องของเหมืองการแทรกอินพุตโดยการผนวกเข้าไปที่ท้ายหมุนอาร์เรย์เช่นอินพุตอยู่ตรงกลางจากนั้น ก่อร่างใหม่เป็นเมทริกซ์ 3x3

ส่วนที่ 1: การสร้างอาร์เรย์แบบไบนารี

มีหลายวิธีที่จะทำสิ่งนี้ แต่ส่วนใหญ่ฉันเกิดขึ้นในสองประเภท: กำลังดุร้ายและการเลือก

วิธีเดรัจฉานกำลังหลักมีลักษณะเช่นนี้:

NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]

นี้จะสร้างอาร์เรย์แบบสุ่มของตัวเลข 8 หลักเลขฐานสอง ( Random[8&2]) {Sum@_/=_2}&_ในขณะที่ผลรวมของพวกเขาไม่เท่ากับการป้อนข้อมูล นี่เป็น verbose เล็กน้อยเนื่องจากบางส่วนของโค้ดที่เน้นดังต่อไปนี้อยู่ที่นั่น "เพื่อให้มันทำงาน":

NestWhile[{Random[8&2]},0,{Sum@_/=_2}&_]
          ^           ^^^^^        ^^^^

และฉันก็ยกเลิกความคิดนี้

การเลือกน่าสนใจยิ่งขึ้น แนวคิดหลักคือการใช้BaseBelow[b, n]ในตัวซึ่งจะสร้างรายการ base- ทุกbจำนวนเต็มของความกว้างn(อาร์เรย์บาท) จากการ0 b^n-1ตัวอย่างเช่นBaseBelow[3, 2]สร้างจำนวนเต็มทั้งหมดของความกว้าง 2:

A> BaseBelow[3, 2]
 0 0
 0 1
 0 2
 1 0
 1 1
 1 2
 2 0
 2 1
 2 2

เราใช้เฉพาะBaseBelow[2, 8]สำหรับเลขจำนวนเต็มไบนารีทั้งหมดของความกว้าง 8 โดยเฉพาะเหล่านี้เป็นตัวแทนของเขตที่วางทุ่นระเบิดที่เป็นไปได้ของความยาวทั้งหมด นี่เป็นขั้นตอนแรก

ขั้นตอนที่สองคือการเลือกอาร์เรย์ดังกล่าวทั้งหมดด้วยN1s เท่านั้นซึ่งNเป็นอินพุต ความคิดแรกของฉันคือการแปลข้อความภาษาอังกฤษนี้เป็น Attache โดยตรง:

Chunk[SortBy[Sum,BaseBelow[2,8]],Sum]@N@1

อย่างไรก็ตามสิ่งนี้ไม่เพียง แต่จะมีความยาว 1 ไบต์มากกว่าวิธีการข้างต้นเท่านั้น แน่นอนว่าฉันสามารถบันทึก 1 ไบต์ได้ด้วยการจัดระเบียบวิธีการBaseBelowเรียกใหม่ แต่ก็ไม่คุ้มกับการใช้วิธีการ

ดังนั้นฉันจึงตัดสินใจฆ่านกสองตัวด้วยหินก้อนเดียวและใช้Shuffleวิธีการพื้นฐาน ข้อมูลต่อไปนี้ให้ความยาวที่ทุ่นระเบิดที่ถูกต้องทั้งหมดNตามลำดับแบบสุ่ม:

{Sum@_=_2}&N\Shuffle[BaseBelow&8!2]

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

Sample[{Sum@_=_2}&_\BaseBelow[2,8]]

ฉันต้องเปลี่ยนกลับBaseBelow&8!2กอล์ฟเพราะ\ลำดับความสำคัญสูงเกินไป พอใจเป็นอย่างอื่นฉันดำเนินการสับไบต์จากที่:

Sample[{Sum@_=_2}&_\2&BaseBelow@8]

(ฉันค้นพบอีกวิธีหนึ่งในการเรียกฟังก์ชัน dyadic อย่างชัดเจนที่นี่: x&f@yเป็นนิพจน์ที่มีลำดับความสำคัญสูงซึ่งประเมินf[x, y]ได้)

อย่างไรก็ตามแม้จะมีนี้ผมจำได้ว่าตลอดนามแฝงสำหรับตัวตน:2&BaseBelow BinBelowดังนั้นฉันใช้มัน:

Sample[{Sum@_=_2}&_\BinBelow@8]

สิ่งนี้จะสร้างทุ่นระเบิดที่ต้องการ ฉันเชื่อว่านี่ใกล้ดีที่สุดแล้ว

ส่วนที่ 2: การสร้างอาร์เรย์

ดังที่ได้กล่าวไปแล้วเทคนิคการขึ้นรูปที่ฉันใช้นั้นคล้ายกับคำตอบ J / APL ดังนั้นฉันจะไม่พูดถึงรายละเอียดมากเกินไป สมมติว่าMINEFIELDเป็นผลลัพธ์จากส่วนสุดท้าย ฟังก์ชั่นจะกลายเป็น:

{[3,3]&Rotate[MINEFIELD'_,4]}

MINEFIELD'_ต่อกับเขตที่วางทุ่นระเบิดกับอินพุตดั้งเดิม_ทำให้เรามีลักษณะดังนี้:

[1, 0, 0, 0, 1, 0, 0, 1, 3]

จากนั้นRotate[MINEFIELD'_,4]หมุนรายการนี้4ไปทางซ้ายวางศูนย์กลาง:

[1, 0, 0, 1, 3, 1, 0, 0, 0]

ขั้นตอนสุดท้ายคือ[3,3]&การเปลี่ยนรูปร่างรายการเป็นเมทริกซ์ 3x3:

 1 0 0
 1 3 1
 0 0 0

2

Java 10, 165 157 141 ไบต์

n->{var r="___\n_"+n+"_\n___";for(int i;n>0;r=r.charAt(i*=Math.random())>58?r.substring(0*n--,i)+(i>9?0:0+r.substring(i+1)):r)i=11;return r;}

กระเบื้องที่ว่างเปล่า_(ตัวอักษรใด ๆ ที่มีค่า Unicode เหนือ 58 เป็นดี) 0และการเหมืองแร่เป็น

ลองออนไลน์

คำอธิบาย:

n->{                           // Method with integer parameter and String return-type
  var r="___\n_"+n+"_\n___";   //  Result-String, starting at:
                               //   "___
                               //    _n_
                               //    ___"
  for(int i;n>0                //  Loop as long as `n` isn't 0 yet:
      ;                        //    After every iteration:
       r=r.charAt(i*=Math.random())
                               //     Select a random integer in the range [0,11)
         >58?                  //     And if the character at this random index is a '_':
          r.substring(0*n--,i) //      Set `r` to the first part excluding character `i`,
                               //      (and decrease `n` by 1 in the process)
          +(i>9?0:0+           //      appended with a '0',
           r.substring(i+1))   //      appended with the second part
         :                     //     Else:
          r)                   //      Leave `r` unchanged
     i=11;                     //   Set `i` to 11 so a new random integer can be chosen
  return r;}                   //  Return the result


1

PHP , 135 134 123 117 122 121 ไบต์

วนซ้ำไปยัง str เพื่อพิมพ์แทนจะช่วยประหยัด 1 ไบต์

str_split และ implode เพื่อใส่หมายเลขกลางบันทึก 11 ไบต์

ไม่จำเป็นต้องกำหนดสตริงให้กับ $ s อีกต่อไปประหยัด 6 ไบต์
ใช่คุณทำ มิฉะนั้นสตริงจะถูกสับหลังจากทุก echo ...

การลบช่องว่างหลังจาก echo บันทึก 1 ไบต์

การแทนที่ "\ n" ด้วยตัวแบ่งบรรทัด ctual บันทึก 1 ไบต์

$n=$argv[1];$s=implode($n,str_split(str_shuffle(str_pad(str_repeat(m,$n),8,n)),4));for(;$i<9;)echo$s[$i].(++$i%3?"":"
");

ลองออนไลน์!



1

PowerShell , 91 86 ไบต์

-5 ไบต์ต้องขอบคุณเขาวงกต

param($n)$x=,'X'*$n+,'_'*(8-$n)|random -c 8
-join$x[0..2]
$x[3,4]-join$n
-join$x[5..7]

ลองออนไลน์!

สับสตริงที่สร้างขึ้นตั้งแต่________ถึงXXXXXXXX(แทนที่จากซ้าย) จากนั้นมันจะผ่าหลาย ๆ ครั้งแทรก$nตรงกลางเพื่อสร้างสตริงเอาต์พุต ส่วนสุดท้ายนี้สามารถปรับให้เหมาะสมอย่างมากเนื่องจากแต่ละดัชนีมีค่าต่ำสุด 5 ไบต์






0

05AB1E , 12 ไบต์

$×8j.r2äIý3ô

ใช้0สำหรับเหมืองช่องว่างสำหรับช่องว่างสี่เหลี่ยม แสดงรายการบรรทัดที่พิมพ์ออกมาค่อนข้างสวยใน TIO ด้านล่างโดยการเข้าร่วมกับตัวคั่นบรรทัดใหม่ ( »)

ลองใช้แบบออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามรายการพร้อมกัน

คำอธิบาย:

$             # Push 0 and the input-digit
 ×            # Repeat the 0 the input-digit amount of times as string
              #  i.e. 4 → "0000"
  8j          # Prepend spaces to make the size 8
              #  → "    0000"
    .r        # Randomly shuffle the characters in this string
              #  i.e. "    0000" → " 00 0  0"
      2ä      # Split it into two equal halves (of 4 characters)
              #  → [" 00 ","0  0"]
        Iý    # Join it with the input-digit
              #  → " 00 40  0"
          3ô  # And then split it into (three) parts of 3 characters
              #  → [" 00"," 40","  0"]
              # (which is output implicitly as result)

ทางเลือก12 ไบต์ :

8L@.rIš5._3ô

ใช้1สำหรับเหมืองแร่0สำหรับสี่เหลี่ยมจตุรัสที่ว่างเปล่า ส่งออกเมทริกซ์ของตัวเลขซึ่งพิมพ์ออกมาสวยใน TIO ด้านล่างด้วยการเข้าร่วมแต่ละแถวจากนั้นแถวเหล่านี้จะมีตัวคั่นบรรทัดใหม่ ( )

ลองใช้แบบออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามรายการพร้อมกัน

คำอธิบาย:

8L            # Push the list [1,2,3,4,5,6,7,8]
  @           # Check for each if the (implicit) input-integer is >= it
              # (1 if truthy; 0 if falsey)
              #  i.e. 4 → [1,1,1,1,0,0,0,0]
   .r         # Randomly shuffle this list
              #  i.e. [1,1,1,1,0,0,0,0] → [0,1,1,0,1,0,0,1]
     Iš       # Prepend the input-digit to the list
              #  → [4,0,1,1,0,1,0,0,1]
       5._    # Rotate the list five times towards the left
              #  → [1,0,0,1,4,0,1,1,0]
          3ô  # And then split it into (three) parts of 3 digits each
              #  → [[1,0,0],[1,4,0],[1,1,0]]
              # (which is output implicitly as result)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.