Isi mangkuk dengan sup alfabet

24

Kita tampaknya tidak pernah mendapatkan lelah tantangan terkait alfabet-...


Resep

Diberikan

  • serangkaian huruf S, dan
  • dua bilangan bulat positif M, N,

menghasilkan sup alfabet dengan huruf-huruf yang Smenempati posisi acak dalam mangkuk berukuran persegiM × N, dibingkai oleh karakter non-alfabet, non-spasi untuk mewakili tepi mangkuk.

Posisi yang tidak digunakan huruf harus ditampilkan sebagai spasi. Lihat contoh di bawah ini .

Aturan tambahan

  • Ukuran M× Nmengacu pada interior mangkuk. Ukuran termasuk pelek adalah M+2× N+2.
  • Setiap karakter dari Sharus muncul sekali dalam mangkuk, di posisi yang berbeda ; yaitu, satu karakter tidak dapat menimpa yang lain.
  • S mungkin mengandung duplikat . Sebagai contoh, jika Sstring 'abcc', sup harus berisi satu a, satu b, dan dua c(semua dalam posisi berbeda).
  • Input akan memenuhi pembatasan M >= 1 , N >= 1, 1 <= length(S) <= M*N.
  • Tepi mangkuk dapat berupa karakter non-alfabet, non-spasi , konsisten di seluruh program yang dijalankan dan nilai input.
  • Posisi huruf dalam mangkuk adalah acak, sehingga hasilnya dapat berbeda setiap kali program dijalankan dengan input yang sama.
  • Diberikan input, setiap set posisi surat yang mungkin harus memiliki probabilitas tidak nol . Karena ini tidak dapat diperiksa dari beberapa realisasi program, tolong jelaskan bagaimana kode Anda memenuhi ini.
  • Memimpin atau mengeklik spasi putih di sekitar tepi diizinkan.
  • Sakan berisi hanya huruf besar . Jika diinginkan, Anda dapat memilih untuk hanya mengambil huruf kecil .
  • Input dan output fleksibel seperti biasa. Misalnya, output dapat berupa string dengan baris baru, array karakter 2D, atau daftar garis.
  • Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.
  • Kode terpendek dalam byte menang.

Contohnya

Input ditampilkan sebagai S, [M N], di mana Mjumlah baris dan Njumlah kolom. Karakter #digunakan untuk pelek.

'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  #
###########################################
Luis Mendo
sumber
Berkaitan longgar
Luis Mendo
"Posisi surat dalam mangkuk adalah acak, [...]" <- maksud Anda bisa acak atau harus acak? Dan bisakah semua baris memiliki jumlah karakter yang sama, sepanjang waktu?
Ismael Miguel
@IsmaelMiguel Must . Dan setiap konfigurasi harus memiliki probabilitas bukan nol terjadi (dinyatakan dalam tantangan). Sehingga mengesampingkan pendekatan-selalu-sama-panjang
Luis Mendo
Bisakah rim konsisten di seluruh program berjalan dan nilai input, tetapi menggunakan beberapa non-huruf, misalnya menggambar perbatasan seni ASCII dengan |+-?
Adám
@ Adm Hm Saya akan mengatakan tidak, itu perubahan yang terlalu besar
Luis Mendo

Jawaban:

13

05AB1E , 20 18 16 15 14 byte

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

Mengambil tiga input secara berurutan: tinggi, lebar, string. Output sebagai daftar karakter 2D.
Digunakan 8sebagai batas, tetapi bisa berupa angka apa saja.

-1 byte terima kasih kepada @Grimy .

Cobalah secara online atau verifikasi semua kasus uji . (TIO berisi }}J»di footer untuk mencetak hasilnya dengan cantik; silakan menghapusnya untuk melihat daftar karakter 2D keluaran aktual sebagai gantinya.)

Penjelasan:

