Число уравновешивается, если сумма цифр на каждой половине числа равна, поэтому: 1423
сбалансировано, потому что 1+4 = 2+3
, так же как: 42615
потому что 4+2=1+5
. Обратите внимание, что средняя цифра не включена ни с одной стороны (или с обеих сторон), если существует нечетное количество цифр.
Вызов:
Возьмите положительное целое число в качестве входных данных и выведите истинное значение, если оно сбалансировано, и ложное значение, если оно не сбалансировано.
Тестовые случаи (правда)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Тестовые случаи (ложные)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
Там не будет чисел, начинающихся с нуля, например, 00032
вместо 32
. Вы должны поддерживать номера, по крайней мере, до 100 цифр (больше, чем 2^64-1
). Как всегда, необязательный формат ввода, поэтому при желании вы можете окружить число апострофами.
Ë
вместо`Q
?Ë
была другая команда, когда этот вызов был сделан, так что, к сожалению, нет.> <> ,
3129 байтПопробуйте онлайн!
Строка 1: стандартный входной контур
Строка 2: отбросьте -1 на вершине стека, нажмите два 0 и поверните один на дно стека (это гарантирует, что входы длины <3 не исчерпают стек позже в программе)
Строка 3: если длина стека> 3, сложите два верхних и два нижних элемента стека.
Строка 4: если верх и низ стека равны, выведите 1, 0 в противном случае.
Редактировать: понял, что не нужно брать символы мод 12, сохранено 2 байта
источник
Haskell,
6463 байтаОдин байт сохранен благодаря nimi
источник
b(a:t@(r:s))=a-last t+b(init t);b _=0
Брахилог , 20 байт
Попробуйте онлайн!
объяснение
источник
Java, 85 байт
Примечание: входные данные даны так,
String
как без них не может справиться JavaBigInteger
(аBigInteger
s создаются с использованием ....String
)Тестирование и разгула
источник
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 байт
объяснение
Я действительно надеялся, что смогу использовать этот подход на каком-то языке, и, похоже, в Mathematica он работает довольно хорошо. Идея состоит в том, чтобы избежать необходимости получать как переднюю, так и заднюю половину, комбинируя список с его реверсом и глядя только на переднюю половину.
Сначала мы превращаем ввод в список десятичных цифр и передаем результат в безымянную функцию слева.
Теперь мы вычитаем обратную сторону списка из самого списка. Если цифры то результат будет .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Мы извлекаем первую половину этого списка (исключая среднюю цифру, хотя это на самом деле не имеет значения, потому что соответствующая разница будет в
0
любом случае).И затем мы суммируем этот список. Так вот:
Перегруппировка:
Вход сбалансирован, если две половины имеют одинаковую сумму. Следовательно, это выражение равно нулю, если вход сбалансирован. Вот что мы проверяем:
источник
JavaScript (ES6),
5955514442 байтаОказывается, я использовал неправильную стратегию полностью. Эта версия рекурсивно находит сумму первой половины минус сумму второй половины, а затем возвращает логическое НЕ результата.
Если бы мы могли вернуть ложь вместо правды и наоборот, это было бы 35 байтов:
Тестовый фрагмент
Показать фрагмент кода
источник
n[i*2]
! Хороший.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 байт
Принимает ввод
$a
в виде строки (необходимо поддерживать числа,>2^64-1
не вдаваясь в очень неуклюжие преобразования[biginteger]
в командной строке).Для объяснения, давайте предположим ввод
'1423'
. Затем мы создаем новую строку. Два ломтика массива очевидны ($a[...]
), и окружен тремя дополнительными строками(
,0)-(
и0)
, формулируя массивchar
с иstring
с. Обратите внимание,
на переднюю часть для принудительной конкатенации массивов, а не конкатенации строк.Весь этот массив
-join
обрабатывается вместе с+
, в результате получается строка типа(+1+4+0)-(+2+3+0)
, и вы можете видеть, что0
s необходимы для предотвращения синтаксических ошибок. Это подается в|iex
(сокращениеInvoke-Expression
и аналогичноeval
), который будет вычислять математический результат. До тех пор , как струна сбалансирована, вы получите в0
качестве выходного сигнала, который мы инкапсулировать в круглых скобках и принять их булевы-не!(...)
, к выходуTrue
. Если это любое ненулевое целое число, оно выведетFalse
.Тестовые случаи
источник
Perl, 29 байт
Включает +5 для
-lpF
Дайте номер на STDIN
balanced.pl
:источник
C #, 83 байта
Попробуйте онлайн!
Полный исходный код, включая контрольный пример:
Тип данных BigInteger допускает любую длину номера. Если число слишком велико, компилятор жалуется ( ошибка CS1021: интегральная константа слишком велика ), поэтому вместо этого используется метод BigInteger.Parse (String) .
Решение может быть сокращено до 72 байт, учитывая, что входные данные являются строкой (и соответственно обновляют программу):
источник
t[l-++i]
вместоt[l-1-i++]
, аreturn !r
вместоreturn r==0
?Python 3,
10710276 байт-26 байт @Rod !
источник
floor(l/2)
сl//2
иceil(l/2)
с ,l//2+l%2
чтобы сохранить 7 байт, а затем удалить математику импорта, экономя более 180
наn[0:l//2]
иn[l//2+l%2:]
могут быть простоn[-(l//2):]
. Или вы могли бы переместить//2
вl=len(n)//2
и использоватьn[:l]
иn[-l:]
Рубин, 63 байта
Примечание: аргумент
s
должен быть строкой.Тестирование (требуется минимум 5+):
источник
Haskell, 55 байтов
Рекурсивная функция
g
разворачивает числовую строку с обоих концов, многократно беря голову, затем переворачивая. Он вычитает рекурсивный результат из головы, который вызывает чередование коэффициентов +1 и -1, с +1, примененным к первой половине и -1 к второй половине.Таким образом, он принимает сумму первой половины минус сумму второй половины. При этом возникает проблема
(<*"xx")
, заключающаяся в том, что при нечетном количестве цифр центр разрывается по левому краю , но основная функция исправляет это , что удваивает каждый символ, то есть «12345» становится «1122334455». Таким образом, средняя цифра делится равномерно с обеих сторон и удаляется.источник
Retina,
6444 байтаПопробуйте онлайн
Первый этап разбивает строку в середине, пропуская средний символ, если он есть (
взято и изменено отсюда . Сразрешения Мартина.) Затем замените цифры их унарным представлением и сопоставьте, если две половины имеют одинаковую длину.источник
(.)*?
(каждая итерация помещает захват в стек 2). Затем мы пытаемся достичь конца, снова выталкивая из стека(?<-2>.)*$
(после дополнительной средней цифры). Первый раз, когда это возможно, мы записали ровно половину цифр (округлено в меньшую сторону) в группу 2.JavaScript (ES6),
7467...5950 байтРекурсивно суммирует разницу первой и последней цифр, пока не останется меньше двух цифр:
источник
(s-=i<0?v:-v)
.Math.sign()
.R
10596 байтОказывается, R очень многословен. Принимает ввод как символ.
Отформатировано красиво:
объяснение
y<-as.numeric(unlist(strsplit(x,"")))
Разбейте вход (string_, и приведите его к вектору вместо списка, а затем превратите его обратно в целые числа).sum(tail(y,
:tail
принимает последние n элементов, найденных:length(y)%/%2))
где%/%
целочисленное деление, чтобы получить потолок частного, где длина нечетная.sum(head(y,length(y)%/%2))
: liketail
,head
берет первые n элементов вектора, найденных таким же образом.Правки
=
вместо<-
, сохранил еще два байта.источник
length(y)%/%2
как-то связать переменную и использовать ее в вызовахtail
иhead
?Brain-Flak ,
410206204178 + 3 = 181 байтВот 178-байтовая версия, которая использует
-a
флаг.26 байтов от DJMcMayhem
Попробуйте онлайн
Вот более длинная 410-байтовая версия, которая не использует
-a
флаг.Попробуйте онлайн
объяснение
Вот объяснение более короткого решения
Для начала число конвертируется во все его значения ASCII с помощью
-a
флага.Мы выдвигаем высоту стека (т.е. количество цифр) и делим на два.
Для каждого числа меньше числа, которое мы только что нажали, мы перемещаем цифру в другой стек
Если стеки имеют разную высоту, мы удаляем верхний элемент из текущего стека.
Мы хотим разницу между суммами каждого стека. Поэтому мы используем следующий алгоритм для суммирования каждого стека.
Это предполагает, что ни одна цифра не имеет значения ASCII, равного нулю, что является допустимым допущением.
Мы запускаем это для обоих стеков и принимаем разницу (
<(())>
необходимо для следующей части.Теперь мы хотим отменить сумму. Если сумма равна нулю, она вытолкнет верхнюю часть, открывая ту, которую мы выдвинули ранее, иначе она удалит и число, и единицу и поместит ноль сверху.
источник
([]){[{}]{}([])}{}
для суммирования каждого стека?({{}})
должно работать просто отлично, и, поскольку вы принимаете ASCII-ввод, вам не нужно беспокоиться о том, что 0 разрушит цикл.На самом деле
1716 байтЭтот ответ основан на ответе ElPedro's Python 2 и их идее использовать
[-b:]
. Предложения по игре в гольф приветствуются. Попробуйте онлайн!Ungolfing
источник
Perl 6 ,
42 3933 байтаПопробуй это
Попробуй это
Проверьте это (от Джо Кинга )
Объяснение:
источник
..
обрабатывает нецелые числа). Как насчет 33 байтов вместо этогоJavascript, 73 байта
Хорошие старые петли ES5
Что тут происходит?
источник
Python 2, 73 байта
Тесты в идеоне
Мы должны использовать,
str()
а не ``, так какn
может находиться за пределами диапазона со знаком int.источник
Python 2,
8377 байтРЕДАКТИРОВАТЬ
уменьшено до 77 с помощью @Rod
Примеры:
источник
map(int,input())
вместо этого[int(h)for h in raw_input()]
,len(g)/2
всегда будет int, не нужно конвертировать, и в этомor b==0
нет необходимостиb==0
это нужно дляlen=1
, но вы можете сократить его доb<1
PHP
73676057 байтТребуется PHP 7.1 для отрицательных смещений строк:
Бег:
Предыдущая версия
Примечание: требуется PHP 7 для оператора космического корабля.
Запустите так:
объяснение
Перебирает цифры в номере. Проверяет, принадлежит ли цифра первой половине или второй половине (или является средней цифрой), сравнивая индекс цифры с длиной ввода с помощью комбинированного сравнения (
2 * $x <=> $l - 1
). Затем умножьте это на цифру, возьмите сумму всех цифр. Если это сбалансированное число, сумма будет0
.Пример с вводом
15324
:Tweaks
$d
, просто повторяйте длину ввода. Сохранено 5 байтов.null
не нужно приводить кint
PHP0
. Сохранено 1 байт.$argn
источник
Clojure,
6664 байтаОбновление: Вынул
str
изmap int
функции.Это было бы закорочено, если бы входной формат был более гибким, теперь мне нужно было сначала отобразить целое число в последовательность значений ASCII. Внутреннее
map
вычисляет попарные разности значений из двух половинок, и это проверяет, равна ли сумма дельт нулю.((comp f g h) x y z)
=(f (g (h x y z))
.На самом деле это оказалось той же длины, что и простое отображение в a,
let
и просто определение одной функции.источник
sed (165 + 1 для -r) 166
Выход:
1 для истинного
0 для ложного
Попробуйте онлайн!
источник
Python 2.7,
10292 байтаДля цикла работает лучше: /
Та же идея, просто используйте длину - я, чтобы получить другую сторону. Он никогда не достигнет центра нечетного числа.
Старый код
Получает ввод
Сохраняет длину ввода.
Рекурсивная функция для получения суммы строки.
Сравните первую половину суммы со второй половиной суммы.
Пытаюсь получить его ниже 100, но это сложно: /
источник
Функция С, 74
Ideone.
источник
#include"string.h"\n
, что добавляет 19 к вашему счету.char *n
l;i;t;f(char*n){..return!t;}
-2 байтаРакетка 204 байта
Подробная версия:
Тестирование:
Выход:
источник
Пайк, 20 байт
Попробуй это здесь!
источник
not [0]
был 0, а не 1Математика, 69
источник
...;;]]&@*IntegerDigits
@*
это сокращение отComposition
.f@*g
естьf[g[##]]&
.