Dòng thư từ


8

Cho một chuỗi chỉ chứa các chữ cái (không phân biệt chữ hoa chữ thường), chia nó thành các từ có độ dài ngẫu nhiên đồng đều, sử dụng phân phối bên dưới, ngoại trừ từ cuối cùng, có thể có độ dài hợp lệ (1-10). Đầu ra của bạn là những từ này, dưới dạng một chuỗi được phân tách bằng dấu cách ( "test te tests"), một chuỗi các chuỗi ( ["test","te","tests"]) hoặc bất kỳ định dạng đầu ra tương tự nào khác.

Phân phối độ dài từ

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%

Tỷ lệ cược của bạn không cần phải khớp chính xác - chúng có thể bị tắt bởi 1/144th, hoặc .69%, theo một trong hai hướng (nhưng rõ ràng chúng vẫn phải tổng hợp đến 72/72hoặc 100%).

Dữ liệu được đoán đại khái từ trang thứ tư, hình đầu tiên của bài báo này .

Các trường hợp thử nghiệm với đầu ra mẫu

Hành vi đối với các trường hợp kiểm tra rất ngắn (chiều dài <11) là không xác định.

Lưu ý rằng tôi đã tạo chúng bằng tay, vì vậy chúng có thể hoặc không tuân theo phân phối thống nhất ở trên.

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.



Từ cuối cùng có thể là một chuỗi rỗng?
rahnema1

@ rahnema1 bạn có nghĩa là trong một đầu ra mảng?
Stephen

Có, phần tử cuối cùng của đầu ra mảng.
rahnema1

@ rahnema1 chắc chắn, vì nếu bạn tham gia vào mảng trên không gian, bạn sẽ chỉ có một khoảng trắng ở cuối, mà tôi sẽ cho phép.
Stephen

Câu trả lời:


5

Thạch , 28 byte

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

Một liên kết đơn âm lấy một danh sách và trả về một danh sách các danh sách.

Hãy thử trực tuyến! (chân trang phân tách danh sách kết quả của danh sách với khoảng trắng)

Làm sao?

Sử dụng tất cả các tỷ lệ phần trăm trong phân phối được làm tròn đến số nguyên gần nhất của chúng (do đó nằm trong ngưỡng cho phép 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)

Về mặt lý thuyết, tập lệnh của bạn có thể xuất ra danh sách có phần tử đầu tiên là chuỗi rỗng. Không chắc chắn nếu nó được cho phép bởi câu hỏi.

@ThePirateBay yeah Tôi thực sự chỉ nhận thấy điều này - Tôi cần thêm 1 vào yếu tố đầu tiên về độ dài tích lũy của mình; sẽ cập nhật ngay để sửa.
Jonathan Allan

Đã sửa lỗi và thêm lời giải thích (không thể yêu cầu cho phép khoảng trắng hàng đầu vì độ dài từ 1 thực sự sẽ sử dụng phân phối sai).
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++]););

Chạy như ống với -nRhoặc thử trực tuyến .

phá vỡ

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

Lưu ý: ywgSKAF:=?thể hiện tỷ lệ tăng -1:[1,15,31,43,51,57,62,66,69,71]


Tôi tự hỏi: liệu xác suất có thay đổi nếu tôi gọi rand()cho mọi so sánh không? Nếu không, tôi có thể tiết kiệm 5 byte.
Tít

1
Họ chắc chắn sẽ thay đổi, ví dụ xác suất chiều dài 2 sẽ là 70/72 * 16/72, cao hơn 14/72.
Ørjan Johansen

@ RjanJohansen Một cái gì đó nói với tôi rằng điều đó sẽ xảy ra. Đáng tiếc: Bằng cách đó, tôi đã lãng phí ít nhất 5 byte.
Tít

Đây không phải là lần đầu tiên tôi thấy một giải pháp PHP được cho là hoàn chỉnh mà không bắt đầu bằng <? hoặc <? php. Chạy như một chương trình độc lập, PHP cần điều đó. Hay tôi đang thiếu một cái gì đó?
manassehkatz-Di chuyển 2 Codidact

@manassehkatz Bạn đang mất tích Run as pipe with -nR. Tức là mã này được coi là một tham số cho php, không phải là một tệp. Sử dụng echo <input> | php -nR '<code>'trên dòng lệnh để thực thi.
Tít

3

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

Hãy thử trực tuyến!

* Lấy chuỗi làm đầu vào và đầu ra một chuỗi các chuỗi.

* Phần tử cuối cùng của đầu ra có thể là một chuỗi rỗng.


3