*               # 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)
Kevin Cruijssen
sumber
1
@LuisMendo Saya sebenarnya hanya mengatakan tantangan 3 menit yang lalu. ;) Ini implementasi yang sangat mudah. Akan mencoba golf turun dari sini.
Kevin Cruijssen
1
Sangat bagus, saya tidak memikirkan *j! Ini 13 untuk legacy , atau 14 jelek untuk modern (menampilkan array karakter 2D).
Grimmy
1
@ Grimy The 13-byter tampaknya gagal untuk input 1,1,"O", jadi saya pikir itu harus menjadi 14-byter untuk warisan juga. Terima kasih untuk -1.
Kevin Cruijssen
7

APL (Dyalog Unicode) , 25 byte SBCS

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

Cobalah online!

-22 Terima kasih kepada @ngn, -7 terima kasih kepada @ngn dan @ Adám

Penjelasan:

'#',∘⌽∘⍉⍣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 byte SBCS

Sudut pelek adalah karakter yang berbeda

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

Cobalah online!

Menggunakan dfn untuk menampilkan kotak.

Yang Mulia
sumber
29: '#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/) Coba online!
Adám
28: {'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(atau bukannya >jika ⎕io=1)
ngn
sebenarnya, 27:'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
ngn
3
25:'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
ngn
6

Python 3 , 110 byte

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

Cobalah online!

Mengacak dengan menggunakan setpemahaman dan mengembalikan array karakter 2D.

Jitse
sumber
Penggunaan pemahaman set yang bagus untuk mengacak. +1. Tetapi kode Anda bergantung pada nama 'f' dari fungsi tersebut. Karena itu saya pikir solusi lambda tidak valid ...
agtoever
1
@ agtoever Terima kasih! Fungsi ini tidak rekursif, sehingga bisa anonim. Apakah Anda mengacu pada f'{s:{m*n}}'bagian itu? Karena itu adalah sintaks untuk string yang diformat, yang kebetulan juga dimulai dengan f.
Jitse
3
Kode ini tampaknya melanggar PEP 8 dalam beberapa cara.
Christofer Ohlsson
1
@ Christofer-Ohlsson benar-benar!
Jitse
2
@ChristoferOhlsson Selamat datang di dunia kode-golf, haha. ;) Tidak ada komentar / dokumen apa pun; variabel / metode karakter tunggal tanpa spasi / baris baru (tidak perlu); berpotensi ratusan kompiler-peringatan yang kita abaikan saja; meningkatkan kinerja dari O (log (N)) ke O (N ^ N); dll. Jika itu bisa menghemat bahkan satu byte, semuanya baik-baik saja dan sangat layak untuk kode-golf. ;)
Kevin Cruijssen
5

Bash + coreutils, 139 125 karakter

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

Contoh dijalankan:

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

Cobalah online!

Bash + coreutils + kotak, 97 karakter

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

Contoh dijalankan:

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

Cobalah online! (Sebagian, karena boxestidak diinstal pada TIO.)

manatwork
sumber
5

J , 30 29 byte

-1 byte terima kasih kepada Jonah

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

Cobalah online!

