Aliran Huruf ke Kata

8

Diberikan string yang hanya berisi huruf (tidak peka huruf besar-kecil), pisahkan menjadi kata-kata dengan panjang acak yang seragam, menggunakan distribusi di bawah ini, dengan pengecualian kata terakhir, yang dapat berupa panjang yang valid (1-10). Output Anda adalah kata-kata ini, sebagai string yang dipisahkan spasi ( "test te tests"), array string ( ["test","te","tests"]), atau format output serupa lainnya.

Distribusi Panjang Kata

Word Length - Fractional Chance / 72 - Rounded Percentage
1 - 2 / 72 - 2.78%
2 - 14 / 72 - 19.44%
3 - 16 / 72 - 22.22%
4 - 12 / 72 - 16.67%
5 - 8 / 72 - 11.11%
6 - 6 / 72 - 8.33%
7 - 5 / 72 - 6.94%
8 - 4 / 72 - 5.56%
9 - 3 / 72 - 4.17%
10 - 2 / 72 - 2.78%

Peluang Anda tidak perlu sama persis - peluangnya bisa dimatikan oleh 1/144th, atau .69%, di kedua arah (tapi jelas mereka masih harus meringkas hingga 72/72atau 100%).

Data kira-kira ditebak dari halaman keempat, gambar pertama tulisan ini .

Uji Kasus dengan Output Sampel

Perilaku pada kasus uji yang sangat singkat (panjang <11) tidak ditentukan.

Perhatikan bahwa saya membuat ini dengan tangan, sehingga mereka dapat atau tidak mengikuti distribusi seragam di atas.

abcdefghijklmnopqrstuvwxyz
abcd efgh i jklmnopq rs tu vwx yz

thequickbrownfoxjumpedoverthelazydog
t heq uick brown fo xj ump edo vert helazydog

ascuyoiuawerknbadhcviuahsiduferbfalskdjhvlkcjhaiusdyfajsefbksdbfkalsjcuyasjehflkjhfalksdblhsgdfasudyfekjfalksdjfhlkasefyuiaydskfjashdflkasdhfksd
asc uyoi uawer k nb a dhcviua hsid ufe r bfa lskd jhv lkcj haius dy faj se fbks dbfkals jcuyasjehf lkjh falk sd blhsgdf asudyfekjf alk sdjfhlk asefyu iaydskfja shdflk as dhf ksd

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Stephen
sumber
Sandbox
Stephen
Bisakah kata terakhir menjadi string kosong?
rahnema1
@ Rahnema1 yang Anda maksud dalam output array?
Stephen
Ya, elemen terakhir dari output array.
rahnema1
@ Rahnema1 yakin, karena jika Anda bergabung dengan array pada ruang Anda hanya akan memiliki ruang tambahan, yang akan saya izinkan.
Stephen

Jawaban:

5

Jelly , 28 byte

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ

Tautan monadik yang mengambil daftar dan mengembalikan daftar daftar.

Cobalah online! (footer memisahkan daftar daftar yang dihasilkan dengan spasi)

Bagaimana?

Menggunakan semua persentase dalam distribusi dibulatkan ke bilangan bulat terdekat (dengan demikian berada dalam ambang batas yang diizinkan 0,69%).