Python 2, 154 150 147 145 byte

Được rồi, đây là nỗ lực đầu tiên của tôi về mã golf. Thẳng lên với mã:

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

Lần thụt thứ hai là bởi một tab char như bạn có thể thấy trong phiên bản TIO của tôi: Dùng thử trực tuyến .

Những gì tôi làm là thêm một khoảng trắng trong chuỗi theo phân phối đã cho. Tôi rất ủng hộ phân phối của mình bằng cách sử dụng:

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)

Mà đã cho tôi:

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%

Mà tôi nghĩ là đủ chính xác. Sau đó tôi lặp lại quá trình thêm khoảng trắng cho đến khi độ dài chuỗi của tôi thành công. Tôi cũng tăng chỉ số vị trí của mình lên một sau khi thêm khoảng trắng. Tôi hy vọng ai đó có thể giúp tôi chơi hết dòng này nhưng tôi không thấy làm thế nào để lấy nó ra mà không làm sai lệch không gian đầu tiên.

Khi tôi thấy văn bản của mình, tôi nhận ra rằng tôi phải tìm hiểu rất nhiều về Trang web này. Ai đó có thể liên kết với tôi một hướng dẫn cách sử dụng chức năng trả lời Stackoverflow trong các bình luận để tôi có thể tìm hiểu cho các bài đăng tiếp theo của mình.


Biên tập:

Xuất hiện trong khi đọc lại bài đăng của tôi, tôi đã tìm ra cách để loại bỏ i + = 1. Vì vậy, tôi đã lưu 4 byte bằng cách làm điều đó. Mã mới trông như thế này:

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

Hãy thử trực tuyến!


Biên tập:

Tôi đã tìm ra rằng tôi có thể loại bỏ một số ngắt dòng.

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


Chỉnh sửa: Tôi điều chỉnh quá trình nhập của mình và đặt định nghĩa của i bên trong hàm.

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

Hãy thử trực tuyến!


Chào mừng bạn đến với Câu đố lập trình & Code Golf! Bài đăng đầu tiên rất hay! Tôi đã chỉnh sửa câu trả lời của bạn một chút để cải thiện định dạng (tiêu đề, tô sáng cú pháp), bạn có thể xem những gì đã thay đổi để xem các lệnh cho bài đăng trong tương lai của bạn. (Tôi không có bất kỳ liên kết nào để cung cấp cho bạn một cách buồn bã, nhưng hy vọng người khác sẽ)
Dada

Cảm ơn đã chào đón và định dạng văn bản của tôi. Điều này đã giúp tôi ra ngoài và tôi đã sử dụng nó trong Chỉnh sửa của mình.
Simon

2

APL Dyalog, 90 byte

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

Hãy thử trực tuyến! Nhấn Run một vài lần để xem nó thay đổi như thế nào.

Làm sao?

72?⍨≢⍵ - cuộn 72 mặt xúc xắc của thời gian đầu vào

[...] - chỉ số bên trong

(2 14 16 12 8,⌽1+⍳5)\⍳10- mở rộng phạm vi 10 bằng 2 14 16 12 8 6 5 4 3 2(để tạo ngẫu nhiên có trọng số)

+\ - tổng cộng

⍉2(1-⍨≢⍵)⍴- hình dạng như một bảng nén x y zz x, x y, y z

o←1↓ - bỏ phần tử đầu tiên

(↓(o[1;2]),0),↓o - encase với tọa độ đầu tiên của nó được ghép nối với 0

¨ - cho mỗi cặp (x, y)

(2⊃⍵)↓k↑⍨⊃⍵ - lấy đầu vào từ chỉ số x đến y

' '~⍨ - và xóa khoảng trắng



2

Toán học, 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])&


lấy một chuỗi làm đầu
ra mảng đầu vào của chuỗi


2

Than , 43 39 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Xuất ra một khoảng trắng ở cuối nếu từ cuối cùng có kích thước chính xác được chọn ngẫu nhiên.


Vâng, nó có vẻ quá dài: / Có ý tưởng nào cho các tính năng mới sẽ rút ngắn nó không?
ASCII chỉ

Chỉ có ASCII Tôi không thể nghĩ ra một cách tốt để tạo bảng xác suất, vốn đã chiếm hơn 50% mã. Sẽ thật tuyệt nếu tôi không phải làm việc xung quanh Assign(Slice(q, i), q);mà không làm việc.
Neil

Điều đó sẽ hiệu quả, chỉ là mơ hồ, không hoàn toàn chắc chắn về cách tốt nhất để khắc phục điều đó, xin lỗi
ASCII chỉ

