Yardım! Daha fazla ödevim var!


18

Öğretmenim Marslı Ödevlerimden çok mutsuzdu . Tüm kurallara uydum, ama çıkardığım şeyin anlamsız olduğunu söylüyor ... ona ilk baktığında çok şüpheliydi. “Bütün diller Zipf yasasını izlemeli falan filan” ... Zipf yasasının ne olduğunu bile bilmiyordum!

Bu çıkıyor Zipf yasası devletler Eğer y ekseni üzerinde her kelimenin sıklığı logaritmasını ve x ekseni üzerinde her kelimenin "Yer" logaritmasını (en yaygın = 1 çizmek takdirde, ikinci en yaygın = 2, üçüncü en yaygın = 3, vb.), grafik yaklaşık -1 eğimli bir çizgi gösterir, yaklaşık% 10 verir veya alır.

Örneğin, Moby Dick için bir çizim:

resim açıklamasını buraya girin

X ekseni en yaygın n. Kelimedir, y ekseni en yaygın n . Kelimenin oluşum sayısıdır . Çizginin eğimi yaklaşık -1.07'dir.

Şimdi Venutian'ı ele alıyoruz. Neyse ki, Venedikliler latin alfabesini kullanıyor. Kurallar aşağıdaki gibidir:

  • Her kelime en az bir sesli harf içermelidir (a, e, i, o, u)
  • Her kelimede arka arkaya en fazla üç sesli harf olabilir, ancak arka arkaya en fazla iki ünsüz (bir ünsüz sesli harf olmayan herhangi bir harftir) olabilir.
  • 15 harften daha uzun kelime yok
  • İsteğe bağlı: kelimeleri 3-30 kelime uzunluğunda, noktalara göre ayrılmış cümleler halinde gruplandırın

Öğretmen Marslı ödevimi aldattığımı hissettiğinden, en az 30.000 kelime uzunluğunda bir makale yazmakla görevlendirildim (Venutian'da). Zipf yasasını kullanarak işimi kontrol edecek, bu yüzden bir çizgi takıldığında (yukarıda açıklandığı gibi) eğim en fazla -0.9 olmalı ancak -1.1'den az olmamalı ve en az 200 kelimelik bir kelime haznesi istiyor. Aynı kelime arka arkaya 5 kereden fazla tekrarlanmamalıdır.

Bu CodeGolf, baytlardaki en kısa kod kazanıyor. Lütfen çıktıyı Pastebin'e veya metin dosyası olarak indirebileceğim başka bir araca yapıştırın.


Evet ve eğer istersen 32767 kelimelik bir cümle yapabilirsin. Kısıtlama, cümledeki kelimelerin frekanslarının zipf yasasına uygun olması gerektiğidir
J. Antonio Perez

1
"Venüs'ten" geleneksel sıfat Veneral'dir, ancak bazı nedenlerden dolayı popülerliği azalmaktadır. Venüsçü bilimkurguda yaygın olarak kullanılır.
Peter Taylor

Zipf dağılımını izleyen ve karıştırılan bir kelime listesi oluşturmanın, zipf dağılımını izleyen ardışık sözcük çiftleriyle bir dizi üretme olasılığının yüksek olacağını tahmin ediyorum. Dahası, listede yeterince farklı kelimeler olduğunda, aynı kelimenin arka arkaya 5 kereden fazla tekrarlanması olasılığı gerçekten küçük olacaktır. Bu yaklaşımı denediğim ve geçerli bir makale üretebildiğim takdirde kabul edilir mi?
Leo

Her ne kadar eğim makul olsa da, eğim -0.35
J. Antonio Perez

Yine de düz bir çizgi gibi görünecektir; sadece eğim çok iyi olurdu
J. Antonio Perez

Yanıtlar:


3

Mathematica, 102 bayt

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

Ad girmeyen ve giriş içermeyen 40.320 üç harfli Venüs kelimesinden oluşan bir dize döndüren isimsiz işlev.

Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]sadece "vaeiou" harflerini kullanarak, her biri kendi sondaki boşluğuna sahip 216 harfli olası kelimeyi üretir. Bu kelimelerin ilki "vvv", geçerli Venüslü değil, Restonu atar.

Sonra RandomChoice[1/Range@215->...,8!]8 yapar! = Sonuçtaki 215 kelimelik listeden 40.320 rasgele seçim, frekans ağırlıkları ilk 215 tamsayının karşılıklıları tarafından belirlenir ( 1/Range@215). Son olarak, <>""...sonuç listesindeki dizeleri birleştirir.

Çıktı deterministik olmaktan uzaktır; bir deneme bu Venüs denemesini verdi .

Mathematica, 129 bayt

#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!}]]<>""

