Мой учитель был более чем недоволен моей домашней работой . Я следовал всем правилам, но она говорит, что то, что я вывел, было бредом ... когда она впервые посмотрела на это, она была очень подозрительна. «Все языки должны следовать закону Ципфа, бла-бла-бла» ... Я даже не знал, что такое закон Ципфа!
Оказывается, закон Ципфа гласит, что если вы построите логарифм частоты каждого слова на оси у и логарифм «места» каждого слова на оси х (наиболее часто = 1, второй наиболее часто = 2, третье наиболее распространенное = 3 и т. д.), тогда на графике будет показана линия с уклоном около -1, с положительным или отрицательным значением около 10%.
Например, вот сюжет для Моби Дика:
Ось x - это n- е наиболее распространенное слово, а ось y - количество вхождений n- го наиболее распространенного слова. Наклон линии около -1.07.
Теперь мы покрываем Venutian. К счастью, венецианцы используют латинский алфавит. Правила следующие:
- Каждое слово должно содержать хотя бы одну гласную (a, e, i, o, u)
- В каждом слове может быть до трех гласных подряд, но не более двух согласных подряд (согласная - это любая буква, которая не является гласной).
- Нет слов длиннее 15 букв
- Необязательно: сгруппируйте слова в предложения длиной 3-30 слов, разделенных точками
Поскольку учитель считает, что я изменял своему домашнему заданию на марсианском языке, мне поручили написать эссе длиной не менее 30 000 слов (на венетском). Она собирается проверить мою работу, используя закон Ципфа, поэтому, когда линия соответствует (как описано выше), наклон должен составлять не более -0,9, но не менее -1,1, и она хочет словарный запас не менее 200 слов. Одно и то же слово не должно повторяться более 5 раз подряд.
Это CodeGolf, поэтому выигрывает самый короткий код в байтах. Пожалуйста, вставьте вывод в Pastebin или другой инструмент, где я могу загрузить его в виде текстового файла.
Ответы:
Mathematica, 102 байта
Безымянная функция не принимает и возвращает строку, состоящую из 40 320 трехбуквенных венерианских слов с завершающими пробелами.
Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]
создает 216 трехбуквенных слов, которые можно использовать, используя только буквы «vaeiou», каждое со своим собственным пробелом. Первое из этих слов, «vvv», не является действительным венерианцем, ноRest
выбрасывает его.Тогда
RandomChoice[1/Range@215->...,8!]
делает 8! = 40 320 случайных выборов из результирующего списка из 215 слов, с частотными весами, определенными на основе обратных значений первых 215 целых чисел (1/Range@215
). Наконец,<>""...
объединяет строки в результирующем списке.Выход далеко не детерминирован; один прогон дал это эссе о Венере .
Mathematica, 129 байт
Этот является детерминированным. Базовый набор из 215 слов одинаков, но теперь каждое слово повторяется точное количество раз (слово #j повторяется примерно 7! / J раз), чтобы заставить закон Ципфа соблюдать. Затем слова чередуются одинаково, чтобы избежать повторений. (Представьте, что каждое слово выложено на линейке, причем все копии этого слова расположены на одинаковом расстоянии; когда все слова прочитаны по порядку, никакое конкретное слово не повторится много, возможно, совсем не будет.) В результате получается 30 117 слов. Венерианский очерк .
источник
vva
появляется шесть раз подряд. Я думаю, что, возможно, есть более серьезная проблема, хотя ... разве вызовы ответов не должны работать каждый раз? (А если нет, то как вы рисуете линию того, насколько вероятно, что они должны работать?)05AB1E ,
343332 байтаПопробуйте онлайн!
Я думаю, что это все еще довольно играбельно! Например, числовые константы и
vNy<FD}
могут быть пригодными для игры в гольф.Пример вывода
Как это работает?
Он генерирует все комбинации слов, следуя правилу «гласный + гласный + согласный», что составляет 525 уникальных допустимых слов (более 200). Затем он ассоциирует с каждым из них частоту, которая удовлетворяет закону,
f(x) = 4725/x
гдеx
это ранг текущего слова, начинающийся с 1 и заканчивающийся на 525. Затем частоты нормализуются и умножаются так, чтобы было не менее 30000 слов. Этот код всегда дает 32074 слова, чтобы сделать соответствующие константы пригодными для игры (см. Объяснение кода). Таким образом, каждое слово повторяется количество раз, соответствующее частоте одного и того же слова. Наконец слова перемешиваются. Однако это не гарантирует, что слово никогда не будет повторяться пять раз подряд. Следовательно, программы генерируют более 200 уникальных слов, чтобы уменьшить вероятность повторения слова пять раз подряд. Обратите внимание, что этот код всегда генерирует одну и ту же последовательность слов. Единственное, что отличается между двумя прогонами, это результат операции тасования.Как оценить частоту?
Я сделал простой код Python3, который берет текст в файле с именем «output» (с точки зрения алгоритма это имеет смысл!) И выводит его в «stats.csv».
Который всегда дает следующий дистрибутив для моего кода:
Таким образом, уклон -1.0138. Это значение теперь менее близко к -1, чем уклон предыдущего кода, но все же удовлетворяет ограничениям наклона.
источник
Bash / Core Utils,
122110 байтраскатали:
for w
Цикл генерирует 243 различных слов.let ++x;
инкрементно изначально устанавливает x (для каждого правила арифметического выражения во время этого первого выполненияx
обрабатывается как 0 и, следовательно, его приращение устанавливает его в 1). Следующая строка, таким образом, генерирует последующие слова на частоте 5575 / x, чтобы приблизить частоту zipf.Следующий шаг состоит в том, чтобы переставить это детерминистически, чтобы соответствовать требованию повторения; Несмотря на то,
--random-source
что это очень большое имя флага, использование его с shuf превосходит количество символов, используемых при переключении мультимодного селектора.yes ae
на самом деле это самое короткое фиксированное «случайное» устройство, которое я нашел соответствующим.Это создает это 33729 слов эссе [pastebin] .
Bash / Core Utils,
9684 байта (не конкурирует)Для недетерминированного подхода просто отрубите флаги shuf:
Анализ
Наклон Zipf настроен так, чтобы он был прямым. Использование Excel для построения графиков в логарифмических масштабах:
Учитель должен заметить наклон zipf = -1.000764.
источник