Woah rất nhiều làm tổ
ASCII - chỉ

@ ASCII-only Ai quan tâm nếu nó tiết kiệm 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"$& "}

Hãy thử trực tuyến!

106 byte mã +1 cho -p


Chào mừng bạn đến với trang web! Rất vui khi thấy một tay golf Perl mới, câu trả lời tuyệt vời! (bạn vẫn có thể lưu một vài byte ). Ngoài ra, tôi khuyên bạn nên thêm một số giải thích, để những người không phải là người Perl có ý tưởng về cách bạn đã làm điều đó (và ngay cả đối với người viết mã Perl, nó sẽ tiết kiệm được một chút thời gian), nhưng điều đó không bắt buộc và chỉ tùy thuộc vào bạn.
Dada


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

Hãy thử trực tuyến , hoặc xem nó tại sân chơi cá !

Tính ngẫu nhiên là khó khăn trong> <>: chỉ có một hướng dẫn ngẫu nhiên x, trong đó đặt hướng của cá là lên, xuống, trái hoặc phải. Đây là một chương trình phức tạp, vì vậy đây là sơ đồ mã màu để giúp bạn:

Mã màu!

Tôi đã cố gắng phân tách các xác suất thành các phần để các xác suất trong và giữa các phần khá đơn giản (thích, giả sử, từ 1/3 đến 25/72). Tôi đã làm điều này như sau:

Cây xác suất

Cá bắt đầu từ bit màu xám của mã ( X ). Đây là khá chuẩn> <> mã để đọc trong tất cả các đầu vào. Nó trở nên thú vị hơn, vì vậy hãy tiếp tục.

Tiếp theo, cá đến phần ánh sáng và màu xanh đậm ( Y ). Bạn có thể nhận thấy từ cây xác suất rằng ba nhánh chính mỗi tổng bằng 1/3 và mỗi nhánh này chia thành một nhánh phụ 2/3 và nhánh phụ 1/3. Các phần màu xanh của mã bao gồm hai cấp độ của cây. Đầu tiên, chúng tôi chọn một số ngẫu nhiên trong số 0, 1, 2 với cơ hội bằng nhau, ở thùy trên cùng của bit màu lục nhạt. Chúng ta có thể mô phỏng cơ hội 1/3 bằng cách sử dụng hướng dẫn bốn chiều xbằng cách cắt bỏ một trong các lối thoát để nó chỉ chuyển hướng cá trở lại x- sau đó chỉ có ba lối thoát từx và đối xứng chúng có xác suất bằng nhau.

Tiếp theo x, một chút bên dưới con này, gửi con cá đến ^bên cạnh nó với 2/3 cơ hội - lưu ý rằng con cá quấn quanh nếu nó bơi từ trái x- và xuống \với cơ hội 1/3. Con cá sau đó bơi dọc theo một trong hai đuôi của phần màu xanh nhạt. Các đuôi này có chức năng giống nhau: mỗi lần kiểm tra nếu chúng ta đẩy 0, 1 hoặc 2 trước đó và phân nhánh ra tương ứng. Và điều này hoàn thành hai cấp độ đầu tiên của cây.

Sáu phần tiếp theo ( A - F ), về bản chất, sử dụng nhiều xs hơn để phân nhánh cá hơn nữa, sau đó sử dụng một số số os để in một số chữ cái từ đầu vào. Các phần này bao gồm từ đơn giản (ví dụ: màu xanh đậm,  C , chỉ in ba chữ cái), không quá đơn giản (ví dụ: màu cam, D , cần hai xs để mô phỏng cách chia 3/8 / 5/5, in các chữ cái trong nhiều giai đoạn). Các chi tiết của những điều này được để lại như một bài tập. (Tôi đặc biệt hài lòng với màu vàng, E , gửi cá theo vòng lặp!)

Sau mỗi nhánh này, cá cuối cùng đạt đến phần màu hồng ( Z ). Điều này vẽ tất cả các nhánh lại với nhau, in một khoảng trắng, sau đó cuối cùng làm cho cá nhảy đến vị trí (2,2) trong lưới và bắt đầu lại từ đầu x.


Trong trường hợp cách giải thích "phức tạp" ở trên không thuyết phục bạn rằng điều này mang lại xác suất chính xác, tôi cũng đã thử nghiệm điều này trên chuỗi đầu vào 65.000 (64 KiB, chỉ 13 giây trong TIO!) Và kết quả phân phối độ dài từ là

{{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}}

Những xác suất này nằm cách xa xác suất dự kiến ​​nhất là 0,0044.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.