Эта проблема, хотя, вероятно, тривиальна в большинстве «стандартных» языков, адресована тем языкам, которые настолько эзотеричны, низкоуровневы и / или трудны в использовании, что очень редко встречаются на этом сайте. Это должно обеспечить интересную проблему для решения, так что это ваш шанс попробовать тот странный язык, о котором вы читали!
Задание
Возьмите два натуральных числа a
и в b
качестве входных данных и выведите два других числа: результат целочисленного деления a/b
и остаток от такого деления ( a%b
).
Это код-гольф : самый короткий ответ (в байтах), для каждого языка, выигрывает!
Ввод, вывод
- 0 <=
a
<= 255, 1 <= b
<= 255. Каждый из ваших входов (и выходов тоже) будет помещаться в один байт.
- Вы можете выбрать любой формат для ввода и вывода, при условии, что эти два числа четко различимы (например, нет распечатки двух результатов без разделителя)
Примеры
a,b->division,remainder
5,7->0,5
5,1->5,0
18,4->4,2
255,25->10,5
Примечание. Встроенные функции, которые возвращают как результат деления, так и остаток, запрещены . По крайней мере покажите нам, как ваш язык работает с применением двух функций к одним и тем же аргументам.
Примечание 2. Как всегда, приветствуется объяснение того, как работает ваш код, даже если он выглядит читабельным для вас, для кого-то это может быть не так!
Leaderboard
Вот фрагмент стека, чтобы составить обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=114003,OVERRIDE_USER=62393;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={};e.forEach(function(e){var o=e.language;/<a/.test(o)&&(o=jQuery(o).text().toLowerCase()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link,uniq:o}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.uniq>s.uniq?1:e.uniq<s.uniq?-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}#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=617d0685f6f3"> <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="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
a b
предоставленияb a
вместо этого предоставления ?You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable
1
.Ответы:
BitCycle ,
1467964 байтаПросто понял, что целый раздел моего исходного кода был излишним. Огромное сокращение!
Программа принимает унарный ввод из командной строки, сначала делитель. Он выводит частное и остаток в одинарных, разделенных символом
0
. Например, вотa=11
,b=4
,a/b=2
,a%b=3
:Ungolfed, в действии
Вот моя версия ungolfed вычислений
a=3
,b=5
с анимацией включен (извините о glitchiness):Попытка объяснения
Объяснение применимо к негольфированной версии. Прежде чем заняться этим, я настоятельно рекомендую прочитать страницу Esolangs, чтобы понять, как работает язык.
Алгоритм выглядит так:
0
за которым следуют биты дивидендов, а затем завершите.Сердцем кода являются отношения между коллекционерами (заглавными буквами). Поскольку существует множество отдельных коллекторов с каждой буквой, давайте относиться к ним , как
A1
,A2
,B1
,B2
и т.д., нумерация сверху вниз.A1
иA2
держите делитель и дивиденд, соответственно, в начале основного цикла.B1
.C1
а другой - вC3
. Остальная часть дивидендов идет вB2
.C2
.C3
илиC2
для вывода. Остальная часть дивидендов идет вC4
.B
коллекторах есть какие-либо биты , они возвращают свое содержимое обратно вA
коллекторы и продолжают во внутреннем цикле.A
иB
коллекторы пусты, тоC
коллекторы открыть , и мы переходим к стадии обработки:C1
иC4
сбросьте их содержимое (делитель и оставшийся дивиденд соответственно) вD1
иD3
.C2
пусто, мы все еще печатаем частное.C3
перейдите к верхнему правому=
переключателю. Первый1
бит проходит прямо через!
и выводится.1
бит проходит, он активирует переключатель, указывающий вправо, который отправляет все последующие биты с платы.C2
не пусто, мы печатаем остаток.C2
обнуляется0
и передается через переключатель.0
Продолжает!
и выводится.0
бит проходит, он активирует переключатель, чтобы указать влево. Теперь все битыC3
идут от переключателя влево и перенаправляются в!
, выводя весь остаток.C2
также отправляется вD2
.D
коллекционеры открыты.D2
, это означает, что мы просто напечатали остаток. Бит изD2
хитов@
, завершающий программу.D1
иD3
цикл возвращается вA1
иA2
соответственно, и основной цикл начинается заново.источник
бред ,
4341 байтЭто использует модифицированную версию моего алгоритма деструктивного модуля на Esolangs .
Программа читает два байта - d и n в этом порядке - из STDIN и печатает два байта - n% d и n / d в этом порядке - в STDOUT. Требуется интерпретатор мозгового штурма с дважды бесконечной или круглой лентой, такой как на TIO.
Попробуйте онлайн!
Как это работает
Перед запуском программы все ячейки сохраняют значение 0 . После считывания d из STDIN (
,
), перемещения на один шаг влево (<
) и считывания n из STDIN (,
) лента выглядит следующим образом.Далее, предполагая, что n> 0 , мы входим в цикл while
который преобразует ленту следующим образом.
Во- первых,
>->+<
прогресс в ячейку C и уменьшает его, а затем переходит в ячейку D и увеличивает его, и , наконец , возвращается в ячейку C . Что будет дальше, зависит от того, равно ли значение ячейки C нулю или нет.Если ячейка C держать положительное значение,
[>]
(идти прямо , пока клетка не ноль) продвинет к ячейке Е .>>>>+<<<
авансы клеток J , чтобы увеличить его, а затем возвращается в ячейку F .Так как ячейка F всегда будет иметь 0 , то время цикла
[<+>-]
пропускается полностью, и<<
возвращается в ячейку D .Наконец, так как ни D , ни С держать 0 ,
[<]
(идти налево в то время как клетка не равно нулю) будет retrocede к ячейке А .Если ячейка C содержит 0 , цикл
[>]
полностью пропускается;>>>>+<<<
авансы клетки G , чтобы увеличить его, а затем возвращается в ячейку D .В этот момент D будет удерживать d (на самом деле сумма значений в C и D всегда будет d ), поэтому
[<+>-]
(пока D положительно, приращение C и уменьшение D ) установит C в d, а D в 0 .И, наконец,
<<
retrocedes к ячейке B ,[<]
(налево в то время как клетка не равно нулю) дополнительно слева ячейки A .В обоих случаях происходит
>-
переход в ячейку B и ее уменьшение, и цикл начинается заново, если только это не обнуляет его.После k итераций лента выглядит следующим образом.
После n итераций B обнуляется и мы вырываемся из цикла. Желаемые значения ( n% d и n / d ) будут храниться в ячейках D и G , поэтому
>>.>>>.
печатает их.источник
Funciton ,
224108 байтЧисло байтов предполагает кодировку UTF-16 с BOM.
Попробуйте онлайн!
Выше определяется функция
f
, которая принимает два целых числа и возвращает их деление и произведение (функции в Funciton могут иметь несколько выходов, если сумма входов и выходов не превышает 4).Использование двух входных значений для разных целей на самом деле довольно тривиально: вы просто отсоединяете соединитель с Т-образным соединением, при этом значение будет дублироваться по обеим ветвям, которые мы затем можем подавать отдельно во встроенные модули для деления и по модулю.
На самом деле мне понадобилось вдвое больше времени, чтобы понять, как отобразить результат для пользователя, чем просто реализовать решение.
Кроме того , Funciton имеет встроенный divmod,
÷%
и занятно встроенные модули÷
и%
что мое решение использует реализованы в терминах÷%
. Тем не менее, моя функцияf
выше не совсем идентична÷%
: мне пришлось поменять местами порядок входов, и, хотя кажется, что это легко изменить, пока я не смог сделать это без увеличения количества байтов. ,источник
JavaScript (ES6), 17 байт
Спасибо @Arnauld за игру в один байт
Получает входные данные в формате (х) (у)
Получает пол x / y, выполняя побитовое выполнение или
Получая остаток по x% y,
помещает оба значения в массив так, чтобы они оба могли быть возвращены
Попробуйте онлайн!
источник
APL (Dyalog) , 5 байтов
-2 байта благодаря @ngn
Это вершина (2 поезда) вилки (3 поезда), где правый палец вершины является производной функцией (результат оператора, примененного к функции):
⌊
пол÷
деление,
опрокинутый до|
остаток от деления⍨
с замененными аргументами (модуль APL «назад»)Попробуйте онлайн!
источник
⌊÷,|⍨
Брахилог , 6 байт
Попробуйте онлайн!
объяснение
Мы злоупотребляем метапредикатом,
ᶠ findall
чтобы применить два разных предиката к списку ввода из двух аргументов:источник
MATL ,
1210 байтВклад
a
, тоb
. Выходной остаток, затем частное.Попробуйте онлайн!
объяснение
Это позволяет избежать как модуля, так и деления. Вместо этого он использует изменение формы массива :
a+1
ненулевых элементов.b
строк. Это автоматически дополняется нулями при необходимости.1
, являются соответственно остатком и частным.Рассмотрим, например
a=7
,b=3
.источник
Mathematica,
2018 байтНезначительное злоупотребление гибкими правилами вывода: результат дается как
div[mod]
, который останется без оценки. Отдельные номера можно извлечь с помощьюresult[[0]]
иresult[[1]]
.И, эй, он всего на один байт длиннее, чем смешно названный встроенный
QuotientRemainder
.Mathematica, на самом деле, имеет отличный способ применить несколько функций к одному входу, но это на три байта длиннее:
источник
quotRem
встроенная функция может сэкономить значительное время по вызовуquot
и поrem
отдельности.05AB1E , 5 байтов
Попробуйте онлайн!
05AB1E имеет ошибку, поэтому неявный ввод не работает :(Эминья заметил, что вводы часто проталкиваются в обратном порядке.источник
You may choose any format you like for both input and output, as long as the two numbers are clearly distinguishable
имею в виду, что вы можете решить, что входные данные принимаются какdivisor, dividend
. Вы можете просто указать «Ввод принимаются какdivisor, dividend
» в ответе, и они будут четко различимы :)Медуза , 14 байт
Попробуйте онлайн!
объяснение
Медуза - прекрасный язык, когда речь идет о применении нескольких функций к одному входу. Язык 2D и все бинарные функции смотрят на юг для одного входа и на восток для другого. Таким образом, приближаясь к одному значению с запада и с севера, мы можем передать его двум функциям, не дублируя его в коде.
Два
i
s в программе заменяются двумя входными значениями при запуске программы. Сейчас%
это разделение. Он принимает один вход непосредственно с востока, а когда идет на юг, он попадает в тот,E
который также перенаправляет поиск на восток. Таким образом, оба входа используются в%
качестве аргументов.|
это встроенный модуль по модулю, который в основном делает то же самое, но в конечном итоге смотрит на юг для обоих путов.Мы объединяем оба результата в пару с
,
. Затемm
выполняется функция floor (которая нам нужна, потому что%
это деление с плавающей запятой), и, наконец, мы выводим результат с помощьюp
.источник
Cubix , 12
13байтовКоторый отображается на следующий куб
Попробуй здесь
Объяснение с выполненными шагами
,I|I,
- начинается с лишнего целочисленного деления, получает первое целое число от ввода, отражает обратно и получает следующее целое число от ввода, затем снова делитO;
- Выводит результат целочисленного деления и извлекает его%
- делает мод. Это можно было сделать позже, но все закончилось здесьS\o
- добавьте пробел в стек, перенаправьте вверх и выведите пробелW;
- сдвиньте влево и вытяните пробел из стекаO|@
- выведите мод, рассчитанный ранее, пропустите горизонтальный рефлектор и остановите.источник
Brain-Flak ,
5654 байтаПопробуйте онлайн!
-2 байта благодаря Wheat Wizard
объяснение
В настоящее время наиболее известные целочисленное деление и деление по модулю в Brain-Flak очень похожи (на самом деле используемое в настоящее время целочисленное деление - это просто модификация, которую я сделал в feersum модулю ).
Сравнение по модулю и целочисленному делению:Удобно, программа целочисленного деления использует только третий стек для хранения данных, в то время как программа по модулю использует только два обычных стека для хранения данных. Таким образом, просто запуская их одновременно, они не сталкиваются друг с другом.
Сочетание по модулю и целочисленного деления:Наконец, и программы с целочисленным делением, и программы по модулю, используемые в этой комбинации, были спроектированы так, чтобы быть чистыми в стеке (не оставлять мусор в стеках / не зависеть от (не) наличия значений в стеках, отличных от их ввода), но это не является необходимым для этой проблемы. Таким образом, мы можем сохранить два байта, не утруждая себя нулями в конце основного цикла, и еще два байта, не нажимая ноль в начале, вместо этого полагаясь на заполнение нулями в нижней части стеков.
Это дает нам окончательную программу:Объяснение программы целочисленного деления смотрите в ответе feersum.
Объяснение целочисленного деления скоро будет ...
источник
Java 8, 18 байт
(a,b)->a/b+","+a%b
Это лямбда-выражение типа
BiFunction<Integer, Integer, String>
.Я удивлен ... это на самом деле довольно краткое решение для Java. Иди лямбда-выражения!
источник
Brain-Flak ,
168 148110 байтЯ думаю, что я должен был проверить вики первым
Формат:
Попробуйте онлайн!
источник
sed, 36 байт
35 байт кода, +1 за
-r
флаг.Принимает ввод в одинарном, пробел, с меньшим номером в первую очередь. Выводится как одинарный, с частным первым в
1
s и оставшимся вторым вx
s. (Если это неприемлемо, дайте мне знать, и я изменю его на разделенные пробелами1
s, такие как ввод.)объяснение
источник
Excel 2013,
31 3026 байтобъяснение
Вход находится в ячейке
A1
иB1
. Это просто возвращает возвращенные значенияFLOOR
иMOD
функции, которые для напольных покрытий разделения и для остальные. Эти значения разделяются запятой.источник
FLOOR(A1/B1;1)
вместоQUOTIENT(A1;B1)
FLOOR(A1/B1;1)
на INT (A1 / B1), чтобы сохранить еще 4 байтаPython 2 , 20 байт
Попробуйте онлайн!
Встроенный, 6 байтов
Попробуйте онлайн!
источник
Желе , 3 байта
Попробуйте онлайн!
источник
НЕФТЬ ,
134106103102 байтаПринимает ввод из стандартного ввода, два числа разделены новой строкой. Выводит результат целочисленного деления, затем новую строку, а затем остаток.
Это одна из самых сложных программ OIL, которые я когда-либо писал, поскольку в OIL отсутствуют встроенные функции для деления, остатка, сложения, вычитания и так далее. Он работает с примитивным способом деления: многократным вложенным декрементом.
Я представляю код в аннотированном формате с комментариями в стиле скриптовых языков. Перед выполнением комментарии должны быть удалены.
редактирование: сбрил еще 3 байта, переместив «константу» в однозначное местоположение (меньше байтов для ссылки), а затем неявно указав 2 нулевых местоположения (используя вместо этого пустую строку. Один из них я мог бы сделать до).
редактировать: и еще один байт, делая начальный ноль неявным. Нам действительно нужен только один буквальный ноль.
источник
Сетчатка , 14 байт
Давайте злоупотреблять форматами ввода / вывода!
Принимает ввод как
b\na
, в унарном, используя для одинарной цифры любой нецифровый, не символ новой строки. Выводит частное в десятичном виде, за которым сразу следует остаток в унарном виде, используя тот же символ, что и для ввода.Попробуйте онлайн!
(.*) ¶(\1)*
соответствует первому числу, затем новой строке (¶ - сокращение от Retina для \ n), затем первое число снова столько раз, сколько возможно. Количество совпадений второй группы будет результатом деления, а оставшаяся часть не соответствует.С помощью
$#2
мы заменим все совпадения в предыдущей строке на количество захватов второй группы и получим наш результат.источник
ArnoldC ,
286283 байтаПопробуйте онлайн!
Как это работает
Выходной формат
источник
Лабиринт , 11 байт
Попробуйте онлайн!
объяснение
Затем IP попадает в тупик, оборачивается и программа завершается из-за попытки деления на ноль при
%
повторном выполнении.источник
C, 32 байта
Попробуйте онлайн!
источник
> <> ,
27 2616 + 1 = 17 байтЗаметка
-v
флага, см. TIO для примера.Попробуйте онлайн!
объяснение
Обратите внимание, что стек начинается как
A, B
, гдеA
иB
представляет первый и второй входные данные из-за используемого-v
флага.источник
į
становится 255.-v
флага).C, 21 байт
Макрос, который заменяет f (a, b) двумя разделенными запятыми членами. Хотя вам лучше передать его в функцию, иначе нет возможности выделить 2.
Попробуйте онлайн
источник
Haskell , 21 байт
Попробуйте онлайн! Пример использования:
13#2
возврат(6,1)
. Да, это довольно скучно, но немного интереснее, чемdivMod
встроенная программа, которая работает так же.В то время как мы на это, есть также
quot
,rem
иquotRem
которые ведут себя так же на натуральных числах , какdiv
,mod
иdivMod
. Однако для отрицательных входных данных результатmod
имеет тот же знак, что и делитель, а результатrem
имеет тот же знак, что и дивиденд. Или, как это указано в документации Prelude ,quot
целочисленное деление усекается до нуля, аdiv
целочисленное деление усекается до отрицательной бесконечности.Как насчет нет
div
илиmod
встраивания?Нет встроенных модулей,
36 3231 байтПопробуйте онлайн! Пример использования:
13#2
возвращает(1,6)
, то естьmod
результат первый, аdiv
результат второй. Еслиa
меньшеb
, тоa mod b
естьa
иa div b
есть0
, так(a,0)
что возвращается. В противном случае рекурсивно вычислитьmod
иdiv
изa-b
иb
добавить1
к результату деления и сохранить оставшуюся часть .Добавление 1 к результату деления достигается использованием
<$>
, которое обычно используется какmap
для отображения функций по спискам, но также работает и для кортежей, однако функция применяется только ко второму элементу кортежа.Изменить: Сохраненный один байт благодаря xnor!
источник
<$>
на кортеж действовать от его второго элемента:a#b|a<b=(a,0)|m<-a-b=(+1)<$>m#b
.SWI Пролог, 109 байт
Выход:
Описание:
Простой рекурсивный алгоритм без встроенного деления или по модулю. Он просто считает "сколько раз вписывает второе число в первое?" и сообщает результат (объединенный в D) с остатком (R).
// редактировать: удалены ненужные пробелы
источник
:-
в последней строке но не в других. Они там нужны по какой-то причине? То же самое вE + 1
то время какF-S
предполагают , не требуется никаких пробелов.Gol> <> , 11 байт
Онлайн переводчик
источник
MATL, 5 байтов
Попробуйте это в MATL Online!
объяснение
источник
Уроборос , 15 байт
Принимает числа в обратном порядке (например,
10 42
). Попробуй это здесь.объяснение
источник