เติมน้ำซุปด้วยตัวอักษร


24

ดูเหมือนว่าเราไม่เคยได้รับเหนื่อยของความท้าทายที่เกี่ยวข้องกับตัวอักษร ...


สูตรอาหาร

ป.ร. ให้ไว้

  • สตริงของตัวอักษรSและ
  • จำนวนเต็มบวกM, N,

ผลิตซุปตัวอักษรที่มีตัวอักษรของSการครองตำแหน่งสุ่มในชามสี่เหลี่ยมขนาดM× N, กรอบด้วยอักขระที่ไม่ใช่ตัวอักษรที่ไม่ใช่พื้นที่ที่จะเป็นตัวแทนของขอบของชาม

ตำแหน่งที่ไม่ได้ใช้ด้วยตัวอักษรควรจะแสดงเป็นช่องว่าง ดูตัวอย่างด้านล่าง

กฎ Aditional

  • ขนาดM× Nหมายถึงการตกแต่งภายในของชาม ขนาดรวมทั้งขอบเป็น×M+2N+2
  • อักขระแต่ละตัวจากSควรปรากฏขึ้นหนึ่งครั้งในชามในตำแหน่งอื่น นั่นคืออักขระหนึ่งตัวไม่สามารถเขียนทับอักขระอื่นได้
  • S อาจมีรายการที่ซ้ำกัน ตัวอย่างเช่นถ้าSเป็นสตริง'abcc'ซุปจะต้องมีหนึ่งaหนึ่งbและสองc(ทั้งหมดอยู่ในตำแหน่งที่แตกต่างกัน)
  • ปัจจัยการผลิตจะตอบสนองข้อ จำกัด M >= 1 , ,N >= 11 <= length(S) <= M*N
  • ขอบของชามสามารถเป็นอักขระที่ไม่ใช่ตัวอักษรที่ไม่ใช่ช่องว่างสอดคล้องกันระหว่างการรันโปรแกรมและค่าอินพุต
  • ตำแหน่งตัวอักษรในชามจะถูกสุ่มดังนั้นผลลัพธ์อาจแตกต่างกันทุกครั้งที่โปรแกรมทำงานด้วยอินพุตเดียวกัน
  • ได้รับการป้อนข้อมูลทุกชุดที่เป็นไปได้ของตำแหน่งตัวอักษรควรจะมีความน่าจะเป็นที่ไม่ใช่ศูนย์ เนื่องจากสิ่งนี้ไม่สามารถตรวจสอบได้จากการรับรู้บางอย่างของโปรแกรมโปรดอธิบายวิธีการที่รหัสของคุณเติมเต็ม
  • อนุญาตให้นำช่องว่างรอบตัวหรือต่อท้ายรอบขอบได้
  • Sจะประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่เท่านั้น หากคุณต้องการคุณสามารถเลือกที่จะใช้ตัวอักษรพิมพ์เล็กเท่านั้น
  • อินพุตและเอาต์พุตยืดหยุ่นตามปกติ ตัวอย่างเช่นเอาต์พุตสามารถเป็นสตริงที่มีการขึ้นบรรทัดใหม่อาร์เรย์อักขระ 2D หรือรายการบรรทัด
  • โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

อินพุตจะแสดงเป็นS, [M N]โดยที่MคือจำนวนแถวและNจำนวนคอลัมน์ ตัวละครที่#ใช้สำหรับขอบ

'O', [1 1]:

###
#O#
###

'HEY', [1 3]:

#####
#YHE#
#####


'HELLO', [4 11]:

#############
#  O        #
#         H #
#    LE     #
#   L       #
#############


'ADVNJSGHETILMVXERTYIOJKCVNCSF', [8 12]:

##############
#K  V  L   S #
# A   V  X H #
#T    M C    #
# I       O N#
#  YC        #
# G  I   R SE#
#   J      F #
#JT  D  V EN #
##############


'OOOOOOOOOOXXXXX', [13 31]:

#################################
#    X                          #
#                O              #
#                               #
#                  X            #
#                        O      #
#             X           O     #
#      O                        #
#         X                     #
#                        O      #
#       X                       #
#                    O          #
#  O      O      O              #
#                             O #
#################################


'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ', [11 41]

