Это сбалансированное число?


38

Число уравновешивается, если сумма цифр на каждой половине числа равна, поэтому: 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). Как всегда, необязательный формат ввода, поэтому при желании вы можете окружить число апострофами.

Ответы:


12

05AB1E , 14 7 байт

€D2äO`Q

объяснение

Используя 141 в качестве примера:

€D       # duplicate each (turns the number into a list of digits)
         # STACK: ['1','1','4','4','1','1']
  2ä     # split list in 2 (as we duplicated each element, 
         # the middle element will exist on both sides for an odd length input
         # STACK: [['1','1','4'],['4','1','1']]
    O    # sum each sublist
         # STACK: [6,6]
     `   # flatten
         # STACK: 6, 6
      Q  # compare for equality
         # STACK: 1 (true)

Попробуйте онлайн!


Вы не можете использовать Ëвместо `Q?
Эрик Outgolfer

@EriktheOutgolfer: Ëбыла другая команда, когда этот вызов был сделан, так что, к сожалению, нет.
Emigna

10

> <> , 31 29 байт

i:0(?v
~00}v>
v+r+>l4(?
>{=n;

Попробуйте онлайн!

Строка 1: стандартный входной контур

Строка 2: отбросьте -1 на вершине стека, нажмите два 0 и поверните один на дно стека (это гарантирует, что входы длины <3 не исчерпают стек позже в программе)

Строка 3: если длина стека> 3, сложите два верхних и два нижних элемента стека.

Строка 4: если верх и низ стека равны, выведите 1, 0 в противном случае.

Редактировать: понял, что не нужно брать символы мод 12, сохранено 2 байта


7

Haskell, 64 63 байта

b(a:t@(r:s))=a-last t+b(init t);b _=0
(==0).b.map fromEnum.show

Один байт сохранен благодаря nimi


Разве фрагментам не нужны скобки?
Майкл Кляйн

@ michael-klein Нет, безымянные функции разрешены. meta.codegolf.stackexchange.com/a/7615/20260
Дэмиен

1
Один байт для сохранения:b(a:t@(r:s))=a-last t+b(init t);b _=0
Ними,

@nimi Спасибо ...
Дэмьен,


5

Java, 85 байт

n->{int s=0,i=0,l=n.length();for(;i<l/2;)s+=n.charAt(i)-n.charAt(l-++i);return s==0;}

Примечание: входные данные даны так, Stringкак без них не может справиться Java BigIntegerBigIntegers создаются с использованием .... String)

Тестирование и разгула

import java.util.function.Predicate;

public class Main {

  public static void main(String[] args) {
    Predicate<String> f = n -> {
      int s = 0, i = 0, l = n.length();
      for (; i < l / 2;) {
        s += n.charAt(i) - n.charAt(l - ++i);
      }
      return s == 0;
    };

    String[] truthies = {"1",
      "6",
      "11",
      "141",
      "23281453796004414",
      "523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088"};
    for (String s : truthies) {
      boolean result = f.test(s);
      System.out.println(result);
    }
    String[] falsies = {"10",
      "12",
      "110",
      "15421",
      "5234095123508321",
      "6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454"};
    for (String s : falsies) {
      boolean result = f.test(s);
      System.out.println(result);
    }
  }
}

Хороший ответ. Вы можете сохранить 2 байта, делая для контура пустым: for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));.
todeale

@todeale Посмотрите на код для игры в гольф, а не на некольфа. Я думаю, что ваше предложение и мой ответ по гольфу используют одинаковое количество байтов
Оливье Грегуар

По электронной почте Ой! Теперь я вижу.
todeale

5

Mathematica, 57 байт

Tr@(#-Reverse@#)[[;;⌊Length@#/2⌋]]==0&@*IntegerDigits

объяснение

Я действительно надеялся, что смогу использовать этот подход на каком-то языке, и, похоже, в Mathematica он работает довольно хорошо. Идея состоит в том, чтобы избежать необходимости получать как переднюю, так и заднюю половину, комбинируя список с его реверсом и глядя только на переднюю половину.

...&@*IntegerDigits

Сначала мы превращаем ввод в список десятичных цифр и передаем результат в безымянную функцию слева.

...(#-Reverse@#)...

Теперь мы вычитаем обратную сторону списка из самого списка. Если цифры то результат будет .{a1,a2,...,an}{a1-an,a2-an-1,...,an-a1}

...[[;;⌊Length@#/2⌋]]

Мы извлекаем первую половину этого списка (исключая среднюю цифру, хотя это на самом деле не имеет значения, потому что соответствующая разница будет в 0любом случае).

Tr@...

И затем мы суммируем этот список. Так вот:

a1 - an + a2 - an-1 + ... + a⌊n/2⌋ - a⌈n/2⌉+1

Перегруппировка:

a1 + a2 + ... + a⌊n/2⌋ - (a⌈n/2⌉+1 + ... + an-1 + an)

Вход сбалансирован, если две половины имеют одинаковую сумму. Следовательно, это выражение равно нулю, если вход сбалансирован. Вот что мы проверяем:

...==0

5

JavaScript (ES6), 59 55 51 44 42 байта

f=([x,...a],n=0)=>a[0]?f(a,x-a.pop()+n):!n

Оказывается, я использовал неправильную стратегию полностью. Эта версия рекурсивно находит сумму первой половины минус сумму второй половины, а затем возвращает логическое НЕ результата.

Если бы мы могли вернуть ложь вместо правды и наоборот, это было бы 35 байтов:

f=([x,...a])=>a[0]?x-a.pop()+f(a):0

Тестовый фрагмент


Мне очень нравится это n[i*2]! Хороший.
Арно

@Arnauld Спасибо :-) Я нашел совершенно другой подход, который вообще не нуждается в этом ...
ETHproductions

Теперь это великолепно!
Арно

Вы не можете использовать f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)?
mbomb007

@ mbomb007 Нет; это вернуло бы логическое значение (приведенное к 0 или 1) после каждой рекурсии, а не сумму.
ETHproductions

4

PowerShell v2 +, 85 байт

param($a)!((,'('+$a[0..(($b=$a.length)/2-1)]+'0)-('+$a[($b/2)..$b]+'0)')-join'+'|iex)

Принимает ввод $aв виде строки (необходимо поддерживать числа, >2^64-1не вдаваясь в очень неуклюжие преобразования [biginteger]в командной строке).

Для объяснения, давайте предположим ввод '1423'. Затем мы создаем новую строку. Два ломтика массива очевидны ( $a[...]), и окружен тремя дополнительными строками (, 0)-(и 0), формулируя массив charс и stringс. Обратите внимание ,на переднюю часть для принудительной конкатенации массивов, а не конкатенации строк.

Весь этот массив -joinобрабатывается вместе с +, в результате получается строка типа (+1+4+0)-(+2+3+0), и вы можете видеть, что 0s необходимы для предотвращения синтаксических ошибок. Это подается в |iex(сокращение Invoke-Expressionи аналогично eval), который будет вычислять математический результат. До тех пор , как струна сбалансирована, вы получите в 0качестве выходного сигнала, который мы инкапсулировать в круглых скобках и принять их булевы-не !(...), к выходу True. Если это любое ненулевое целое число, оно выведет False.

Тестовые случаи

PS C:\Tools\Scripts\golfing> '1','6','11','141','23281453796004414','523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088'|%{$_;.\is-it-a-balanced-number.ps1 $_;'---'}
1
True
---
6
True
---
11
True
---
141
True
---
23281453796004414
True
---
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
True
---

PS C:\Tools\Scripts\golfing> '10','110','15421','5234095123508321','6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454'|%{$_;.\is-it-a-balanced-number.ps1 $_;'---'}
10
False
---
110
False
---
15421
False
---
5234095123508321
False
---
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
False
---

4

Perl, 29 байт

Включает +5 для -lpF

Дайте номер на STDIN

balanced.pl <<< 1423

balanced.pl:

#!/usr/bin/perl -lpF
$;+=$_-pop@F for@F;$_=!$

4

C #, 83 байта

n=>{var t=n+"";int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

Попробуйте онлайн!

Полный исходный код, включая контрольный пример:

using System;
using System.Numerics;

namespace BalancedNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,bool>s= n=>{var t=n+"";int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

            Console.WriteLine(s(1));    //true
            Console.WriteLine(s(6));    //true
            Console.WriteLine(s(11));   //true
            Console.WriteLine(s(141));  //true
            Console.WriteLine(s(23281453796004414));    //true
            BigInteger bi = BigInteger.Parse("523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088");
            Console.WriteLine(s(bi));   //true
            Console.WriteLine(s(10));   //false
            Console.WriteLine(s(12));   //false
            Console.WriteLine(s(110));  //false
            Console.WriteLine(s(15421));    //false
            Console.WriteLine(s(5234095123508321)); //false
            bi = BigInteger.Parse("6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454");
            Console.WriteLine(s(bi));   //false
        }
    }
}

Тип данных BigInteger допускает любую длину номера. Если число слишком велико, компилятор жалуется ( ошибка CS1021: интегральная константа слишком велика ), поэтому вместо этого используется метод BigInteger.Parse (String) .

Решение может быть сокращено до 72 байт, учитывая, что входные данные являются строкой (и соответственно обновляют программу):

t=>{int l=t.Length,i=0,r=0;for(;i<l/2;)r+=t[i]-t[l-1-i++];return r==0;};

1
Не удивительно, что мой ответ в итоге выглядел довольно похожим на этот. Вы можете сделать t[l-++i]вместо t[l-1-i++], а return !rвместо return r==0?
Цифровая травма,

Префикс оператора приращения должен делать свое дело и сохранять 2 байта, но в C # возвращаемое значение должно быть логическим, поэтому! R его не обрезает. Спасибо, я обновлю свой ответ как можно скорее.
adrianmp,

4

Python 3, 107 102 76 байт

n=input()
l=len(n)
print(sum(map(int,n[:l//2]))==sum(map(int,n[l//2+l%2:])))

-26 байт @Rod !


2
вы можете заменить floor(l/2)с l//2и ceil(l/2)с , l//2+l%2чтобы сохранить 7 байт, а затем удалить математику импорта, экономя более 18
Rod

1
Также вам не нужно 0на n[0:l//2]и n[l//2+l%2:]могут быть просто n[-(l//2):]. Или вы могли бы переместить //2в l=len(n)//2и использовать n[:l]иn[-l:]
Rod

5
Это также выглядит очень странно, когда ваш импорт не на вершине.
mbomb007

@Rod Я пришел сюда, чтобы изменить все, что вы упомянули в первом комментарии, но был поражен вторым, большое спасибо! :)
Yytsi

@Rod Используя последний совет для второго комментария, однозначные тестовые примеры возвращают значения фальси :(
Yytsi

4

Рубин, 63 байта

->s{e=s.chars*?+
l=s.size
e[l-1-r=l%2,2*r+1]="=="
l<2||eval(e)}

Примечание: аргумент sдолжен быть строкой.

Тестирование (требуется минимум 5+):

require 'minitest/autorun'

class TestRunner < Minitest::Test
  def setup
    @truthy_nums = %w(1 6 11 141 23281453796004414 523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088)
    @falsy_nums = %w(10 110 15421 5234095123508321 6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454)

@f=->s{e=s.chars*?+
l=s.size
e[l-1-r=l%2,2*r+1]="=="
l<2||eval(e)}

  end
  def test_true
    @truthy_nums.each do |e|
      assert @f[e], e
    end
  end
  def test_false
    @falsy_nums.each do |e|
      assert !@f[e], e
    end
  end
end

4

Haskell, 55 байтов

g(h:t)=read[h]-g(reverse t)
g _=0
(==0).g.(<*"xx").show

Рекурсивная функция gразворачивает числовую строку с обоих концов, многократно беря голову, затем переворачивая. Он вычитает рекурсивный результат из головы, который вызывает чередование коэффициентов +1 и -1, с +1, примененным к первой половине и -1 к второй половине.

   g "12345" 
== 1 - g "5432"
== 1 - (5 - g "432")
== 1 - (5 - (4 - g "32"))
== 1 - (5 - (4 - (3 - g "2"))
== 1 - (5 - (4 - (3 - 2))
== 1 + 2 + 3 - 4 - 5

Таким образом, он принимает сумму первой половины минус сумму второй половины. При этом возникает проблема (<*"xx"), заключающаяся в том, что при нечетном количестве цифр центр разрывается по левому краю , но основная функция исправляет это , что удваивает каждый символ, то есть «12345» становится «1122334455». Таким образом, средняя цифра делится равномерно с обеих сторон и удаляется.


3

Retina, 64 44 байта

^((.)*?).?(?=(?<-2>.)*$)
$1 
\d
$*
^(1+) \1$

Попробуйте онлайн

Первый этап разбивает строку в середине, пропуская средний символ, если он есть ( взято и изменено отсюда . С разрешения Мартина.) Затем замените цифры их унарным представлением и сопоставьте, если две половины имеют одинаковую длину.


Почему вы используете группу без захвата в кодовом гольфе? ;) Несмотря на это, в .NET гораздо короче разделить строку на балансирующие группы: retina.tryitonline.net/… (я также пробовал несколько этапов, но в итоге это немного дольше retina.tryitonline.net/… ).
Мартин Эндер

@MartinEnder Да, я знал, что так и будет, но я так и не понял концепцию. И я полагаю, я упустил из виду не захватившую группу.
mbomb007

1
В этом случае все очень просто: мы считаем символы (.)*?(каждая итерация помещает захват в стек 2). Затем мы пытаемся достичь конца, снова выталкивая из стека (?<-2>.)*$(после дополнительной средней цифры). Первый раз, когда это возможно, мы записали ровно половину цифр (округлено в меньшую сторону) в группу 2.
Мартин Эндер,

3

JavaScript (ES6), 74 67 ... 59 50 байт

Рекурсивно суммирует разницу первой и последней цифр, пока не останется меньше двух цифр:

let f =

n=>!(F=n=>n[1]?(n.pop()-n.shift()+F(n)):0)([...n])

// some truthy examples
console.log(f("11"));
console.log(f("141"));
console.log(f("523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088"));

// some falsy examples
console.log(f("12"));
console.log(f("110"));
console.log(f("6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454"));


1
Хорошая техника. Я думаю, что вы можете сделать (s-=i<0?v:-v).
ETHproductions

@ETHproductions - интересно посмотреть, насколько близки методы с и без Math.sign().
Арнаулд

Черт, ты, возможно, избил меня навсегда ... хороший :)
ETHproductions

Я был не прав ;-)
ETHproductions

3

R 105 96 байт

Оказывается, R очень многословен. Принимает ввод как символ.

function(x){y<-as.numeric(unlist(strsplit(x,"")));l<-length(y)%/%2;sum(tail(y,l))==sum(head(y,l))}

Отформатировано красиво:

function(x){
    y=as.numeric(unlist(strsplit(x,"")))
    l=length(y)%/%2
    sum(tail(y,l))==sum(head(y,l))
}

объяснение

  • y<-as.numeric(unlist(strsplit(x,""))) Разбейте вход (string_, и приведите его к вектору вместо списка, а затем превратите его обратно в целые числа).
  • sum(tail(y,: tailпринимает последние n элементов, найденных:
    • length(y)%/%2))где %/%целочисленное деление, чтобы получить потолок частного, где длина нечетная.
  • sum(head(y,length(y)%/%2)): like tail, headберет первые n элементов вектора, найденных таким же образом.

Правки

  • Сохранено семь байтов благодаря Ниаму
  • Переключил =вместо <-, сохранил еще два байта.

Можете ли вы length(y)%/%2как-то связать переменную и использовать ее в вызовах tailи head?
Ними,

@nimi Да, хорошо.
Азор Ахай

85 байтов tio.run/…
Sumner18

объединяя y и l в первую сумму, меняя ее с числового на as.double (), unlist () на el (). Это позволило мне сделать все это в одной строке, убрав скобки, и pryr :: f угадал формалы / переменные из кода
Sumner18

3

Brain-Flak , 410 206 204 178 + 3 = 181 байт

Вот 178-байтовая версия, которая использует -aфлаг.

26 байтов от DJMcMayhem

Попробуйте онлайн

([])(<(()()(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>){({}[()]<({}<>)<>>)}{}([]<>[[]]<>){(<{}{}>)}{}({{}<>[{}]<>}<(())>){{}{}((<>))}{}

Вот более длинная 410-байтовая версия, которая не использует -aфлаг.

Попробуйте онлайн

{(({}))(<((()()()()()){}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}>)<>(<((()()()()()){}(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>)}{}<>([])(<(()()(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>){({}[()]<({}<>)<>>)}{}([]<>[[]]<>){{}{}(<>)}{}(([])<>)({<{}>{}<([])>}{}<>[{<{}>{}<([])>}{}]<(())>){{}{}((<>))}{}

объяснение

Вот объяснение более короткого решения

Для начала число конвертируется во все его значения ASCII с помощью -aфлага.

Мы выдвигаем высоту стека (т.е. количество цифр) и делим на два.

([])(<(()()(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>)

Для каждого числа меньше числа, которое мы только что нажали, мы перемещаем цифру в другой стек

{({}[()]<({}<>)<>>)}{}

Если стеки имеют разную высоту, мы удаляем верхний элемент из текущего стека.

([]<>[[]]<>){(<{}{}>)}{}

Мы хотим разницу между суммами каждого стека. Поэтому мы используем следующий алгоритм для суммирования каждого стека.

{{}}

Это предполагает, что ни одна цифра не имеет значения ASCII, равного нулю, что является допустимым допущением.

Мы запускаем это для обоих стеков и принимаем разницу ( <(())>необходимо для следующей части.

({{}}<>[{{}}]<(())>)

Теперь мы хотим отменить сумму. Если сумма равна нулю, она вытолкнет верхнюю часть, открывая ту, которую мы выдвинули ранее, иначе она удалит и число, и единицу и поместит ноль сверху.

{{}{}((<>))}{}

Зачем использовать ([]){[{}]{}([])}{}для суммирования каждого стека? ({{}})должно работать просто отлично, и, поскольку вы принимаете ASCII-ввод, вам не нужно беспокоиться о том, что 0 разрушит цикл.
DJMcMayhem

@DJMcMayhem Хороший вопрос. Я забыл, что в стеке не может быть нуля
Wheat Wizard,

3

На самом деле 17 16 байт

Этот ответ основан на ответе ElPedro's Python 2 и их идее использовать [-b:]. Предложения по игре в гольф приветствуются. Попробуйте онлайн!

$♂≈;l½L│±aHΣ)tΣ=

Ungolfing

      Implicit input n.
$♂≈   list(str(n)). This converts n to a list of n's digits.
;l    Duplicate the list of digits and get its length. Call it len.
½L    Push len//2.
│     This duplicates the stack.
        Stack: len//2, digit_list, len//2, digit_list
±     Negate the len//2 at TOS for later.
a     Invert the stack.
        Stack: digit_list, len//2, digit_list, -(len//2)
HΣ    Push digit_list[:len//2], then push its sum.
)     Rotate this first sum to BOS.
tΣ    Push digit_list[-(len//2):], then push its sum.
=     Check if those sums are equal.
      Implicit return.

3

Perl 6 ,  42 39  33 байта

{[==] .comb[{^($_/2),Int($_/2)..*}]>>.sum}

Попробуй это

{[==] .comb[^(*/2),(*/2).Int..*]>>.sum}

Попробуй это

{[==] .comb[^*/2,^*/2+*/2]>>.sum}

Проверьте это (от Джо Кинга )

Объяснение:

{ # lambda with implicit parameter 「$_」

  [==]                   # reduce the following using &infix:«==»

    .comb\               # split input into individual characters
    [                    # index into that using:

      # first half of the values (includes middle value)
      # 「(0/2) ..^ (*/2)」
      ^ * / 2,     

      # last half of the values (includes middle value)
      ^ * / 2            # same number of values as first half
        + * / 2          # shifted up by half

    ]\
    >>.sum               # sum each of the two halves separately
}

Кажется, это больше не работает (я подозреваю, что изменение не ..обрабатывает нецелые числа). Как насчет 33 байтов вместо этого
Джо Кинг

2

Javascript, 73 байта

Хорошие старые петли ES5

for(a=c=0,b=(l=(s=prompt()).length)-1;a<~-l/2;c-=s[a++]-s[b--]);alert(!c)

Что тут происходит?

for(
    a=c=0,               // a = left digits of the number
                         // c = the result
    b=                   // b = right digits of number
        (l=              // l = length of number - 1
            (s=prompt()) // s = the number as input from user
        .length)-1; 

    a<~-l/2;             // while a < length of number / 2, rounded down (~-)

    c-=
        s[a++]           // c -= left digit
        -
        s[b--]           // c += right digit (because - and - == +)
 );
                         // for balanced numbers c should be 0
 alert(!c)               // 0 equals false in javascript, so output the opposite of c

2

Python 2, 73 байта

def f(n):x=map(int,str(n));d=len(x)/2;print sum(x[:d])==sum(x[-d:])or d<1

Тесты в идеоне

Мы должны использовать, str()а не ``, так как nможет находиться за пределами диапазона со знаком int.


Ах, вот почему я получил L в конце. +1
ElPedro

2

Python 2, 83 77 байт

g=[int(h)for h in raw_input()];b=int(len(g)/2);print sum(g[:b])==sum(g[-b:])or b==0

РЕДАКТИРОВАТЬ

уменьшено до 77 с помощью @Rod

g=[int(h)for h in raw_input()];b=len(g)/2;print sum(g[:b])==sum(g[-b:])or b<1

Примеры:

D:\>bal.py
1
True

D:\>bal.py
6
True

D:\>bal.py
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
True

D:\>bal.py
10
False

D:\>bal.py
110
False

D:\>bal.py
 6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
False

вы можете использовать map(int,input())вместо этого [int(h)for h in raw_input()], len(g)/2всегда будет int, не нужно конвертировать, и в этом or b==0нет необходимости
Rod

на самом деле b==0это нужно для len=1, но вы можете сократить его доb<1
Род

2

PHP 73 67 60 57 байт

Требуется PHP 7.1 для отрицательных смещений строк:

for(;2*$x<strlen($a=$argn);)$s+=$a[$x++]-$a[-$x];echo!$s;

Бег:

echo 15324 | php -nR 'for(;2*$x<strlen($a=$argn);)$s+=$a[$x++]-$a[-$x];echo!$s;';echo

Предыдущая версия

Примечание: требуется PHP 7 для оператора космического корабля.

for(;$x<$l=strlen($a=$argv[1]);)$s+=(2*$x<=>$l-1)*$a[$x++];echo!$s;

Запустите так:

php -d error_reporting=30709 -r 'for(;$x<$l=strlen($a=$argv[1]);)$s+=(2*$x<=>$l-1)*$a[$x++];echo!$s;' -- 15324;echo

объяснение

Перебирает цифры в номере. Проверяет, принадлежит ли цифра первой половине или второй половине (или является средней цифрой), сравнивая индекс цифры с длиной ввода с помощью комбинированного сравнения ( 2 * $x <=> $l - 1). Затем умножьте это на цифру, возьмите сумму всех цифр. Если это сбалансированное число, сумма будет 0.

Пример с вводом 15324:

  index     0  1  2  3  4 
  digit     1  5  3  2  4

  2*index   0  2  4  6  8
  length-1  4  4  4  4  4
  factor    1  1  0 -1 -1  # Result of the spaceship operator

  result    1  5  0 -2 -4
           --------------
  sum                   0

Tweaks

  • Не устанавливайте цифру в $d, просто повторяйте длину ввода. Сохранено 5 байтов.
  • Для интерпретации PHP смещение строки nullне нужно приводить к intPHP 0. Сохранено 1 байт.
  • Использование отрицательных смещений строки для получения цифр из второй половины и итерация к половине строки. Сохранено 7 байт, но требуется PHP 7.1
  • Сохранено 3 байта с помощью $argn

2

Clojure, 66 64 байта

Обновление: Вынул strиз map intфункции.

(comp #(=(apply +(map -(drop(/(count %)2)%)%))0)#(map int %)str)

Это было бы закорочено, если бы входной формат был более гибким, теперь мне нужно было сначала отобразить целое число в последовательность значений ASCII. Внутреннее mapвычисляет попарные разности значений из двух половинок, и это проверяет, равна ли сумма дельт нулю.

((comp f g h) x y z)= (f (g (h x y z)).

На самом деле это оказалось той же длины, что и простое отображение в a, letи просто определение одной функции.


1

sed (165 + 1 для -r) 166

/^.$/c1
:l;s,^([^!])([^!]*)([^!])!?([^=]*)=?(.*),\2!\4\1=\5\3,;tl;:
s,.?!|0,,;s,2,11,;s,3,21,;s,4,31,;s,5,41,;s,6,51,;s,7,61,
s,8,71,;s,9,81,;t;s,1=1,=,;t;/^=$/c1
c0

Выход:
1 для истинного
0 для ложного

Попробуйте онлайн!


1

Python 2.7, 102 92 байта

Для цикла работает лучше: /

s=`input()`
a,b,l=0,0,len(s)
for i in range(l/2):a=a+int(s[i]);b=b+int(s[l-i-1])
print a==b

Та же идея, просто используйте длину - я, чтобы получить другую сторону. Он никогда не достигнет центра нечетного числа.

Старый код

s=input()
l=len(s)
def n(i):return 0if not i else int(i[0])+n(i[1:])
print n(s[:l/2])==n(s[l/2+l%2:])

Получает ввод
Сохраняет длину ввода.
Рекурсивная функция для получения суммы строки.
Сравните первую половину суммы со второй половиной суммы.

Пытаюсь получить его ниже 100, но это сложно: /


1

Функция С, 74

l;i;t;f(char *n){l=strlen(n);for(t=i=0;i<l/2;)t+=n[i]-n[l-++i];return !t;}

Ideone.


Вы не можете использовать strlen без включения #include"string.h"\n, что добавляет 19 к вашему счету.
Нет ремней безопасности

1
@ NoSeatbelts Да, вы можете - попробуйте ссылку Ideone. Скорее всего, компилятор выдаст вам кучу предупреждений, но в любом случае скомпилирует работающий исполняемый файл (по крайней мере, это делают GCC и Clang). Какой компилятор вы используете? Есть даже совет по гольфу об этом .
Цифровая травма

1
Не нужно места вchar *n
Cyoce

убрать пробелы l;i;t;f(char*n){..return!t;}-2 байта
Khaled.K

1

Ракетка 204 байта

(define(f n)(let*((s(number->string n))(g(λ(x y)(apply +(map(λ(x)(string->number(string x)))
(string->list(substring s x y))))))(l(string-length s))(h(/ l 2)))(if(=(g 0(floor h))(g(ceiling h)l))#t #f)))

Подробная версия:

(define (f1 n)
(let* (  (s (number->string n))
         (g(λ(x y)
              (apply + (map
                        (λ(x)
                          (string->number
                           (string x)))
                        (string->list
                         (substring s x y))))))
         (l (string-length s))
         (h (/ l 2)))
    (if(= (g 0 (floor h)) (g (ceiling h) l)) 
       #t #f  ) ) ) 

Тестирование:

(f 23281453796004414)
(f 523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088)
(f 15421)
(f 5234095123508321)

Выход:

#t
#t
#f
#f


1

Математика, 69

Tr@#[[;;⌊l=Length@#/2⌋]]==Tr@#[[⌈l⌉+1;;]]&@*IntegerDigits

2
Вы можете сохранить пару байтов, изменив конец на...;;]]&@*IntegerDigits
Martin Ender

@MartinEnder спасибо, но как это работает?
Shrx

@*это сокращение от Composition. f@*gесть f[g[##]]&.
Мартин Эндер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.