Galen Ivanov
sumber
1
Karena TIO menggunakan seed acak tetap. 9!:1]6!:9''memperbaikinya
Adám
2
Sangat suka cara menggunakan nol mengisi {.. Tweak sedikit untuk 29 '#'|.@|:@,^:4[$*/@[(?~@[{{.)]: Cobalah online!
Jonah
1
@Jonah Terima kasih!
Galen Ivanov
5

PowerShell , 163 111 93 byte

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

Cobalah online!

Mengambil input sebagai $width, $hdelapan, $string.

Membangun string dari idth yang #sesuai $w, string-gabung yang dengan beberapa perhitungan, dan kemudian #string yang sama lagi. Perhitungan dimulai dengan mengambil $string input , dan melakukan .padRig hthingga delapan $wdengan $hpanjang (yaitu, membuat string cukup lama untuk benar-benar mengambil ruang persegi panjang. Kami kemudian mengonversi string itu toCharArra y, dan sortitu Random. Itu memberi kita bagian tengah yang tercampur aduk. Akhirnya, kita -replacemenjadi potongan-potongan dengan nilai yang sama $w, dan mengelilingi potongan itu dengan #s.

-52 Berkat inspirasi dari AZTECCO
-18 bytes berkat mazzy

AdmBorkBork
sumber
Anda memiliki 2 x acak (12) sementara JS memilikinya, ia menambahkan spasi untuk mengisi ukuran M * N dan disortir, setelah itu Anda masih membayar 21 untuk '$' sayangnya
AZTECCO
1
@AZTECCO Terima kasih atas ilhamnya!
AdmBorkBork
Terima kasih @ Mazzy - sangat pandai dengan -replacebukannya membelah dan bergabung.
AdmBorkBork
4

JavaScript (ES7), 125 byte

Mengembalikan string. Digunakan 0sebagai karakter bingkai.

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

Cobalah online!

Berkomentar

(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
Arnauld
sumber
4

APL (Dyalog Extended) , 23 byte SBCS

Fungsi infiks diam-diam anonim. Dibawa [M,N]sebagai argumen kiri dan Ssebagai argumen kanan.

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

Cobalah online!

×/⍛(... ) terapkan fungsi berikut di antara argumen, ganti argumen kiri dengan produknya:

 ambil M× Nkarakter dari S, padding dengan spasi di sebelah kanan

 atur ulang itu dengan urutan berikut:

?⍨⍤ indeks acak 1 sampai…
 argumen kiri ( M× N)

r bentuk itu menjadi bentuk berikut:

 argumen kiri (yaitu Mbaris dan Nkolom)

'#'... ⍣4 menerapkan fungsi berikut empat kali, setiap kali dengan karakter hash sebagai argumen kiri:
∘⍉ transpos argumen kanan
∘⌽ mencerminkan argumen kanan
,menggabungkan kolom hash ke sisi kiri itu

Adm
sumber
4

PHP 7.4, 107 99 94 karakter

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

Terimakasih untuk:

  • Ismael Miguel untuk mengingatkan saya tentang fungsi panah PHP 7.4 (-10 karakter)
  • Night2 untuk secara efisien membalikkan rangkaian dan join()(-8 karakter)
  • Night2 untuk menunjukkan bagaimana menggunakan chunk_split()'s $endparameter (-5 karakter)

Cobalah online!

PHP 7.3, 117 112 108 karakter

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

Terimakasih untuk:

  • Night2 untuk membalikkan rangkaian dan join()(-5 karakter) secara efisien
  • Night2 untuk menunjukkan bagaimana menggunakan chunk_split()'s $endparameter (-4 karakter)

Contoh dijalankan:

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     _
_____________

Cobalah online!

manatwork
sumber
1
Saya percaya itu 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";harus bekerja di PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ), dan rilis kandidat telah dirilis ( wiki.php.net/todo/php74 ), jadi, itu adalah "kompiler" yang tersedia yang datang sebelum tantangan ini, dan siapa pun dapat menggunakannya.
Ismael Miguel
1
Doh, kamu benar. Baca tentang, tetapi lupa. (Catatan untuk diri sendiri: waktu berikutnya tidak hanya membaca Night2 's ujung Upvote itu juga, mungkin membantu mengingat..)
manatwork
2
99 bytes
Night2
1
Terima kasih, @ Night2. Saya tidak bisa membayangkan apa yang saya berantakan kemarin, ketika saya mencoba memindahkan lebih banyak barang di dalamnya join(), tetapi gagal mengurangi ukurannya. ☹
manatwork
1
Bahkan punya yang lebih pendek menggunakan chunk_split: 94 byte Saya juga menghapus titik koma terakhir karena saya percaya itu tidak diperlukan, Anda telah menulis fungsi, jadi kode yang akan menetapkannya ke variabel tidak boleh dihitung.
Night2
3

MATL , 22 19 byte

tZ"ibpyn&Z@(TT35&Ya

Cobalah online!

Terima kasih @LuisMendo untuk menyimpan 3 byte, jadi sekarang ia memiliki bytecount sama @ flawr ini jawabannya , tetapi cukup berbeda untuk mengirim pula. Ikhtisar agoritme tingkat tinggi:

 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
Sanchises
sumber
Anda dapat mengubahnya Z}&Odengan Z", dan itu juga memungkinkan Anda untuk menghapus finalc
Luis Mendo
@LuisMendo Oh, itu sangat membantu! Kalau dipikir-pikir, setidaknya aku harus melakukannya 1$O.
Sanchises
3

Ruby , 121 byte

Buat mangkuk, kueri indeks semua ruang di dalam mangkuk, sampel sejumlah ruang yang sama dengan ukuran string, dan isi mereka. sampleTidak mengembalikan daftar yang diurutkan, sehingga tidak perlu mengocok. Mencari indeks hingga 9*m*n(yang hampir pasti keluar dari jangkauan) masih akan mendapatkan semua spasi dan 1 byte lebih pendek dari 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}

Cobalah online!

Nilai Tinta
sumber
3

Merah , 120 116 114 112 byte

-2 byte terima kasih kepada @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]

Cobalah online!

Galen Ivanov
sumber
2
-2 byte dengan menyingkirkan + 1dan menggunakan to"""00"0 nsebagai gantinya.
Kevin Cruijssen
1
@KevinCruijssen Terima kasih! Saya menggantinya dengan copy, untuk jumlah byte yang sama.
Galen Ivanov
1
Itu memang terlihat sedikit lebih bersih! Saya tidak tahu Red kecuali untuk jawaban yang saya lihat dari Anda, jadi saya hanya mengotak-atik sedikit. ;) Apakah menempatkan tgaris sebagai item utama / tertinggal sebelum perulangan untuk menghemat dua longgar print tmenjadi lebih pendek? Saya meragukannya, tetapi karena saya tidak tahu cara menambahkan item ke daftar, saya tidak yakin.
Kevin Cruijssen
3

Perl 6 , 74 67 byte

-5 byte terima kasih kepada Jo King

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

Cobalah online!

Penjelasan

{                                                                 }
                                         ^$^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
nwellnhof
sumber
69 byte
Jo King
3

Perl 5 -lF , 99 97 byte

-2 byte milik @NahuelFouilleul

%k=map{$_=>$F[$_]||$"}0..($m=<>)*($n=<>)-1;say+($p='#'x($n+1)),map"#
#"x!($i++%$n).$_,values%k,$p

Cobalah online!

Xcali
sumber
($i++%$n==0)dapat diubah oleh!($i++%$n)
Nahuel Fouilleul
3

k4, 32 28 byte

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

sunting: -4 terima kasih kepada Galen Ivanov!

disebut suka

f["hey";3 3]

penjelasan:

                 (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 (|)
tulisan cakar ayam
sumber
1
Saya pikir Anda dapat menyimpan beberapa byte jika Anda hanya menambahkan #pada akhir setiap baris dan transpos / balikkan 4 kali, kira-kira seperti ini .
Galen Ivanov
1
@ GalenIvanov bagus, diperbarui!
coretan
3

Java (JDK) , 180 178 bytes

Tidak ada impor tambahan tunggal:

(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#");}

Cobalah online!

Itu adalah perjuangan yang cukup untuk menurunkan golf ini. Secara khusus, impor yang terlibat dengan metode Collections.shuffle () / Array terlalu banyak untuk diterima, jadi saya harus membuat algoritma String shuffling saya sendiri (mungkin tidak efisien atau tidak terdistribusi secara merata). Terima kasih banyak kepada Steven karena telah membuktikan set posisi apa pun dapat dihasilkan dari algoritma.

Diformat (dengan penjelasan):

(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
};
Avi
sumber
Jawaban bagus! +1 dari saya. Satu hal kecil untuk golf: .replaceAll("(.{"+n+"})","\n#$1#")bisa menjadi.replaceAll(".{"+n+"}","\n#$0#")
Kevin Cruijssen
@KevinCruijssen Terima kasih atas perbaikannya :)
Avi
2

Arang , 27 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam urutan lebar, tinggi, string. Penjelasan:

NθNη

Masukkan lebar dan tinggi.

↖B⁺²θ⁺²η#

Bingkai mangkuk.

FS«

Ulangi karakter dalam string.

W℅KKJ‽θ‽η

Lompat ke posisi acak dalam mangkuk hingga ditemukan titik kosong.

Pι

Cetak karakter saat ini tanpa menggerakkan kursor.

Neil
sumber
Apakah itu Move(:UpLeft)perlu? Ini berfungsi dengan baik tanpa itu, tapi mungkin Anda menambahkannya karena alasan yang tidak saya pikirkan?
Kevin Cruijssen
1
@KevinCruijssen Tanpa itu saya tidak akan pernah bisa menulis surat ke baris paling bawah atau paling kanan.
Neil
Ah, jadi begitu. Itu menjelaskannya, terima kasih!
Kevin Cruijssen
2

Japt -R , 21 18 byte

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

Cobalah

ú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
Shaggy
sumber
2

MATL , 29 27 19 byte

pZ@iy~hw)1GeTT35&Ya

Cobalah online!

Terima kasih @LuisMendo untuk -8 byte!

Penjelasan: pmenghitung jumlah sup-piksel. Kemudian Z@menghasilkan permutasi acak ukuran jumlah piksel sup. Kami akan menggunakan ini sebagai indeks iy~hyang merupakan string input dengan spasi yang cukup ditambahkan. w)menukar keduanya dan mengindeks satu dengan yang lainnya. Kami kemudian membentuk kembali 1Gebentuk menjadi persegi panjang yang diinginkan dan #-padanya menggunakan TT35&Ya.

cacat
sumber
2
Pintar! Usaha saya adalah 22 byte
Sanchises
2
@Sanchises Tetap kirimkan!
flawr
2

T-SQL 2017, 232 byte

Menguji online ini adalah versi lama dari sql-server dengan biaya karakter lain. Saya memposting versi yang lebih pendek.

Golf:

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

Cobalah online

Tidak Disatukan:

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(@))
t-clausen.dk
sumber
2

C (dentang) , 169 164 162 160 byte

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

Cobalah online!

-2 menempatkan = o dalam waktu () panggilan // untuk (srand (waktu (a = o)); ...

Menyimpan 7 saran @ceilingcat untuk menggunakan - ~ penyimpanan variabel dan otomatis untuk string o plus banyak peningkatan.

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 
AZTECCO
sumber
Sarankan *a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;alih-alih--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
ceilingcat
@ceilingcat seharusnya bekerja tetapi karena alasan tertentu ia memberikan output yang salah pada 2 test case terakhir
AZTECCO
2

Ikon , 136 133 131 118 byte

procedure f(s,n,m)
s||:=repl(" ",m*n-*s)
!s:=:?s&\z
write(t:=repl(0,m+2))
write(0,s[1+(0to n)*m+:m],0)&\z
write(t)
end

Cobalah online!

Galen Ivanov
sumber
1

Jelly , 16 byte

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

Sebuah dyadic Link yang menerima daftar bilangan bulat [M, N],, di sebelah kiri dan daftar karakter,S , di sebelah kanan yang menghasilkan daftar daftar karakter, garis. Menggunakan karakter tilde ~,, sebagai perbatasan.

Cobalah online!

Semua kemungkinan output memiliki peluang nol untuk dihasilkan sejak kami mengacak ( ) daftar karakterS beserta jumlah ruang yang sesuai.

Kode Ṿ€«”~ZƊ⁺menyimpan byte yang saya bayangkan akan diperlukan untuk bergabung dengan baris baru yang program penuh menggunakan bilangan bulat seperti nol perlu menggunakan (misalnya P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Yatau P⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y). Mungkin ada cara untuk menghemat lebih banyak ...?

Jonathan Allan
sumber