###########################################
#                                       JU#
#     Q         C M    G     R T U Y  H   #
#  KI          E   H    M   YO            #
#      V BW        I    JC                #
#     SV           D     P   B          U #
#           A     F    RF   J  KP E       #
#            E   N      TH        Z       #
#    N  BM  O     Q   I        AS N  WX   #
#   S     O  K       G L       P       Q  #
#Z     L T         R   L       A      F DD#
#      V   Y           WX   C       G XZ  #
###########################################


"ตำแหน่งของตัวอักษรในชามเป็นแบบสุ่ม [... ]" <- คุณหมายถึงสามารถสุ่มหรือต้องสุ่ม? และทุกบรรทัดสามารถมีตัวอักษรจำนวนเท่ากันตลอดเวลาได้หรือไม่?
Ismael Miguel

@IsmaelMiguel ต้อง และการกำหนดค่าทุกอย่างจะต้องมีความเป็นไปได้ที่ไม่ใช่ศูนย์ (เกิดขึ้นในการท้าทาย) ดังนั้นกฎนี้จึงใช้แนวทางยาว - ยาวเหมือนกัน
หลุยส์เมนโด

ขอบสามารถสอดคล้องกันระหว่างการรันโปรแกรมและค่าอินพุต แต่ใช้หลายตัวอักษรที่ไม่ใช่ตัวอักษรเช่นการวาดเส้นขอบ ASCII ด้วย|+-?
อดัม

@ Adámฮืมฉันจะบอกว่าไม่ได้นั่นเป็นการเปลี่ยนแปลงที่ใหญ่เกินไป
หลุยส์เมนโด

คำตอบ:


13

05AB1E , 20 18 16 15 14 ไบต์

*j.rS²ô2Føε8.ø

ใช้สามอินพุตตามลำดับ: ความสูงความกว้างสตริง เอาต์พุตเป็นรายการอักขระ 2 มิติ
ใช้8เป็นเส้นขอบ แต่อาจเป็นตัวเลขใดก็ได้

-1 ขอบคุณไบต์@Grimy

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด (TIO มี}}J»ส่วนท้ายเพื่อพิมพ์ผลลัพธ์ที่สวยงามอย่าลังเลที่จะลบออกเพื่อดูรายการตัวอักษร 2D เอาต์พุตจริงแทน)

คำอธิบาย:

*               # Multiply the (implicit) width and height inputs
 j              # Pad the (implicit) input-string with up to that amount of leading spaces,
                # so the total string-length is equal to that value
  .r            # Shuffle the characters in the string
    S           # Convert the string to a list of characters
                # (edge-case for the zip below with strings of size 1 with 1x1 dimensions)
     ²          # Push the width input again
      ô         # Split the list of characters into parts of that size
       2F       # Loop 2 times:
         ø      #  Zip/transpose the 2D list; swapping rows/columns
          ε     #  Inner map over each line:
           8.ø  #   And surround this line-list with a leading/trailing "8"
                # (after the loop, the result is output implicitly)

1
@ LuisMendo จริง ๆ แล้วฉันแค่พูดความท้าทาย 3 นาทีที่ผ่านมา ;) มันเป็นการดำเนินการที่ค่อนข้างตรงไปตรงมา จะลองเล่นกอล์ฟจากที่นี่
Kevin Cruijssen

1
เยี่ยมมากฉันไม่ได้คิดถึง*j! ที่นี่คือ13 สำหรับมรดกหรือ14 น่าเกลียดสำหรับทันสมัย ​​(เอาท์พุทอาร์เรย์ตัวละคร 2D)
Grimmy

1
@Grimy ดูเหมือนว่า 13 byter จะล้มเหลวในการป้อนข้อมูล1,1,"O"ดังนั้นฉันคิดว่ามันต้องเป็น 14-byter สำหรับมรดกเช่นกัน ขอบคุณสำหรับ -1
Kevin Cruijssen

7

APL (Dyalog Unicode) , 25 ไบต์SBCS

'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}

ลองออนไลน์!

-22 ขอบคุณ @ngn, -7 ขอบคุณ @ngn และ @ Adám

คำอธิบาย:

'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
          {            ⍵}  Function that generates the content
                            argument:  (width and height),  (string)
                     ×/    get the product
                   ?⍨      For each randomized elements
               ↓∘⍺¨        take the character in 
           ⍵⍴⊃¨            turn it back into a matrix of shape 
      4                 Then, 4 times, do these 3 things:
'#',                       - prepend a # to the axis
                          - reverse the columns
                          - swap columns and lines