“¤Œæ׿®¬©¥¤‘Jẋ"$FẋLẊ‘1¦+\Ṭœṗ - Link: list (of characters), s
“¤Œæ׿®¬©¥¤‘                 - code page indexes = [3,19,22,17,11,8,7,6,4,3]
               $             - last two links as a monad:
            J                -   range of length = [1, 2, 3, 4, 5,6,7,8,9,10]
              "              -   zip with:
             ẋ               -     repeat list = [[1,1,1],...,[9,9,9,9],[10,10,10]]
                F            - flatten (into one list of length 100)
                  L          - length of s
                 ẋ           - repeat list (one list of length 100*length(s) with the
                             -              correct distribution of integer lengths)
                   Ẋ         - shuffle
                      ¦      - sparse application of:
                    ‘        -   increment
                     1       -   to indexes: 1 (offset indexes for the partition below)
                        \    - cumulative reduce by:
                       +     -   addition (e.g. [4,4,7,1,...] -> [4,8,15,16,...])
                         Ṭ   - untruth (yield a list with 1s at those indexes (1 indexed)
                          œṗ - partition s at truthy indexes (note: excess ignored)
Jonathan Allan
sumber
Skrip Anda secara teoritis dapat menampilkan daftar yang elemen pertamanya adalah string kosong. Tidak yakin apakah diizinkan oleh pertanyaan.
@ThePirateBay ya saya sebenarnya baru saja memperhatikan hal ini - saya perlu menambahkan 1 ke elemen pertama dari panjang kumulatif saya; akan segera diperbarui untuk memperbaikinya.
Jonathan Allan
Diperbaiki, dan penjelasan ditambahkan (tidak dapat meminta untuk memberikan ruang utama karena panjang kata pertama sebenarnya menggunakan distribusi yang salah).
Jonathan Allan
4

PHP, 94 byte

for(;$c=$argn[$k++];print$c." "[--$e])if(!$e)for($r=rand(0,71);$r>ord(x^"ywgSKAF:=?"[$e++]););

Jalankan sebagai pipa dengan -nRatau coba online .

kerusakan

for(;$c=$argn[$i++];            # loop $c through string
    print$c                         # 2. print current character,
        ." "                        # 4. if remaining length is 0, print space
        [--$e]                      # 3. decrement remaining length
    )
    if(!$e)                         # 1. if remaining length is 0,
        for($r=rand(0,71);              # get random value from 0 to 71
            $r>ord(x^"ywgSKAF:=?"[$e++])    # and increment $e while $r is > probability
        ;);

Catatan: ywgSKAF:=?menunjukkan kemungkinan peningkatan -1:[1,15,31,43,51,57,62,66,69,71]

Titus
sumber
Saya bertanya-tanya: Apakah probabilitas berubah jika saya meminta rand()setiap perbandingan? Jika tidak, saya bisa menghemat 5 byte.
Titus
1
Mereka pasti akan berubah, misalnya probabilitas panjang 2 akan menjadi 70/72 * 16/72, yang lebih tinggi dari 14/72.
Ørjan Johansen
@ ØrjanJohansen Sesuatu mengatakan kepada saya bahwa itu akan terjadi. Kasihan: Dengan begitu saya akan membuang setidaknya 5 byte.
Titus
Ini bukan pertama kalinya saya melihat solusi PHP yang seharusnya lengkap yang tidak dimulai dengan <? atau <? php. Jalankan sebagai program mandiri, PHP membutuhkannya. Atau apakah saya melewatkan sesuatu?
manassehkatz-Moving 2 Codidact
@manassehkatz Anda hilang Run as pipe with -nR. Yaitu kode ini seharusnya menjadi parameter untuk php, bukan file. Gunakan echo <input> | php -nR '<code>'pada baris perintah untuk mengeksekusi.
Titus
3

Oktaf, 108 byte

@(s)mat2cell(s,1,[k=(w=repelems(1:10,[1:10;'AMOKGEDCBA'-63])(randi(72,1,n=nnz(s))))(cumsum(w)<=n) n-sum(k)])

Cobalah online!

* Mengambil string sebagai input dan output array string.

* Elemen terakhir dari output mungkin berupa string kosong.

rahnema1
sumber
3

Python 2, 154 150 147 145 byte

Baiklah, ini upaya pertama saya di golf kode. Lurus dengan kode:

import numpy.random as r
def f(s):
 i=0
 while i<len(s):
    i+=r.choice(11,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
    s=s[:i]+' '+s[i:]
    i+=1
 return s

Indentasi kedua adalah dengan tab char seperti yang Anda lihat di versi TIO saya: Cobalah Online .

Apa yang saya lakukan adalah menambahkan spasi dalam string sesuai dengan distribusi yang diberikan. Saya sangat mengerti distribusi saya dengan menggunakan:

import collections
dist = r.choice(11,100000,p=[x/72. for x in [0,2,14,16,12,8,6,5,4,3,2]])
print collections.Counter(dist)

Yang memberi saya:

Word Length - Rounded Percentage as asked - Rounded Percentage as counted
1 - 2.78% - 2.794%
2 - 19.44% - 19.055%
3 - 22.22% - 22.376%
4 - 16.67% - 16.638%
5 - 11.11% - 11.246%
6 - 8.33% - 8.362%
7 - 6.94% - 7.063%
8 - 5.56% - 5.533%
9 - 4.17% - 4.153%
10 - 2.78% - 2.780%

Yang menurut saya cukup benar. Saya kemudian ulangi proses menambahkan spasi sampai panjang string saya berhasil. Saya juga menambah indeks posisi saya satu per satu setelah menambahkan spasi. Saya harap seseorang dapat membantu saya mengeluarkan garis ini, tetapi saya tidak melihat bagaimana cara mengeluarkannya tanpa memalsukan ruang pertama.

Ketika saya melihat teks saya, saya menyadari bahwa saya harus belajar banyak tentang Situs ini. Bisakah seseorang menautkan saya panduan cara menggunakan fungsi jawaban Stackoverflow di komentar sehingga saya bisa belajar untuk posting saya berikutnya.


Edit:

Saat membaca ulang postingan saya, saya menemukan cara untuk menghilangkan i + = 1. Jadi saya menyimpan 4 byte dengan melakukan itu. Kode baru terlihat seperti ini:

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):
  i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1
  s=s[:i]+' '+s[i:]
 return s

Cobalah online!


Edit:

Saya menemukan bahwa saya dapat menghapus beberapa linebreak.

import numpy.random as r
def f(s):
 i=-1
 while i<len(s):i+=r.choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s


Sunting: Saya memodifikasi impor saya dan menempatkan definisi i di dalam fungsi.

from numpy.random import*
def f(s,i=-1):
 while i<len(s):i+=choice(11,p=[x/72. for x in[0,2,14,16,12,8,6,5,4,3,2]])+1;s=s[:i]+' '+s[i:]
 return s

Cobalah online!

Simon
sumber
Selamat datang di Programming Puzzles & Code Golf! Posting pertama yang bagus! Saya telah mengedit jawaban Anda sedikit untuk memperbaiki pemformatan (judul, sorotan sintaksis), Anda dapat melihat apa yang berubah untuk melihat perintah untuk posting selanjutnya. (Saya tidak memiliki tautan untuk memberi Anda dengan sedih, tapi semoga orang lain akan melakukannya)
Dada
Terima kasih atas sambutan dan memformat teks saya. Ini membantu saya dan saya sudah menggunakannya di Edit saya.
Simon
2

Dyalog APL, 90 byte

{k←⍵⋄{' '~⍨(2⊃⍵)↓k↑⍨⊃⍵}¨(↓(o[1;2]),0),↓o←1↓⍉2(1-⍨≢⍵)⍴+\((2 14 16 12 8,⌽1+⍳5)\⍳10)[72?⍨≢⍵]}

Cobalah online! Tekan Jalankan beberapa kali untuk melihat perubahannya.

Bagaimana?

72?⍨≢⍵ - roll 72 panjang sisi dadu input kali

[...] - indeks di dalam

(2 14 16 12 8,⌽1+⍳5)\⍳10- perluas rentang 10 dengan 2 14 16 12 8 6 5 4 3 2(untuk membuat pembobotan acak)

+\ - jumlah kumulatif

⍉2(1-⍨≢⍵)⍴- bentuk sebagai meja zip x y zz x, x y, y z

o←1↓ - Jatuhkan elemen pertama

(↓(o[1;2]),0),↓o - membungkus dengan koordinat pertama dipasangkan dengan 0

¨ - untuk setiap pasangan (x, y)

(2⊃⍵)↓k↑⍨⊃⍵ - ambil input dari indeks x ke y

' '~⍨ - dan menghapus spasi

Uriel
sumber
2

Python 2 , 155 byte

from random import*
def f(s):
 i=sum([[i+1]*[2,14,16,12,8,6,5,4,3,2][i]for i in range(10)],[])[randint(0,71)]
 return s if len(s)<11else s[:i]+' '+f(s[i:])

Cobalah online!

Chas Brown
sumber
2

Mathematica, 164 byte

(s=Length[c=Characters@#];t=0;l={};While[t<s,If[t+(r=RandomChoice[{2,14,16,12,8,6,5,4,3,2}->Range@10])<=s,l~AppendTo~r];t=Tr@l];""<>#&/@FoldPairList[TakeDrop,c,l])&


mengambil string sebagai input
output array string

J42161217
sumber
2

Arang , 43 39 byte

FθF⁺¹I‽⪫Eχ×Iκ⌕᧔v↷£o8″!”κω⊞υ⎇κω Fθ⁺ι⊟υ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Menghasilkan spasi tambahan jika kata terakhir adalah ukuran tepat yang dipilih secara acak.

Neil
sumber
Ya sepertinya terlalu lama: / Ada ide untuk fitur baru yang akan mempersingkatnya?
ASCII
@ ASCII-only Saya tidak bisa memikirkan cara yang baik untuk menghasilkan tabel probabilitas, yang sudah lebih dari 50% dari kode. Akan lebih baik jika saya tidak harus bekerja di sekitar Assign(Slice(q, i), q);tidak bekerja sekalipun.
Neil
Itu akan berhasil, hanya saja ambigu, tidak sepenuhnya yakin cara terbaik untuk memperbaikinya, maaf
ASCII-only
Woah sangat bersarang
ASCII
@ Hanya ASCII Siapa yang peduli jika menghemat byte?
Neil
2

Perl 5 , 107 byte

@B=((1,10,9,5,2)x2,(2,3,4)x12,(5,6)x6,7,(3,7,8)x4,9);while(10<length){$i=$B[rand 72];s/.{$i}//;print"$& "}

Cobalah online!

106 byte kode +1 untuk -p

Xcali
sumber
Selamat datang di situs ini! Senang melihat pegolf Perl baru, jawaban yang bagus! (Anda masih dapat menyimpan beberapa byte ). Juga, saya sarankan menambahkan beberapa penjelasan, sehingga orang-orang non-Perl memiliki gagasan tentang bagaimana Anda melakukannya (dan bahkan untuk Perl coder, itu menghemat sedikit waktu), tetapi itu tidak wajib dan hanya terserah Anda.
Dada
1

Ruby , 96 + 1 = 97 byte

Menggunakan -pbendera.

i=0
m=[3,19,22,17,11,8,7,6,4,3].flat_map{|k|[i+=1]*k}
i=0
$_[i-1,0]=' 'while~/$/+1>i+=1+m.sample

Cobalah online!

Nilai Tinta
sumber
1

> <> , 168 152 byte

<v?(0:i
~/<r
/x\/oo \
012\oo~\!/ !ox\
\v/:1=?^?\ooo>>
 x^
v\:1\/>> o
|/o\=\x^!/
voo/? >x
v\o~/ v_
>" "\?\x>xoo\
^oooooo<<< \
^.22/ \>x!/xv
^ooooooo_o<<<

Cobalah online , atau tonton di taman bermain ikan !

Keacakan rumit dalam> <>: hanya ada satu instruksi acak x,, yang menetapkan arah ikan ke atas, bawah, kiri atau kanan. Ini adalah program yang rumit, jadi inilah diagram kode warna untuk membantu Anda:

Kode kode warna!

Saya mencoba untuk membagi probabilitas menjadi potongan-potongan sehingga probabilitas di dalam dan di antara potongan cukup sederhana (lebih suka, katakanlah, 1/3 ke 25/72). Saya melakukan ini sebagai berikut:

Pohon probabilitas

Ikan mulai pada bit abu-abu dari kode ( X ). Ini cukup standar> <> kode untuk dibaca di semua input. Semakin menarik, jadi mari kita lanjutkan.

Selanjutnya, ikan datang ke bagian hijau terang dan gelap ( Y ). Anda dapat memperhatikan dari pohon probabilitas bahwa tiga cabang utama masing-masing berjumlah 1/3, dan bahwa masing-masing cabang terbagi menjadi 2/3 cabang pembantu dan 1/3 pembantu cabang. Bagian kode yang berwarna hijau menutupi kedua level pohon ini. Pertama, kita memilih angka acak dari 0, 1, 2 dengan peluang masing-masing, di lobus atas bit hijau muda. Kita dapat mensimulasikan peluang 1/3 menggunakan instruksi empat arah xdengan memotong salah satu pintu keluar sehingga hanya mengarahkan ikan kembali ke x- maka hanya ada tiga rute melarikan diri dari x, dan dengan simetri mereka memiliki probabilitas yang sama.

Berikutnya x, sedikit di bawah yang satu ini, mengirimkan ikan ke ^sebelahnya dengan kesempatan 2/3 - perhatikan bahwa ikan membungkus jika berenang pergi dari x- dan turun ke \dengan 1/3 kesempatan. Ikan kemudian berenang di sepanjang salah satu dari dua ekor bagian hijau muda. Ekor ini secara fungsional sama: masing-masing memeriksa apakah kita mendorong 0, 1 atau 2 sebelumnya, dan bercabang sesuai. Dan ini melengkapi dua tingkat pertama pohon itu.

Enam bagian berikutnya ( A - F ), pada dasarnya, gunakan lebih banyak xs untuk melabeli ikan lebih jauh, dan kemudian gunakan beberapa os untuk mencetak sejumlah huruf dari input. Bagian-bagian ini berkisar dari langsung (misalnya biru tua,  C , yang hanya mencetak tiga huruf) hingga, yah, tidak begitu mudah (misalnya oranye, D , yang membutuhkan dua xs untuk mensimulasikan pembagian 3 / 8–5 / 8, mencetak huruf dalam beberapa tahap). Rincian ini dibiarkan sebagai latihan. (Saya sangat senang dengan warna kuning, E , yang mengirimkan ikan dalam satu lingkaran-perulangan!)

Setelah masing-masing cabang ini, ikan akhirnya mencapai bagian merah muda ( Z ). Ini menarik semua cabang kembali bersama, mencetak spasi, lalu akhirnya membuat ikan melompat ke posisi (2,2) di kisi dan mulai lagi pada yang pertama x.


Jika penjelasan "rumit" di atas tidak meyakinkan Anda bahwa ini memberikan probabilitas yang benar, saya juga menguji ini pada panjang 65.000 input string (64 KiB, hanya 13 detik di TIO!), Dan hasil distribusi panjang kata yang dihasilkan dulu

{{1,0.027377},{2,0.191237},{3,0.226599},{4,0.164128},{5,0.113064},{6,0.0818627},{7,0.0703885},{8,0.0543515},{9,0.0426089},{10,0.0283835}}

Probabilitas ini paling banyak 0,0044 dari probabilitas yang diharapkan.

Bukan pohon
sumber