Cứu giúp! Tôi có nhiều bài tập về nhà hơn!


18

Giáo viên của tôi không hài lòng với bài tập về sao Hỏa của tôi . Tôi đã tuân theo tất cả các quy tắc, nhưng cô ấy nói rằng những gì tôi đưa ra là vô nghĩa ... khi lần đầu tiên nhìn vào nó, cô ấy rất nghi ngờ. "Tất cả các ngôn ngữ nên tuân theo luật của Zipf blah blah blah" ... Tôi thậm chí còn không biết luật của Zipf là gì!

Hóa ra luật của Zipf nói rằng nếu bạn vẽ logarit tần số của mỗi từ trên trục y và logarit của "nơi" của mỗi từ trên trục x (phổ biến nhất = 1, phổ biến thứ hai = 2, phần lớn commmon = 3, v.v.), sau đó cốt truyện sẽ hiển thị một dòng có độ dốc khoảng -1, cho hoặc lấy khoảng 10%.

Ví dụ: đây là một âm mưu cho Moby Dick:

nhập mô tả hình ảnh ở đây

Trục x là từ phổ biến thứ n , trục y là số lần xuất hiện của từ phổ biến thứ n . Độ dốc của đường khoảng -1,07.

Bây giờ chúng tôi đang bao gồm Venutian. Rất may, người Venice sử dụng bảng chữ cái Latin. Luật như sau:

  • Mỗi từ phải chứa ít nhất một nguyên âm (a, e, i, o, u)
  • Trong mỗi từ có thể có tối đa ba nguyên âm liên tiếp, nhưng không quá hai phụ âm liên tiếp (một phụ âm là bất kỳ chữ nào không phải là nguyên âm).
  • Không có từ nào dài hơn 15 chữ cái
  • Tùy chọn: nhóm từ thành câu dài 3-30 từ, được phân cách bằng dấu chấm

Bởi vì giáo viên cảm thấy rằng tôi đã gian lận trong bài tập về sao Hỏa của mình, tôi đã được chỉ định viết một bài luận dài ít nhất 30.000 từ (bằng tiếng Venut). Cô ấy sẽ kiểm tra công việc của tôi bằng luật của Zipf, vì vậy khi một dòng được trang bị (như được mô tả ở trên) độ dốc phải có nhiều nhất là -0,9 nhưng không dưới -1,1 và cô ấy muốn có từ vựng ít nhất 200 từ. Cùng một từ không nên lặp lại quá 5 lần liên tiếp.

Đây là CodeGolf, vì vậy mã ngắn nhất trong byte thắng. Vui lòng dán đầu ra vào Pastebin hoặc một công cụ khác nơi tôi có thể tải xuống dưới dạng tệp văn bản.


Có và nếu bạn muốn, bạn chỉ có thể làm một câu 32767 từ. Hạn chế là tần suất của các từ trong câu phải tuân theo luật của zipf
J. Antonio Perez

1
Tính từ truyền thống cho "từ sao Kim" là Veneral, nhưng vì một số lý do, nó bị giảm phổ biến. Venusian thường được sử dụng trong khoa học viễn tưởng.
Peter Taylor

Tôi phỏng đoán rằng việc xây dựng một danh sách các từ theo phân phối zipf và xáo trộn nó sẽ có xác suất cao tạo ra một chuỗi với các cặp từ liên tiếp cũng theo phân phối zipf. Hơn nữa, với đủ các từ khác nhau trong danh sách, xác suất có cùng một từ được lặp lại hơn 5 lần liên tiếp sẽ rất nhỏ. Trong trường hợp tôi đã thử cách tiếp cận này và quản lý để tạo ra một bài luận hợp lệ, nó có được chấp nhận không?
Leo

Phỏng đoán của bạn là hợp lý, mặc dù độ dốc sẽ là -0,35
J. Antonio Perez

Nó vẫn sẽ trông giống như một đường thẳng; đó chỉ là độ dốc quá lớn
J. Antonio Perez

Câu trả lời:


3

Toán học, 102 byte

""<>RandomChoice[1/Range@215->Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}],8!]