APL (Dyalog Extended) , 21 ไบต์SBCS

มุมของขอบเป็นอักขระที่แตกต่างกัน

{⌂disp⊂⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}

ลองออนไลน์!

ใช้ dfn เพื่อแสดงกล่อง


29: '#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/) ลองออนไลน์!
อดัม

28: {'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(หรือแทนที่จะเป็น>ถ้า⎕io=1)
ngn

จริงแล้ว 27:'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
ngn

3
25:'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
ngn


6

Python 3 , 110 ไบต์

lambda s,m,n,r=['#']:[r+(n*r+[i for i,j in{*zip(s+m*n*' ',range(m*n))}]+n*r)[k*n:-~k*n]+r for k in range(m+2)]

ลองออนไลน์!

สุ่มโดยใช้ความsetเข้าใจและส่งกลับอาร์เรย์อักขระแบบ 2D


ใช้การตั้งค่าความเข้าใจที่ดีในการสุ่ม +1 แต่รหัสของคุณขึ้นอยู่กับชื่อ 'f' ของฟังก์ชัน ดังนั้นผมคิดว่าวิธีการแก้ปัญหาแลมบ์ดาไม่ถูกต้อง ...
agtoever

1
@agtoever ขอบคุณ! ฟังก์ชันไม่เรียกซ้ำดังนั้นจึงสามารถไม่ระบุชื่อได้ คุณหมายถึงf'{s:{m*n}}'ส่วนหนึ่ง? fเพราะเห็นว่าเป็นไวยากรณ์สำหรับสตริงรูปแบบซึ่งก็บังเอิญยังเกิดขึ้นเริ่มต้นด้วย
Jitse

3
รหัสนี้ดูเหมือนจะละเมิด PEP 8 ได้หลายวิธี
Christofer Ohlsson

1
@ Christofer-Ohlsson อย่างแน่นอน!
Jitse

2
@ChristoferOhlsson ยินดีต้อนรับสู่โลกแห่งโค้ดกอล์ฟฮ่าฮ่า ;) ไม่มีความคิดเห็น / เอกสารใด ๆ ตัวแปร / วิธีอักขระเดียวที่ไม่มีช่องว่าง / บรรทัดใหม่ (ไม่จำเป็น); อาจมีคำเตือนของคอมไพเลอร์นับร้อยที่เราเพิกเฉย การเพิ่มประสิทธิภาพจาก O (log (N)) เป็น O (N ^ N); เป็นต้นหากสามารถบันทึกได้แม้แต่ไบต์เดียวมันก็ใช้ได้ทั้งหมดและคุ้มค่าสำหรับการเล่นกอล์ฟ ;)
Kevin Cruijssen

5

Bash + coreutils, 139 125 ตัวอักษร

r=`printf %$3s@@|tr \  @`
echo $r
printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|paste -d@ <(:) - <(:)|head -$2
echo $r

วิ่งตัวอย่าง:

bash-5.0$ bash soup.sh HELLO 4 11
@@@@@@@@@@@@@
@  H        @
@      OE   @
@    L      @
@          L@
@@@@@@@@@@@@@

ลองออนไลน์!

Bash + coreutils + boxes 97 ตัวอักษร

printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|boxes -dsimple -s$[$3+2]x$[$2+2] -pa0 -itext

วิ่งตัวอย่าง:

bash-5.0$ set -- HELLO 4 11

bash-5.0$ printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|boxes -dsimple -s$[$3+2]x$[$2+2] -pa0 -itext
*************
* O   L  E  *
*      H    *
*           *
*     L     *
*************

ลองออนไลน์! (บางส่วนเนื่องจากboxesไม่ได้ติดตั้งบน TIO)


5

J , 30 29 ไบต์

-1 ไบต์ขอบคุณโจนาห์

