Введение
В этом задании вы должны разбить целое число на две части. Поскольку никто не любит получать кусочек пирога меньшего размера, ваша цель - быть максимально справедливым. Например, если вы хотите разбить целое число 7129
на две части, есть 3 возможных способа сделать это.
7,129
, 71,29
и 712,9
все возможности, но 71,29
это самый справедливый способ разделить его на две части, потому что это минимизирует разницу между ними:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Вызов
По целому числу определите наилучший из возможных способов его разбиения, как описано выше, и сообщите полученную разницу.
правила
- Разделение имеет смысл только для целых чисел длиной не менее двух, входные данные всегда будут ≥ 10
- Ввод может быть целым числом, списком цифр или строкой
- Вам не нужно обрабатывать неверный ввод
Testcases
Вам нужно только сообщить о результирующей разнице, разделение здесь только для иллюстрации:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 байтов
Код:
Использует кодировку 05AB1E . Попробуйте онлайн!
объяснение
источник
£
с°‰
вами не нужно будет¤â
больше.Python 2 , 64 байта
Попробуйте онлайн!
источник
Perl 6 , 40 байт
Попробуй это
Expanded:
источник
C 94 байта
Попробуйте онлайн!
источник
Python 2 , 51 байт
Попробуйте онлайн!
источник
Пролог (SWI) ,
195189154117112 байт35 байтов сэкономлено благодаря Eminga
Попробуйте онлайн!
Это моя первая попытка игры в пролог, поэтому она может быть немного ужасной. Вот как это работает.
На высшем уровне мы имеем
*
.*
принимаетA
иH
, и определяет,H
является ли наименьший способ разделенияA
.Первая строка здесь использует технику из этого поста SO , чтобы по существу выполнить карту предиката
r(A)
над целыми числами от0
доA
. Так какr
подтверждает значения каждого раздела, это даст нам значения всех возможных разделов, плюс целую загрузку дополнительного мусора. Все эти разделы будут храниться в произвольномL
порядке. Как только это будет сделано, мы сортируем список, чтобы найти самый маленький элемент. Затем мы используем сокращение, чтобы предотвратить возврат.Далее у нас есть определение
r
. Сначалаr
вычисляет два результата разделения, называя ихX
иY
.Тогда мы утверждаем, что
C
это их различие и является положительным.источник
X is div(A,10**B),Y is div(A,10**B)
которая всегда будет даватьC=0
(значениеH
также всегда будет равно 0 ). Должен бытьY is mod(A,10**B)
я полагаю.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
сохранено 32 байта (если вы используете по крайней мере пролог SWI, не уверен насчет других версий).A*H
вместоl(A,H)
сохранения другого 3. А если вы используете SWI, вы можете добавить ссылку,!
не так ли? Там не должно быть никакого возврата в этот момент.,!
что в этом нет необходимости, но когда я тестирую программу, она возвращается. Кажется, чтобы попробовать все возможные упорядочения,L
а затем сортирует их все. Это значит, что ответ будет одинаковымA!
.Haskell ,
6865 байтПопробуйте онлайн!
объяснение
источник
Древесный уголь , 14 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Мне удобно использовать 2-арковый вариант
Slice
. Объяснение:источник
Желе ,
98 байтПопробуйте онлайн!
-1 байт благодаря Денису. Ввод представляет собой список цифр.
объяснение
источник
Фанки ,
15913499 байтНа самом деле подгонка спецификации короче кажется.
Попробуйте онлайн!
источник
Сетчатка , 36 байт
Попробуйте онлайн!
объяснение
Это создает все возможные разделы на отдельных строках, а также завершающую строку с исходным вводом.
Конвертировать каждое число в каждом разделе в одинарное.
Удалите максимальное и равное количество
1
s из обеих частей каждого раздела (т.е. удалите минимум и вычтите его из максимума, что дает абсолютную разницу).Сортировка строк.
Посчитайте
1
s в первой строке, что дает минимальную абсолютную разницу.источник
J ,
32, 2723 байта-5 байт благодаря FrownyFrog! -4 байта, если вход является строкой.
Попробуйте онлайн!
Оригинал: принимает число в качестве ввода
Как это работает:
Попробуйте онлайн!
источник
JavaScript (ES6), 64 байта
Принимает ввод в виде строки.
Контрольные примеры
Показать фрагмент кода
комментарии
Нерекурсивный (ES7), 65 байт
Принимает ввод в виде строки.
Контрольные примеры
Показать фрагмент кода
комментарии
Примечание : в обеих версиях
l
приводится к строке на первой итерации. Как правило, мы должны быть осторожны с ведущими нулями в числовом литерале:0123 - 10 === 73
потому что0123
анализируется как восьмеричное значение (теперь это устарело, но все еще допустимо в нестрогом режиме). Но'0123' - '10' === 113
ведущий ноль в этот раз игнорируется. Так что это правильно.Из спецификации абстрактной операции,
ToNumber
примененной к строке:источник
APL (Dyalog) , 27 байтов
Попробуйте онлайн!
Как?
¯1+≢⍵
- длинаn
минус 1∘.=⍨⍳
- единичная матрица1,
- готовить1
для каждого ряда↓
- разделить на строки⊂∘⍵¨
- для каждого разделить строку на него↑
- расплющить-/
- уменьшить каждую пару с вычитанием|
- принять абсолютные значения⌊/
- минимумAPL (Dyalog) , 35 байт
Попробуйте онлайн!
источник
Желе , 11 байт
Попробуйте онлайн!
-3 байта благодаря Дилнану
Как это работает
источник
L=2$$Ðf
наṖLÐṂ
Python 2 , 58 байт
Попробуйте онлайн!
источник
Pyth , 15 байт
Попробуйте онлайн!
источник
MATL , 15 байт
Ввод - это строка, представляющая целое число.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Wolfram Language (Mathematica) , 66 байт
Принимает список цифр.
Попробуйте онлайн!
источник
Чистый ,
10683 байтаОпределяет функцию
@
, беря строку.Наиболее очевидный, единственный хитрый момент
f=toInt o(%)n
: он беретtoInt
класс функций и компонует его (o
) с классом оператора карризованного слайса (%
), уже предоставленным с первым аргументом (n
). Поскольку существует только один тип (String
эквивалентный{#Char}
), который имеет перегрузки для обоих типов ,%
иtoInt
строка фактически компилируется, тогда как обычно сложно составлять функции при игре в гольф из-за отсутствия контекстной информации, передаваемой компилятору.Попробуйте онлайн!
источник
Желе , 12 байт
Монадическая ссылка, содержащая список цифр и возвращающая целое число.
Попробуйте онлайн!
Как?
источник
Pyth, 10 байт
Тестирование
Принимает ввод в виде строки.
При этом используется одна из последних функций Pyth, которая заключается в том, что при применении функции к списку по умолчанию используется отображение функции по списку, если не определено другое поведение. Это означает, что
v
применительно к списку строк список оценивает все строки.Обратите внимание, что список разделений позволяет разделить на 1 часть, но значение этого всегда будет больше, чем минимум, поэтому он безопасно игнорируется.
источник
Tcl , 116 байт
Попробуйте онлайн!
объяснение
Он работает с использованием трюка с регулярными выражениями, позволяющего вырожденному конечному случаю, который всегда будет вычисляться с превышением минимальной разницы. Для «12345» значения:
источник
lmap
вместоforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Рубин , 44 байта
Попробуйте онлайн!
источник
APL + WIN, 31 байт
Запрашивает ввод целого числа на экране в виде строки.
Объяснение:
источник
Perl 5 ,
5141 + 1 (-p
) = 42 байтаПопробуйте онлайн!
вдохновленный комментарием @ Nahuel-Fouilleul
источник
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 байтПопробуйте онлайн!
Количество включает 18 байтов в
using System.Linq;
. Принимает вход какstring
.источник
string.Remove
может сэкономить вам несколько байтовCommon Lisp, 131 байт
Я впервые участвовал в Code Golf, и я решил использовать Lisp, так как мне это нравится.
Вот мое решение:
Входные данные должны быть строкой, а не целым числом или списком.
источник