Hàm không tên không nhận đầu vào và trả về một chuỗi bao gồm 40.320 từ Venusian ba chữ cái có dấu cách.

Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]tạo ra 216 từ có ba chữ cái có thể chỉ bằng các chữ cái "vaeiou", mỗi từ có dấu cách riêng. Từ đầu tiên trong số này, "vvv", không phải là sao Kim hợp lệ, nhưng Restném nó đi.

Sau đó RandomChoice[1/Range@215->...,8!]làm 8! = 40.320 lựa chọn ngẫu nhiên từ danh sách kết quả gồm 215 từ, với trọng số tần số được xác định bởi các đối ứng của 215 số nguyên đầu tiên ( 1/Range@215). Cuối cùng, <>""...nối các chuỗi trong danh sách kết quả.

Đầu ra là xa xác định; một lần chạy mang lại bài tiểu luận sao Kim này .

Toán học, 129 byte

#2&@@@Sort[Join@@Table[{i,Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]~Part~j},{j,215},{i,0,1,j/7!}]]<>""

Điều này là xác định. Tập hợp cơ sở gồm 215 từ là như nhau, nhưng bây giờ mỗi từ được lặp lại một số lần chính xác (từ #j được lặp lại khoảng 7! / J lần) để buộc luật của zipf phải giữ. Sau đó, các từ được xen kẽ như nhau để tránh lặp lại. (Hãy tưởng tượng mỗi từ được đặt trên một thước kẻ, với tất cả các bản sao của từ đó cách đều nhau; khi tất cả các từ được đọc theo thứ tự, không có từ cụ thể nào sẽ lặp lại nhiều, có lẽ không có gì cả.) Kết quả là 30.117 từ Tiểu luận sao Kim .


Không làm 8! lựa chọn giả ngẫu nhiên có nghĩa là bạn có thể kết thúc với 6 lần lặp lại liên tiếp của cùng một từ?
Dennis

Vâng, trên lý thuyết.
Greg Martin

@GregMartin Trên thực tế ... bài luận bạn liên kết đến là không tuân thủ; vvaxuất hiện sáu lần liên tiếp. Tôi nghĩ có thể có một vấn đề lớn hơn mặc dù ... không nên thử thách câu trả lời mỗi lần? (Và nếu không, làm thế nào để bạn vẽ được khả năng họ sẽ làm việc như thế nào?)
H Walters

Đây là một bài phê bình công bằng, và tôi quan tâm để xem nó diễn ra như thế nào.
Greg Martin

2

05AB1E ,34 33 32 byte

525DL/9*vNy<FD}})žMDâžNâJè3ô.rðý

525DL                            Yield [1, ..., 525]
     /                           Yield [525/1, ..., 525/525]
      9*                         Yield [4725/1, ..., 4725/525]. It's the number of occurences of each word. The sum of this array is greater than 30000
        v                        For each value (y = value, N = iteration counter starting from 0)
         N                       Push iteration counter
          y<FD}                  Push an array of "int(value)" times the iteration counter
               }                 End for
                )                Wrap everything in an array. At this point the array countains the sorted indices of all words that matches the frequency specs
                 žM              Push "aeiou"
                   Dâ            Cartesian product with itself (["aa", "ae", ...])
                     žN          Push the consonants
                       âJ        Cartesian product and join the values to make valid venutian words
                         è       Compute a big string with all words that correspond to the formerly computed indices
                          3ô     Since all words are concatenated, separate them into blocks of 3 letters
                            .r   Shuffle
                              ðý Join with whitespaces and implicitly display

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

Tôi nghĩ rằng nó vẫn còn chơi golf được! Ví dụ, hằng số và vNy<FD}có thể chơi được.

Ví dụ đầu ra

Làm thế nào nó hoạt động?

Nó tạo ra tất cả các kết hợp các từ theo quy tắc "nguyên âm + nguyên âm + phụ âm", tạo ra 525 từ hợp lệ duy nhất (hơn 200). Sau đó nó sẽ liên kết với nhau của họ một tần số đáp ứng luật pháp f(x) = 4725/xnơixlà thứ hạng của từ hiện tại, bắt đầu từ 1 và kết thúc ở 525. Sau đó, tần số được chuẩn hóa và nhân lên để có ít nhất 30000 từ. Mã này luôn mang lại 32074 từ để làm cho các hằng số liên quan có thể chơi được (vui lòng xem phần giải thích mã). Vì vậy, mỗi từ được lặp lại số lần tương ứng với tần số của cùng một từ. Cuối cùng các từ được xáo trộn. Tuy nhiên, điều đó không đảm bảo rằng một từ không bao giờ được lặp lại năm lần liên tiếp. Do đó, các chương trình tạo ra nhiều hơn 200 từ duy nhất cần thiết để giảm xác suất lặp lại một từ năm lần liên tiếp. Xin lưu ý rằng mã này luôn tạo ra chuỗi từ giống nhau. Điều duy nhất khác nhau giữa hai lần chạy là kết quả của hoạt động xáo trộn.