'#'|.@|:@,^:4[$*/@[(?~@[{{.)]

ลองออนไลน์!


1
เนื่องจาก TIO ใช้เมล็ดสุ่มแบบตายตัว 9!:1]6!:9''การแก้ไขที่
อดัม

2
{.ชอบวิธีการที่ใช้เติมศูนย์ ปรับแต่งเล็กน้อยสำหรับ 29 '#'|.@|:@,^:4[$*/@[(?~@[{{.)]: ลองออนไลน์!
Jonah

1
@Jonah ขอบคุณ!
Galen Ivanov

5

PowerShell , 163 111 93 ไบต์

param($w,$h,$s)'#'*$w+-join($s|% *ht($w*$h)|% t*y|sort{Random})+'#'*$w-replace".{$w}",'#$0#
'

ลองออนไลน์!

ใช้อินพุตเป็น$width, $hแปด, $string

สร้างสตริงของidth #ที่เหมาะสม$wสตริงเข้าร่วมที่มีการคำนวณบางส่วนและจากนั้น#สตริงเดียวกันอีกครั้ง การคำนวณเริ่มต้นด้วยการรับอินพุต$string และทำ. padRig htขึ้นไปที่$width ด้วย$hความยาวแปด (กล่าวคือให้สตริงที่ยาวพอที่จะใช้พื้นที่สี่เหลี่ยมทั้งหมดจากนั้นเราแปลงสตริงนั้นtoCharArra yและsortมันRandomให้ที่ เราผสมขึ้นส่วนตรงกลาง. สุดท้ายเรา-replaceก็เป็นชิ้นเท่ากัน$width และล้อมรอบชิ้นผู้ที่มี#s

-52 ขอบคุณแรงบันดาลใจจาก AZTECCO
-18 ไบต์ขอบคุณมาซี่


คุณมี 2 x สุ่ม (12) ในขณะที่ JS มีหนึ่งเขาเพิ่มช่องว่างเพื่อเติมขนาด M * N และเรียงลำดับหลังจากนั้นคุณยังจ่าย 21 สำหรับ '$' แต่น่าเสียดาย
AZTECCO

1
@AZTECCO ขอบคุณสำหรับแรงบันดาลใจ!
AdmBorkBork

ขอบคุณ @mazzy - ฉลาดมากด้วยการ-replaceแยกและเข้าร่วม
AdmBorkBork

4

JavaScript (ES7), 125 ไบต์

ส่งคืนสตริง ใช้0เป็นอักขระเฟรม

(s,h,w)=>(a=[...s.padEnd(w++*h++)].sort(_=>Math.random()-.5),g=x=>y+~h?(x%w&&y%h&&a.pop())+[`
`[x-w]]+g(x<w?x+1:!++y):a)(y=0)

ลองออนไลน์!

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

(s, h, w) => (               // s = string; h = height; w = width
  a =                        // build an array a[] consisting of:
    [...s.padEnd(w++ * h++)] //   all original characters in s padded with spaces for a
    .sort(_ =>               //   total length of w * h, in a random order
      Math.random() - .5     //   (this is not guaranteed to be uniform, but it is not
    ),                       //   required to be)
  g = x =>                   // g is a recursive function taking x:
    y + ~h ?                 //   if we haven't reached the end of the grid:
      ( x % w &&             //     if we're not located on a vertical border
        y % h &&             //     nor on a horizontal border,
        a.pop()              //     extract the last character from a[]
      ) +                    //     (otherwise, append '0')
      [`\n`[x - w]] +        //     if we've reached the end of the row, append a linefeed
      g(                     //     append the result of a recursive call:
        x < w ? x + 1 : !++y //       using either (x+1, y) or (0, y+1)
      )                      //     end of recursive call
    :                        //   else (end of grid):
      a                      //     a[] is now empty and can be used as an empty string
)(y = 0)                     // initial call to g with x = y = 0

4

APL (Dyalog Extended) , 23 ไบต์SBCS

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ ใช้[M,N]อาร์กิวเมนต์ซ้ายและSอาร์กิวเมนต์ขวา

'#',∘⌽∘⍉⍣4⊣⍴×/⍛(?⍨⍤⊣⊇↑)

ลองออนไลน์!

×/⍛() ใช้ฟังก์ชันต่อไปนี้ระหว่างอาร์กิวเมนต์โดยแทนที่อาร์กิวเมนต์ซ้ายด้วยผลิตภัณฑ์:

 ใช้ตัวอักษรM× NจากการSเติมช่องว่างทางด้านขวา

 จัดลำดับใหม่ตามลำดับต่อไปนี้:

?⍨⍤ ดัชนีแบบสับ 1 ถึง…
 อาร์กิวเมนต์ซ้าย ( M× N)

r eshape ที่มีรูปร่างดังต่อไปนี้:

 อาร์กิวเมนต์ซ้าย (เช่นMแถวและNคอลัมน์)

'#'... ⍣4 ใช้ฟังก์ชั่นต่อไปนี้สี่ครั้งแต่ละครั้งที่มีอักขระแฮชเป็นอาร์กิวเมนต์ด้านซ้าย:
∘⍉ สลับ
∘⌽ กระจกอาร์กิวเมนต์ด้านขวาอาร์กิวเมนต์ด้านขวา
,เชื่อมคอลัมน์คอลัมน์ของแฮชไปทางด้านซ้ายของนั้น


4

PHP 7.4, 107 99 94 ตัวอักษร

fn($s,$r,$c)=>_.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
_").$b._

ขอบคุณที่:

  • Ismael Miguelแจ้งเตือนฉันเกี่ยวกับฟังก์ชั่นลูกศรของ PHP 7.4 (-10 ตัวอักษร)
  • Night2สำหรับการย้อนกลับการต่อข้อมูลอย่างมีประสิทธิภาพและjoin()(-8 ตัวอักษร)
  • Night2สำหรับการแสดงวิธีการใช้chunk_split()'s $endพารามิเตอร์ (-5 ตัวอักษร)

ลองออนไลน์!

PHP 7.3, 117 112 108 ตัวอักษร

function s($s,$r,$c){echo _.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
_").$b._;}

ขอบคุณที่:

  • Night2สำหรับการย้อนกลับการต่อข้อมูลอย่างมีประสิทธิภาพและjoin()(-5 ตัวอักษร)
  • Night2สำหรับการแสดงวิธีการใช้chunk_split()'s $endพารามิเตอร์ (-4 ตัวอักษร)

วิ่งตัวอย่าง:

php > function s($s,$r,$c){echo _.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
php " _").$b._;}
php > s('HELLO', 4, 11);
_____________
_  L        _
_        L  _
_E          _
_    OH     _
_____________

ลองออนไลน์!


1
ฉันเชื่อว่าfn($s,$r,$c)=>($b=str_repeat(9,$c+2))."\n9".join("9\n9".str_split(str_shuffle(str_pad($s,$r*$c)),$c))."9\n$b";ควรทำงานใน PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ) และปล่อย canditate ออกวางจำหน่าย ( wiki.php.net/todo/php74 ) ดังนั้นจึงเป็น "คอมไพเลอร์" ที่มีมา ก่อนความท้าทายนี้และทุกคนสามารถใช้งานได้
Ismael Miguel

1
Doh คุณพูดถูก อ่านเกี่ยวกับ แต่ลืม (หมายเหตุสำหรับตัวเอง: ครั้งต่อไปไม่ใช่แค่อ่านเคล็ดลับของNight2 โหวตมันด้วยเช่นกันอาจช่วยให้จำได้)
จัดการ


1
ขอบคุณ @ Night2 ฉันไม่สามารถจินตนาการสิ่งที่ฉันทำยุ่งเมื่อวานนี้เพราะฉันพยายามย้ายสิ่งต่าง ๆ ภายในjoin()แต่ไม่สามารถลดขนาดได้ ☹
จัดการ

1
มีขนาดที่สั้นกว่าด้วยchunk_split: 94 ไบต์ฉันยังลบเครื่องหมายอัฒภาคสุดท้ายเนื่องจากฉันเชื่อว่าไม่จำเป็นคุณได้เขียนฟังก์ชันดังนั้นโค้ดที่จะกำหนดให้กับตัวแปรไม่ควรนับ
Night2

3

MATL , 22 19 ไบต์

tZ"ibpyn&Z@(TT35&Ya

ลองออนไลน์!

ขอบคุณ @LuisMendo สำหรับการบันทึก 3 ไบต์ดังนั้นตอนนี้ก็มี bytecount เหมือนกับคำตอบของ @ flawr แต่แตกต่างกันมากพอที่จะโพสต์ได้ ภาพรวมของภาพมุมกว้างระดับสูง:

 Z"                  % Create n x m matrix of spaces
           (         % Index into this matrix:
   i                 %  The alphabet vermicelli (explicit input)
        &Z@          %  at a random locations (randperm), which are
      yn             %   length(S) numbers, ranging
t   bp               %   from 1 to n*m
            TT35&Ya  % And finally add a border

คุณสามารถเปลี่ยนZ}&OจากZ"และยังช่วยให้คุณลบสุดท้ายc
หลุยส์ Mendo

@ LuisMendo โอ้ช่วยได้มาก! 1$Oมาคิดว่ามันฉันควรจะได้อย่างน้อยทำ
Sanchises

3

ทับทิม 121 ไบต์

สร้างชามสอบถามดัชนีของช่องว่างทั้งหมดภายในชามตัวอย่างจำนวนช่องว่างเท่ากับขนาดของสตริงและเติมพวกเขาเข้าsampleไม่กลับรายการเรียงลำดับดังนั้นจึงไม่จำเป็นต้องสลับ ค้นหาดัชนีขึ้นไป9*m*n(ซึ่งเกือบจะแน่นอนออกไปจากช่วง) จะยังคงได้รับช่องว่างทั้งหมดและเป็น 1 r.sizeไบต์สั้นกว่า

->s,m,n{r=[t=?@*(n+2),*["@#{' '*n}@"]*m,t]*$/;i=-1;(0..9*m*n).select{|j|r[j]==' '}.sample(s.size).map{|j|r[j]=s[i+=1]};r}

ลองออนไลน์!


3

สีแดง , 120 116 114 112 112 ไบต์

-2 ไบต์ขอบคุณ @Kevin Cruijssen!

func[s m n][random pad s m * n insert/dup t: copy"00"0 n
print t loop m[print rejoin[0 take/part s n 0]]print t]

ลองออนไลน์!


2
-2 ไบต์โดยกำจัด+ 1และใช้to"""00"0 nแทน
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณ! ฉันแทนที่มันด้วยcopyสำหรับจำนวนไบต์เดียวกัน
Galen Ivanov

1
แน่นอนว่าดูสะอาดขึ้นเล็กน้อย! ฉันไม่รู้แดงยกเว้นคำตอบที่ฉันเห็นจากคุณดังนั้นฉันจึงเล่นซอไปรอบ ๆ ;) จะวางtสายเป็นรายการนำหน้า / ต่อท้ายก่อนที่จะวนซ้ำเพื่อประหยัดทั้งสองหลวมprint tจะสั้นลงหรือไม่ ฉันสงสัย แต่เนื่องจากฉันไม่รู้วิธีเพิ่มรายการลงในรายการฉันไม่แน่ใจ
Kevin Cruijssen

3

Perl 6 , 74 67 ไบต์

-5 ไบต์ขอบคุณ Jo King

{0 X~0 x$^n,|comb($n,[~] $^s.comb[pick *,^$^m*$n]X//' '),0 x$n X~0}

ลองออนไลน์!

คำอธิบาย

{                                                                 }
                                         ^$^m*$n  # Range 0 .. M*N-1
                                  pick *,  # Shuffle
                         $^s.comb  # Split S into chars
                                 [              ]  # Pick shuffled elements
                                                 X//' '  # undef to space
                     [~]  # Join
             # Split into n-character strings
             comb($n,                                  )
            |  # Flatten
     # Add top and bottom of bowl
     0 x$^n,                                            ,0 x$n
 # Add left and right of bowl
 0 X~                                                          X~0



3

k4, 32 28 ไบต์

{4{|+x,'"#"}/y#a?(a:-*/y)$x}

แก้ไข: -4 ขอบคุณ Galen Ivanov!

เรียกว่าชอบ

f["hey";3 3]

คำอธิบาย:

                 (a:-*/y)    / neg product of y and assign to a 
                         $x  / left pad x so we have char vector the length of the inner area
               a?            / take `a` random drawings. if a is negative, draw with no duplicates/replacements
             y#              / reshape to y's dimensions
 4{        }/                / do {} 4 times 
   |+x,'"#"                  / append "#" along right-side of x then transpose (+) and reverse (|)

1
ฉันคิดว่าคุณสามารถบันทึกไบต์บางอย่างถ้าคุณเพียง แต่ผนวก#ในตอนท้ายของแต่ละบรรทัดและ transpose / การย้อนกลับ 4 ครั้ง, อะไรเช่นนี้
Galen Ivanov

1
@ GalenIvanov ดีอัปเดต!
เขียนลวก ๆ

3

Java (JDK) , 180 178 ไบต์

ไม่ใช่การนำเข้าพิเศษเดียว:

(y,m,n)->{for(m*=n;y.length()<m;y+=" ");var s="";for(;m-->0;y=s)for(var c:y.split(s=""))s=Math.random()<.5?s+c:c+s;s="#".repeat(n);return(s+y+s).replaceAll(".{"+n+"}","\n#$0#");}

ลองออนไลน์!

มันค่อนข้างเป็นการดิ้นรนที่จะทำให้เกมนี้พัง โดยเฉพาะอย่างยิ่งการนำเข้าที่เกี่ยวข้องกับวิธีการ Collections.shuffle () / อาร์เรย์มีมากเกินกว่าจะยอมรับได้ดังนั้นฉันจึงต้องสร้างอัลกอริธึมการสับสตริงของฉันเอง (อาจไม่มีประสิทธิภาพหรือกระจายอย่างสม่ำเสมอ) ต้องขอบคุณสตีเว่นอย่างมากสำหรับการพิสูจน์ตำแหน่งใด ๆ ที่สามารถสร้างขึ้นได้จากอัลกอริทึม

จัดรูปแบบ (พร้อมคำอธิบาย):

(y, m, n) ->                                                   // y = yummies in the soup,
{                                                              // m = height, n = width
    for (m *= n; y.length() < m; y += " ")                     // set m to m*n and
        ;                                                      // add spaces to y to fill up
    var s = "";                                                // the rest of the soup
    for (; m-- > 0; y = s)                                     // for m*n iterations, scramble y
        for (var c : y.split(s = ""))                          // with random appends
            s = Math.random() < .5 ? s + c : c + s;
    s = "#".repeat(n);                                         // create the top/bottom of the rim
    return (s + y + s).replaceAll(".{" + n + "}", "\n#$0#"); // add all sides of the rim
};

คำตอบที่ดี! +1 จากฉัน สิ่งเล็ก ๆ น้อย ๆ สำหรับเล่นกอล์ฟ: .replaceAll("(.{"+n+"})","\n#$1#")สามารถกลายเป็น.replaceAll(".{"+n+"}","\n#$0#")
Kevin Cruijssen

@KevinCruijssen ขอขอบคุณสำหรับการปรับปรุง :)
Avi

2

ถ่าน 27 ไบต์

NθNη↖B⁺²θ⁺²η#FS«W℅KKJ‽θ‽ηPι

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

NθNη

ป้อนความกว้างและความสูง

↖B⁺²θ⁺²η#

ใส่ชาม

FS«

วนซ้ำอักขระในสตริง

W℅KKJ‽θ‽η

ข้ามไปยังตำแหน่งสุ่มในชามจนกว่าจะพบจุดที่ว่างเปล่า

Pι

พิมพ์ตัวละครปัจจุบันโดยไม่ต้องเลื่อนเคอร์เซอร์


นั่นคือMove(:UpLeft)สิ่งที่จำเป็น? มันใช้งานได้ดีหากไม่มี แต่คุณอาจเพิ่มมันเข้าไปด้วยเหตุผลที่ฉันไม่ได้คิด
Kevin Cruijssen

1
@KevinCruijssen ไม่มีฉันจะไม่สามารถเขียนตัวอักษรลงในแถวล่างหรือคอลัมน์ขวาสุด
Neil

อ่านั่นแหละ ที่อธิบายมันขอบคุณ!
Kevin Cruijssen

2

Japt -R , 21 18 ไบต์

úV*W ö¬òW ²Ô²û2W+2

ลองมัน

úV*W ö¬òW ²Ô²û2W+2     :Implicit input of string U=S and integers V=M & W=N
úV*W                   :Right pad U with spaces to length V*W
     ö¬                :Random permutation
       òW              :Split to array of strings of length W
          ²            :Push 2
           Ô           :Reverse
            ²          :Push 2
             û2W+2     :Centre pad each element with "2" to length W+2
                       :Implicit output, joined with newlines

2

MATL , 29 27 19 ไบต์

pZ@iy~hw)1GeTT35&Ya

ลองออนไลน์!

ขอบคุณ @LuisMendo สำหรับ -8 ไบต์!

คำอธิบาย: pคำนวณจำนวน soup-pixels จากนั้นZ@สร้างการเปลี่ยนแปลงแบบสุ่มขนาดของจำนวนพิกเซลซุป เราจะใช้สิ่งนี้เป็นดัชนีiy~hซึ่งเป็นสตริงอินพุตที่มีการเพิ่มช่องว่างเพียงพอ w)สลับสองและดัชนีหนึ่งกับอื่น ๆ จากนั้นเราจะปรับรูปร่าง1Geรูปทรงเข้ารูปสี่เหลี่ยมผืนผ้าที่ต้องการและ#-Pad TT35&Yaโดยใช้


2
ฉลาด! ความพยายามของฉันคือ22 ไบต์
Sanchises

2
@Sanchises ไปโพสต์ต่อไป!
ข้อบกพร่อง

2

T-SQL 2017, 232 ไบต์

การทดสอบทางออนไลน์นี้เป็นเวอร์ชั่นที่เก่ากว่าของ sql-server ซึ่งมีราคาอักขระอื่น ฉันโพสต์รุ่นที่สั้นกว่า

แข็งแรงเล่นกอล์ฟ:

DECLARE @ varchar(max)=''SELECT top 999 @+=substring(@i,number+1,1)FROM spt_values
WHERE type='P'and number<@a*@b
ORDER BY newid()WHILE-@b<1SELECT @=stuff(@+' ',@b*@a+1,0,'#
#'),@b-=1PRINT stuff(replicate('#',2+2*@a),2+@a,0,trim(@))

ลองออนไลน์

Ungolfed:

DECLARE @ varchar(max)=''

SELECT top 999 @+=substring(@i,number+1,1)
FROM spt_values
WHERE type='P'and number<@a*@b
ORDER BY newid()

WHILE-@b<1
SELECT @=stuff(@+' ',@b*@a+1,0,'#
#'),@b-=1
PRINT stuff(replicate('#',2+2*@a),2+@a,0,trim(@))

2

C (เสียงดังกราว) , 169 164 162 160 ไบต์

i,b;f(n,m,s)char*s;{char*a,o[b=i=-~++n*(m+=3)];for(srand(time(a=o));--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;*s;*a=*a-32?*a:*s++)a=o+rand()%b;puts(o);}

ลองออนไลน์!

-2 วาง a = o ในเวลา () โทร // สำหรับ (srand (เวลา (a = o)); ...

บันทึก 7 ข้อเสนอแนะ @ceilingcat เพื่อใช้ - ~ ตัวแปรและที่เก็บข้อมูลอัตโนมัติสำหรับสตริง o พร้อมการปรับปรุงมากมาย

Degolf:

char*a,// pointer for set operations 
*o=malloc(b=i=(m+=3)*(n+=2));  => o[b=i=(m+=3)*-~++n]
// before allocating for the whole bowl as a char array
// increments m by 3 (2 for rims and 1 for '\n') and n by one but allocates for 2(rims)
// and assigns bowl size to i and b.
srand(time(0));// seeds rand function 
for(// loop to make empty bowl 
a=o;// using pointer as iterator
 --i ;)//  i decremented as a counter

 *a=// sets every char to..
 i%m?// if(not) over right side of bowl (m+3)
   -~i%m<3|i<m|i>m*n-m?35// if on rim '#'//-~i == (i+1)
   :32 // else ' ' 
  :10;// i%m==0

for(*a=0;// before loop terminates bowl with \0
 *s;// for every letters(exit on '\n')
 *a=*a-32?*a:*s++)
 // puts letter if bowl at a is a space and
 // go to next letter

 a=o+rand()%b; 
 // sets a to o offsetted by random

puts(o);// prints bowl 

แนะนำ*a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;แทน--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
ceilingcat

@ceilingcat ควรใช้งานได้ แต่ด้วยเหตุผลบางประการทำให้มีการแสดงผลผิดพลาดใน 2 กรณีทดสอบล่าสุด
AZTECCO


1

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

P⁶ẋaẊs⁸ṪṾ€«”~ZƊ⁺

ลิงก์ dyadic ยอมรับรายการของจำนวนเต็ม, [M, N]ด้านซ้ายและรายการของอักขระ, Sด้านขวาซึ่งให้รายการของรายการของอักขระ, บรรทัด ใช้อักขระตัวหนอน~เป็นเส้นขอบ

ลองออนไลน์!

เอาต์พุตที่เป็นไปได้ทั้งหมดมีโอกาสไม่เป็นศูนย์ที่จะให้ผลตั้งแต่เราสับเปลี่ยน ( ) รายการอักขระSพร้อมกับจำนวนช่องว่างที่เหมาะสม

รหัสṾ€«”~ZƊ⁺บันทึกไบต์ที่ฉันคิดว่าจะต้องเข้าร่วมกับ newlines ว่าโปรแกรมเต็มรูปแบบโดยใช้จำนวนเต็มเช่นศูนย์จะต้องจ้าง (เช่นP⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡YหรือP⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y) อาจมีวิธีการประหยัดมากขึ้น ... ?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.