Bu deterministik. 215 kelimelik taban kümesi aynıdır, ancak şimdi her kelime zipf yasasını tutmaya zorlamak için tam bir kez tekrarlanır (#j kelimesi kabaca 7! / J kez tekrarlanır). Daha sonra tekrarlardan kaçınmak için kelimeler eşit olarak serpiştirilir. (Her kelimenin bir cetvel üzerine yerleştirildiğini ve bu kelimenin tüm kopyalarının eşit aralıklarla yerleştirildiğini düşünün; tüm kelimeler sırayla okunduğunda, belirli bir kelime çok fazla tekrarlanmayacaktır, belki de hiç değil.) Sonuç 30,117 kelimedir. Venüs denemesi .


8 yapmaz! sözde rastgele seçim aynı kelimenin 6 ardışık tekrarlanması ile kurtarabileceğiniz anlamına mı geliyor?
Dennis

Evet, teoride.
Greg Martin

@GregMartin Aslında ... bağlandığınız makale uygun değil; vvaart arda altı kez görünür. Herhalde daha büyük bir sorun olduğunu düşünüyorum ... her seferinde cevaplara meydan okumamalı mı? (Değilse, çalışma olasılıklarının ne kadar olacağı çizgisini nasıl
H Walters

Bu adil bir eleştiri ve nasıl oynandığını görmekle ilgileniyorum.
Greg Martin

2

05AB1E ,34 33 32 bayt

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

Çevrimiçi deneyin!

Bence hala oldukça golf edilebilir! Örneğin sayısal sabitler ve vNy<FD}golf oynatılabilir.

Çıktı örneği

O nasıl çalışır?

"Ünlü + sesli harf + ünsüz" kuralını izleyen tüm kelime kombinasyonlarını oluşturur, bu da 525 benzersiz geçerli kelime (200'den fazla) yapar. Daha sonra bunların her bir frekans ilişkilendirir tatmin yasası olduğunu f(x) = 4725/xneredex1'den başlayıp 525 ile biten geçerli kelimenin sırasıdır. Sonra frekanslar normalleştirilir ve çarpılır, böylece en az 30000 kelime olur. Bu kod, ilgili sabitleri golf edilebilir hale getirmek için her zaman 32074 kelime verir (lütfen kod açıklamasına bakın). Böylece her kelime, aynı kelimenin sıklığına karşılık gelen kez tekrarlanır. Sonunda kelimeler karıştırılır. Ancak, bir kelimenin asla arka arkaya beş kez tekrarlanmasını garanti etmez. Böylece programlar, bir kelimenin arka arkaya beş kez tekrarlanması olasılığını azaltmak için gerekli 200'den fazla benzersiz kelime üretir. Bu kodun her zaman aynı kelime dizisini oluşturduğunu lütfen unutmayın. İki çalışma arasında farklılık gösteren tek şey karıştırma işleminin sonucudur.

Sıklık nasıl değerlendirilir?

"Çıktı" adlı dosyada (algoritma açısından, mantıklı!) Adlı metni alır ve "stats.csv" çıktıları basit bir Python3 kodu yaptım.

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

Hangi her zaman benim kod için aşağıdaki dağıtım verir: Frekans yasası

Yani eğim -1.0138'dir. Bu değer şimdi önceki kodun eğiminden -1'e daha az yakındır, ancak yine de eğim kısıtlamalarını karşılar.


Senaryo sıklığını değerlendirmek için teşekkür ederiz, sonunda bir ekstra `olduğunu unutmayın. Ayrıca, neden noktalı virgül ayırıcı olarak kullanıyorsunuz? csv genellikle virgülle ayrılmış değerler anlamına gelir;)
Leo

1
Evet haklısın haha! Bir saniyeliğine markdown'la kafam karıştı. Önce satır içi kodu kullandım, sonra bir kod bloğu kullanmak için daha uygun olduğunu fark ettim ama ekstra `ı kaldırmayı unuttum. Ben csv ayırıcılar olarak noktalı virgül kullanıyorum çünkü Fransızım ve bazı yazılımlar veya şirketler, el yazısı ondalık değerlerle yaptığımız gibi nokta yerine virgüllerle ondalık değerler koymak için kullanılıyor. Tamsayı kısmı kesirli kısımdan ayırmak için her zaman noktayı kullanmama rağmen, daha fazla düşünmeden noktalı virgül kullanıyorum. Ama hey, ssv de harika;)
Osable

0

Bash / çekirdek utils'i 122 110 bayt

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)

unrolled:

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)

for wDöngü 243 farklı kelime üretir. let ++x;artışlar başlangıçta x ayarlanmamıştır (ilk yürütme sırasındaki aritmetik ifade kuralları başına x0 olarak kabul edilir ve böylece artışı bunu 1 olarak ayarlar). Bir sonraki satır böylece yaklaşık zipf frekansına ulaşmak için 5575 / x frekansında sonraki kelimeleri üretir.

Bir sonraki adım, bunu tekrarlama gereksinimine uyacak şekilde deterministik olarak izin vermektir; --random-sourceçok büyük bir bayrak adı olmasına rağmen , shuf ile kullanmak, bir çok modlu seçiciyi yuvarlayan elin char sayısını yener. yes aeaslında uyduğum en kısa sabit "rastgele" cihaz.

Bu, 33729 kelimelik denemeyi oluşturur .

Bash / Core Utils, 96 84 bayt (rakip değil)

Deterministik olmayan bir yaklaşım için, shuf bayraklarını kesin:

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

analiz

Zipf eğimi düz olacak şekilde ayarlanmıştır. Logaritmik ölçekleri çizmek için Excel'i kullanma:

Öğretmen = -1.000764 bir zipf eğimi fark etmelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.