Вдохновленные великолепным Алексом Learn you a R для отличного добра, мы собираемся скромно воссоздать «единственную настоящую R-программу» Алекса - но с изюминкой.
Дополнение в стиле Алекса работает следующим образом - с вероятностью 90% можно просто вернуть сумму двух указанных чисел и с вероятностью 10% рекурсивного добавления Алекса первого числа и второго числа +1. Это означает, что потенциально добавление может быть отключено на 1 или более.
Вызов
Напишите полную программу или функцию, которая принимает два целых числа, и Алекс добавляет их, как определено. Вы можете предположить, что ваша программа не будет переполняться стеком, если у вашего языка нет хвостовой рекурсии. (Обратите внимание, что вам не нужно реализовывать это рекурсивно, если вероятности одинаковы.)
Эталонная реализация (Groovy)
int alexAdd(int a, int b) {
int i = new Random().nextInt(11);
if(i == 1) {
return alexAdd(a,b+1);
} else {
return a + b;
}
}
Попробуйте эту скрипку онлайн.
Leaderboard
var QUESTION_ID=66522,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
источник
Ответы:
Пиф, 8
Попробуйте онлайн
При этом используется второй режим Pyth при уменьшении, который ищет повторный ввод, а затем завершает работу.
объяснение
Если происходит дополнительное alex-add, оно будет запущено снова, а если нет, то завершится.
источник
Python 2, 55 байт
Это абсолютно странный способ сделать это.
Функция
random
дает значение с плавающей точкой в [0,1), и ее строковое представление по умолчанию имеет 16 цифр после десятичной точки, всего 18 символов. Но, поскольку конечные 0 опущены, он может быть короче. Считывая цифры с конца, у каждого есть шанс 1/10 быть равным 0, и мы останавливаемся, когда нажимаем ненулевую цифру. Таким образом, число конечных нулей распределяется так же, как и количество рекурсий, которые делает Алекс, поэтому мы можем сделать выборку из этого распределения на 18 минус длина строки.На самом деле, Python будет отображать более 18 цифр для небольших чисел, иногда даже научную запись, поэтому мы добавляем 1, чтобы исправить это.
Это никогда не даст больше чем на 15 больше суммы, но это нормально, потому что 10 ^ 15 намного меньше, чем вероятность того, что космический луч нарушит вычисления .
источник
R,
604728 байтЭто безымянный функциональный объект, который принимает два числа и возвращает число. Не использует рекурсию.
Как отметил xnor в комментарии, эту проблему можно рассматривать как простое добавление двух чисел плюс геометрической случайной величины с вероятностью отказа 1/10.
Почему это правда? Думайте об этом с точки зрения рекурсии, как это описано в посте. В каждой итерации у нас есть 10% -ная вероятность добавления 1 и повторения, и 90% -ная вероятность выхода из функции без дальнейшего добавления. Каждая итерация представляет собой собственное независимое испытание Бернулли с результатами «добавить 1, рекурсивно» (неудача) и «выход» (успех). Таким образом, вероятность неудачи равна 1/10, а вероятность успеха равна 9/10.
Когда речь идет о серии независимых испытаний Бернулли, число испытаний, необходимых для достижения одного успеха, следует геометрическому распределению . В нашем случае каждая рекурсия означает добавление 1, поэтому, когда мы, наконец, выйдем из функции, мы по существу посчитали количество сбоев, которые произошли до первого успеха. Это означает, что величина, на которую будет выведен результат, является случайным отклонением от геометрического распределения.
Здесь мы можем воспользоваться широким набором встроенных в R распределений вероятностей и использовать его
rgeom
, который возвращает случайное значение из геометрического распределения.Ungolfed:
источник
Минколанг 0,14 ,
191112 байтЭто версия «функции»; он предполагает
a
иb
уже находится в стеке, выталкивает их и выдвигает измененную версиюa+b
. Ближайший эквивалент функций Minkolang является использованиеF
, который выскакивает прочьb
,a
и переходит к(a,b)
в CodeBox. Затем, когда счетчик программы достигает значенияf
, он возвращается к тому месту, гдеF
был использован.Это полная версия программы, 15 байт . (
nn
берет два числа с входа,N.
выводит результат и останавливается.)Я украл алгоритм из ответа Doorknob ; цикл while повторяется до тех пор, пока сгенерированное случайное число меньше 0,1, добавляя 1 каждый раз. Попробуйте здесь (полная версия программы) и запустите 100 раз здесь .
объяснение
Самая умная часть здесь
d
. Вершина стека в этот момент времени будет 0 или 1. Если это 0, цикл while завершается. В противном случае это продолжается. Поскольку я дублирую вершину стека, это будет[a+b,1]
второй раз в цикле, поэтому+
в начале добавляется 1 (и аналогично для последующих поездок).источник
f
в конце в число символов (и технически предыдущий символ новой строки, если вы чувствуете себя сверх педантичным, но я не думаю, что это необходимо).CJam,
1211 байтовСпасибо @ MartinBütter за сохранение байта с помощью этого очень умного трюка!
Старый ответ:
Попробуйте онлайн .
Объяснение:
Основной алгоритм - это «время (0,1 шанс), увеличение числа», что устраняет необходимость в рекурсии.
источник
Javascript ES6, 38 байт
источник
f=(a,b)=>new Date%10<1?f(a,b+1):a+b
для 35 байтовDate
временной метки не будет точной, потому что, если она оценивает,true
она будет прибавлять1
до конца миллисекунды.f=(a,b)=>a+b-~~Math.log10(Math.random())
но оно на 2 байта длиннее.MATL ,
141312 байтЭто просто метод цикла, добавьте входные данные (введенные как
[a b]
), затем продолжайте добавлять один, в то время как равномерное случайное число между 0 и 1 меньше 0,1. Полное описание ниже:Снял 1 байт, изменив спецификацию ввода (с
ii+
наis
).Старый способ основывался на том, что для определения суммы, которую нужно добавить
a+b
, взяли логарифмическое основание-10 случайного числа от 0 до 1 , однако из-за точности с плавающей запятой он мог работать только до 15 повторений.В этом коде
10,2$YlZo-
выполняется логарифм случайного числа с основанием 10 и округление до ближайшего целого числа.источник
ii+`10Yr1=tb+w]
пока не играется в гольф.Бинарно - кодированный Golfical ,
3229 + 1 (-x
флаг) = 30 байтовHexdump (отредактировано вручную, чтобы исправить ошибку в части изображения в двоичную часть транспилятора, которая с тех пор была исправлена):
Эту кодировку можно преобразовать обратно в исходное графическое представление с помощью включенной утилиты Encoder или запустить непосредственно с использованием
-x
флага.Исходное изображение:
Увеличено в 50 раз:
Объяснение: Верхний ряд является основным блоком. Он читает число, копирует его вправо, читает другое число, добавляет их, копирует результат справа, выполняет некоторые операции по ГСЧ и, с вероятностью 90%, печатает результат сложения. В остальное время он отправляется в нижний ряд, где помещает единицу в первую ячейку и возвращается к главному ряду непосредственно перед инструкцией сложения (с использованием поворота на север, а затем на восток).
источник
Python,
66656463 байтаПопробуйте онлайн
Спасибо Sherlock9 за исправления и сохраненный байт.
Спасибо Матиасу Эттингеру за еще один байт.
Спасибо mbomb007 за байт.
источник
.9>random()
не совсем 9 из 10 из-за неравномерного распределения чиселЮлия, 30 байт
Это рекурсивная функция,
f
которая принимает два числа и возвращает число одного типа. Это должно нормально работать для любого числового типа.Сначала мы проверяем, больше ли случайное смещение между 0 и 1, чем 0,9. Если это так, мы добавим немного чего-нибудь «что-нибудь», в противном случае мы просто добавим.
источник
TI-BASIC, 15 байтов
Он принимает входные данные в виде списка из двух элементов
Ans
. Хотя случайное число меньше0.1
, оно добавляется в0.5
список в векторизации . Увеличение каждого элемента путем0.5
увеличения суммы на 1. Я считаю, что это самое короткое решение TI-BASIC.9-байтовая программа
sum(Ans)-int(log(10rand
не работает, потому чтоrand
имеет только 14 цифр точности, и, следовательно, она не может дать число меньше 10 -14 .источник
APL, 17 байт
Это безымянная двоичная функция.
Ungolfed:
источник
Pyth,
1412 байтМой первый настоящий гольф Pyth!
Принимает ввод по STDIN в формате
a,b
.Объяснение:
Спасибо @FryAmTheEggman за то, что он сбрил два символа и дал мне более короткий способ увеличить переменную!
источник
Витси ,
1210 байтовПопробуйте онлайн!
Обратите внимание, что это имеет небольшую вероятность ошибки переполнения стека. Мы говорим о
(.1)^400
случайности. Это также выходит из-за ошибки из-за того, как я вызвал рекурсию.источник
Лисп, 58 байт
Я впервые пишу Лисп!
Вы можете использовать это специальное дополнение точно так же, как вы обычно добавляете в Lisp:
Я хотел бы услышать предложения, поскольку я новичок в этом языке.
источник
(- a(- -1 b))
работать? Сохраняет 2 байта, если это так.Серьезно, 10 байт
Эта программа генерирует случайную величину из геометрического распределения путем преобразования равномерного распределения. Он принимает входные данные в виде списка:
[2,3]
(необязательные скобки). Попробуйте онлайн .Объяснение:
Для произвольной переменной
X ~ Uniform(0, 1)
ее можно преобразовать в случайную переменнуюY ~ Geometric(p)
по формулеY = floor(log(X)/log(p))
.источник
Mathematica, 32 байта
Объяснение:
Обратите внимание, что эта функция работает для любого количества входов.
источник
TeaScript , 18 байт
21Это функция TeaScript. Присвойте его переменной или просто запустите напрямую.
Попробуйте онлайн
источник
Candy , 11 байт
Длинная форма:
источник
C
71513937 байтПервый код-гольф, сделанный на Си ... Я не думаю, что он что-то превзойдет, и, возможно, сильно проиграет
РЕДАКТИРОВАТЬ 3: отредактировал 2 байта благодаря @Mego, написав 0,1 вместо 0,1 и переписав троичный оператор
РЕДАКТИРОВАТЬ 2: отредактированные 12 байтов, следующие за gnu99, каждая переменная является int, если не указано иное. То же самое касается возвращаемого типа функции
РЕДАКТИРОВАТЬ: вырезать 20 байтов, забыл, что основные .h не нужны в C99 (например, с помощью gcc). Это выдаст предупреждение :)
71 байтное решение:
Если вы хотите увидеть много выходных данных, вы можете использовать следующий код
источник
MATL , 12
1314байтовВходные данные имеют форму
[3 4]
, то есть вектор строки с двумя числами.пример
объяснение
Это генерирует геометрическую случайную переменную без циклов, непосредственно применяя преобразование к однородной случайной переменной. Обратите внимание, что log 0.1 a используется вместо log a / log 0.1 для сохранения 1 байта.
источник
Microscript ,
2921 байтЯ попытался ответить на Microscript II, но по какой-то причине я не смог заставить цикл сложения работать правильно :(
источник
Мышь-2002 ,
413938 байтНет рекурсии.
Разъяснение:
Или, если вы фанат функционального программирования, и рекурсия - это ваше дело, тогда 57 байт :
Разъяснение:
источник
Желе , 7 байт (не конкурирует)
Попробуйте онлайн!
Как это устроено
источник
APL (Dyalog Unicode) ,
1312 байтов SBCSВ основном так же, как решение Pyth от FryAmTheEggman . -1 спасибо Эрику Аутгольферу.
Анонимная негласная инфиксная функция.
Попробуйте онлайн!
+
добавить аргументы{
…}⍣=
Применять следующую функцию, пока два последовательных приложения не дадут одинаковый результат:?10
случайное целое число в диапазоне 1–101=
один равен этому? (т.е. 1 ⁄ 10- й шанс)⍵+
добавить аргумент к этомуисточник
/
.Perl 6 , 26 байт
На самом деле делать это рекурсивно:
Создайте, возможно, пустую последовательность
1
s, за которой следуют аргументы, а затем сложите их все вместе.(это может принимать любое количество аргументов)
использование:
источник
Pyth, 11 байт
Прямой порт Pyth моего Python ответа .
источник
Октава, 20 байт
Сумма входных данных плюс случайная выборка из геометрического распределения с параметром
0.9
.источник
Серьезно, 13 байтов
Использует стратегию, аналогичную CJam-ответу Doorknob (номер приращения, когда случайное число с плавающей запятой меньше 0,1), за исключением того, что он использует целые числа, и приращения, когда случайное число с целым числом
[0,9]
меньше 1.Попробуйте онлайн (требуется ручной ввод)
Объяснение:
Цикл while оставляет стек следующим образом:
Сдвиг
n
на 1 необходим для запуска цикла while, так как0
это фальси. Это легко решается уменьшениемn
после цикла while, так что конечный результат таковa + b + (n - 1)
.источник
MATLAB, 51 байт
Результат находится в автоматической переменной ans
источник