задача
Задача состоит в том, чтобы написать программу, которая выводит непротиворечивое, но в любом случае произвольное положительное целое число (поэтому строго больше 0). Вот подвох: когда источник повторяется раз (код добавляется / соединяется к себе), программа должна иметь вероятность выдачии оставшаяся вероятность выдачибез изменений.
пример
Давайте предположим, что ваш исходный источник является XYZ
целым числом 3
. Потом:
Для :
XYZXYZ
должен вывести с вероятностью (50% времени) ис вероятностью также (50% времени).Для :
XYZXYZXYZ
следует вывести с вероятностью (66,666% времени) ис вероятностью (33,333% времени)Для :
XYZXYZXYZXYZ
следует вывести с вероятностью (75% времени) и с вероятностью (25% времени)
и так далее....
правила
Вы должны построить полную программу . Вывод должен быть распечатан на STDOUT.
Ваша программа, теоретически, должна выводить каждое возможное значение с вероятностями, указанными выше, но небольшое отклонение от этого из-за реализации random является хорошим ( при условии, что реализация не имеет другого распределения - вы не можете использовать нормальное распределение для сохранения байтов ) .
Программа должна (опять же , в теории) работа при сколь угодно большом значении , но технические ограничения , связанные с точностью хороши для больших .
Вывод должен быть в базе 10 (вывод в любую другую базу или с научными обозначениями запрещен). Допускаются конечные / ведущие пробелы и начальные нули.
Исходный источник должен (конечно) иметь длину не менее 1 байта. Вы не можете использовать новую строку между копиями вашего источника. Программа не должна принимать данные (или иметь неиспользуемые пустые данные).
Это код-гольф , поэтому оценка ответа равна длине (оригинального) источника в байтах, при этом меньший показатель лучше.
Примечание: этот вызов является (намного) более сложной версией этого .
источник
Ответы:
R ,
6635 байт-29 байт благодаря digEmAll .
-2 байта благодаря Джузеппе .
Попробуйте онлайн!
Проверьте распределение для N = 4.
Ключ - правильное назначениеN раз, первый N- 1 вызовы
->
. Когда код умножаетсяsample
будут назначеныA
, и будет напечатан только последний вызов.Оригинальное, более замысловатое решение:
R , 66 байт
Попробуйте онлайн!
Попробуйте онлайн (повторяется 3 раза)!
Используются два трюка: 1) вызвать интересующую основную функцию
?
, чтобы мы могли вызывать ее, не заканчивая программу скобкой, и 2) использовать переменныеT
иTT
, с кодом, который начинаетсяT
и заканчивается на?T
.F
счетчик итераций?
переопределяется как функция, которая принимает логический аргумент: если входное значение?
равноTRUE
(илиT
), оно выполняет требуемую случайную выборку; если вводFALSE
(или0
), он ничего не делает. ЗначениеTT
определяется как0
, так что?T
делает выборку, но?TT
ничего не делает.Когда источник повторяется, это выглядит так:
поэтому средний вызов не
?TT
выводит ничего, кроме последнего вызова,?T
выводит случайный результат.источник
->
используется в коде гольф в ситуации, когда<-
не может быть; это так круто!!Python 3 ,
8179 байтПопробуйте онлайн!
-1 байт благодаря @Nishioka
Это одно из решений Python 3, которое не имеет прямого доступа к исходному тексту программы. Делать это в Python 3 сложнее, чем в Python 2, потому что нормальные операторы печати заканчиваются закрывающей круглой скобкой, поэтому не так много вариантов изменить его поведение в следующем блоке исходного источника. Было бы интересно увидеть больше креативных решений в Python 3.
источник
+0 if[]else 1
Баш , 31 байт
Попробуйте онлайн!
trap ... 0
запустит код, содержащийся при выходе. Повторныеtrap
s перезапишут старые. Без кавычек$[arithmetic expansion]
запускается каждый раз, когда устанавливается новая ловушка.Zsh может сохранить один байт с помощью
<<<
:источник
Желе , 7 байт
Попробуйте онлайн!
источник
05AB1E , 7 байтов
Попробуйте онлайн!
источник
Питон 3 ,
787675 байтИспользуя тот же трюк, что и в опубликованной ссылке , вот Python (с x = 1).
Попробуйте онлайн!
-2 байта благодаря Mr. Xcoder за его
(n-1)
формулу, у~-n
которой приоритет выше, чем*
-1 байт благодаря Nishioka
источник
import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#
должен работать на -2 байтаrandom()<1/n
;-)Dyalog APL,
2524232221 байтПопробуйте онлайн!
источник
Gaia ,
17151413 байтПопробуйте онлайн!
Я случайно заметил
Øg
вчерашнее поведение при просмотре документов, что очень помогло.источник
Perl 5,
2826 байт-2 байта благодаря @Grimy
TIO
источник
1 if!++$x;say 1<rand$x||$x
Рубин , 40 байт
Попробуйте онлайн!
Попробуйте онлайн (скопировано 3 раза)!
Рубиновый порт этого ответа Python .
Рубин , 38 байт
2 байта сохраняются при чтении файла:
Попробуйте онлайн!
источник
Рунические чары , 31 байт
Попробуйте онлайн!
Использует ту же структуру, что и этот ответ, чтобы подсчитать, сколько раз источник дублировался:
Просто вместо вывода n-го числа в списке мы используем это значение для случайной генерации числа, если результат не равен 0, выведите 1, иначе выведите это число.
источник
Japt ,
98 байтПроверьте это | Вдвое | Утроить
проверить распределение 10000 прогонов после 10 повторений
Оригинал,
1311109 байтОбратите внимание на завершающий пробел.
Проверьте это | Вдвое | Утроить
проверить распределение 10000 прогонов после 10 повторений
источник
JavaScript ( оболочка JavaScript 71 ), 78 байт
Нет ссылки tio, spidermonkey на tio слишком стар ...
Firefox (Spidermonkey) рассматривает комментарий как часть функции
f
. В результате(''+f).length
будетb+79n
где b <78, и (n + 1) - времена повторения исходного кода.Эта ошибка (? Я не уверен. Я бы предпочел, чтобы это ошибка спецификации JavaScript, а не какого-либо интерпретатора ) была передана в BMO кем-то еще сразу после публикации этого ответа: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Ни я, ни твит не опубликовали ни мою ветку bmo.)
источник
(async x=>x)()
? Почему это асинхронно?async
хроническое. Так что обратный звонокx=>f(...)
будет вызван послеf
определения функции .C # (интерактивный компилятор Visual C #) ,
133114112 байтЭто первый (и, надеюсь, последний) раз, когда я использовал директивы препроцессора C #.
Попробуйте онлайн!
источник
Уголь , 12 байт
Попробуйте онлайн! На основании моего ответа на связанный вопрос. Выводы
n
с вероятностью¹/ₙ
, в противном случае1
. Объяснение:источник