Làm thế nào để đánh giá tần số?

Tôi đã tạo một mã Python3 đơn giản để lấy văn bản trong tệp có tên là "đầu ra" (theo quan điểm của thuật toán, nó có ý nghĩa!) Và xuất ra "stats.csv".

from collections import Counter
from math import log10

with open("output", "r") as f:
    with open("stats.csv", "w") as stats:
        words = f.read().split()
        freqs = Counter(words)
        freqs = sorted([(i,freqs[i]) for i in freqs],key=lambda x:-x[1])

        print(len(words), "words")
        stats.write("logX;logF\n")
        for i, (key, f) in enumerate(freqs):
            stats.write(str(log10(i+1))+";"+str(log10(f))+"\n")

Mà luôn mang lại phân phối sau cho mã của tôi: Luật tần số

Vậy độ dốc là -1,0138. Giá trị này bây giờ ít gần bằng -1 so với độ dốc của mã trước đó, nhưng nó vẫn thỏa mãn các ràng buộc độ dốc.


Cảm ơn bạn về kịch bản để đánh giá tần suất, lưu ý rằng bạn có thêm `ở cuối. Ngoài ra, tại sao bạn sử dụng dấu chấm phẩy làm dấu phân cách? csv thường là viết tắt của các giá trị được phân tách bằng dấu phẩy;)
Leo

1
Vâng, bạn đúng rồi haha! Tôi đã nhầm lẫn với markdown trong một giây. Tôi đã sử dụng mã nội tuyến trước, sau đó nhận ra rằng sử dụng khối mã phù hợp hơn nhưng tôi quên không xóa `thêm. Tôi sử dụng dấu chấm phẩy làm dấu tách csv vì tôi là người Pháp và một số phần mềm hoặc công ty đã quen với việc đặt giá trị thập phân bằng hôn mê thay vì dấu chấm như chúng ta làm với giá trị thập phân viết tay. Mặc dù tôi luôn sử dụng dấu chấm để tách phần nguyên khỏi phần phân số, tôi sử dụng dấu chấm phẩy mà không cần suy nghĩ thêm. Nhưng này, ssv cũng rất tuyệt;)
Osable 4/12/2016

0

Sử dụng Bash / Core, 122 110 byte

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf --random-source=<(yes ae)

Chưa được kiểm soát:

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{
    let ++x
    yes $w|head -$[5575/x]
}|shuf --random-source=<(yes ae)

Các for wvòng lặp tạo ra 243 lời riêng biệt. let ++x;gia số ban đầu không đặt x (theo quy tắc biểu thức số học trong lần thực hiện đầu tiên đó, xđược coi là 0 và do đó gia số của nó đặt thành 1). Do đó, dòng tiếp theo tạo ra các từ thành công ở tần số 5575 / x để xấp xỉ tần số zipf.

Bước tiếp theo là hoán vị điều này một cách xác định để phù hợp với yêu cầu lặp lại; mặc dù --random-sourcelà một tên cờ lớn khủng khiếp, sử dụng nó với shuf đánh bại số đếm của bàn tay cán một bộ chọn mul-mod. yes aethực sự là thiết bị "ngẫu nhiên" cố định ngắn nhất mà tôi thấy tuân thủ.

Điều này tạo ra bài luận từ 33729 [pastebin] này .

Bash / Core Utils, 96 84 byte (không cạnh tranh)

Đối với một cách tiếp cận không xác định, chỉ cần cắt bỏ cờ shuf:

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf

Phân tích

Độ dốc zipf được điều chỉnh là thẳng. Sử dụng Excel để vẽ đồ thị theo thang logarit:

Giáo viên cần chú ý độ dốc zipf = -1.000764.

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.