Я примножую джерело, ви (певно) примножуєте вихід!


18

Завдання

Завдання полягає в тому, щоб написати програму, яка виводить послідовне, але інакше довільне додатне ціле число (настільки суворо більше, ніж 0). Ось улов: коли джерело повторюється разів (код додається / об'єднує до себе), програма повинна мати ймовірність виведення та решту ймовірностей виведення без змін.xNN11NNxN1Nх

Приклад

Припустимо, що вашим початковим джерелом є XYZі виробляє ціле число 3. Потім:

  • Для : слід вивести з ймовірністю (50% часу) та з ймовірністю також % часу).N=2XYZXYZ31223=612

  • Для : слід вивести з вірогідністю (66.666% часу) і з ймовірністю (33.333% від час)N=3XYZXYZXYZ32333=913

  • Для : слід вивести з вірогідністю (75% часу) і з ймовірністю (25% від час)N=4XYZXYZXYZXYZ33443=1214

і так далі....

Правила

Примітка. Цей виклик є (набагато складнішою) версією цієї .


Чи може програма прочитати свій вихідний код?
мій займенник monicareinstate

3
@someone Так, це дозволено.
Містер Xcoder

Відповіді:


16

R , 66 35 байт

-29 байт завдяки digEmAll .

-2 байти завдяки Джузеппе .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

Спробуйте в Інтернеті!

Перевірте розподіл на N = 4.

Ключ - призначення вправо ->. Коли код множиться N разів, перші N1 дзвінків, яким sampleбуде призначеноA , і друкуються лише останній дзвінок.

Оригінальне, більш згорнуте рішення:

R , 66 байт

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

Спробуйте в Інтернеті!

Спробуйте в Інтернеті (повторено 3 рази)!

Використовує два хитрощі: 1) викликати головну цікаву функцію ?, так що ми можемо викликати її, не закінчуючи програму дужкою, і 2) використовувати змінні Tта TT, з кодом, який починається з Tі закінчується ?T.

Fє лічильником ітерації. ?переосмислюється як функція, яка приймає бульний аргумент: якщо вхід ?є TRUE(або T), він виконує необхідну випадкову вибірку; якщо вхід FALSE(або 0), він нічого не робить. Значення значення TTвизначається як 0, тобто ?Tробить вибірку, але ?TTнічого не робить.

Коли джерело повторюється, це виглядає приблизно так:

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

тому середній виклик ?TTне видає нічого, крім кінцевого виклику ?Tвидає випадковий результат.


5
Я не думаю, що я ніколи не бачив ->використання кодового гольфу в ситуації, коли <-не міг бути; це так круто !!
Джузеппе

PS Я в якийсь момент дам це щедро.
Джузеппе

2
Абсолютно дивовижно!
digEmAll


@digEmAll Набагато акуратніше, дякую!
Робін Райдер

11

Пітон 3 , 81 79 байт

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

Спробуйте в Інтернеті!

-1 байт завдяки @Nishioka

Це одне рішення Python 3, яке не має доступу до джерела програми безпосередньо. Зробити це в Python 3 складніше, ніж у Python 2, тому що звичайні оператори друку закінчуються дужкою, що закривається, тому не існує багато варіантів змінити його поведінку в наступному блоці початкового джерела. Було б цікаво побачити більш креативні рішення в Python 3.


-1 байт:+0 if[]else 1
Нісіока

@Nishioka Дякую Оновлено.
Джоель

11

Баш , 31 байт

trap echo\ $[RANDOM%++n?1:n] 0;

Спробуйте в Інтернеті!

trap ... 0запустить код, що міститься при виході. Повторні traps замінять старі. Без котирування $[arithmetic expansion]запускається кожен раз, коли встановлюється нова пастка.


Zsh може зберегти один байт за допомогою <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;



4

Python 3 , 78 76 75 байт

Використовуючи той самий трюк, що і у посиланні, яке було розміщено, ось Python (з x = 1).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

Спробуйте в Інтернеті!

-2 байти завдяки містеру Xcoder за його (n-1)формулу, ~-nяка має вищий пріоритет, ніж *
-1 байт завдяки Нішіока


1
Мені добре виглядає! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#має працювати на 2 байти
Містер Xcoder

1
Я ніколи не бачив такого способу ведення n-1! Мені це подобається, дякую :)
Парі Дуді


Інший -1 байт , але з дещо інший підхід: tio.run / ## K6gsycjPM / 7 / ...
Нісіока

так, я роблю через random()<1/n;-)
Парі Дуді





2

Рунічні чари , 31 байт

UwR'10<;$\
I+:'RA0)?/1$;
1
l;
y

Спробуйте в Інтернеті!

Використовує таку ж структуру, що і ця відповідь, щоб підрахувати, скільки разів було скопійовано джерело:

Виконання потоку

Просто замість виведення n-го числа у списку, ми використовуємо це значення для випадкового генерування числа, якщо результат не 0, надрукуйте 1, а інше надрукуйте це число.


2

Japt , 9 8 байт

(°Tö)ΪT

Перевірте | Подвоєний | Потрійний
Перевірте розподіл 10000 пробігів після 10 повторень

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

Оригінал, 13 11 10 9 байт

Зверніть увагу на пробіл.

NoÎp°T ö 

Перевірте | Подвоєний | Потрійний
Перевірте розподіл 10000 пробігів після 10 повторень

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N

2

JavaScript ( оболонка JavaScript 71 ), 78 байт

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Немає посилання на тіо, павук-мавпа на тіо занадто стара ...

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)()? Чому це асинхронізація?
Томаш Зато -

@ TomášZato Це буквально asyncхронічно. Таким чином, зворотний виклик x=>f(...)буде викликаний після fвизначення функції .
TSH


1

Вугілля деревне , 12 байт

⎚I⎇‽L⊞Oυω¹Lυ

Спробуйте в Інтернеті! На основі моєї відповіді на пов'язане питання. Виходи nз вірогідністю ¹/ₙ, в іншому випадку 1. Пояснення:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.