Це збалансоване число?


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?
Erik the Outgolfer

@EriktheOutgolfer: Ëбула повернена інша команда, коли цей виклик був зроблений, так, на жаль, ні.
Емінья

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

Один байт збережено завдяки німі


Чи не потрібні фрагменти в дужках?
Майкл Клейн

@ michael-klein Ні, неназвана функція дозволена. meta.codegolf.stackexchange.com/a/7615/20260
Дамієн

1
Один байт для збереження:b(a:t@(r:s))=a-last t+b(init t);b _=0
nimi

@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

Математика, 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 Nope; що повертає булевий (примусовий до 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?
Digital Trauma

Префіксація оператора приросту повинна зробити трюк і зберегти 2 байти, але в C # повернене значення повинно бути булевим, тому! R не буде його скорочувати. Дякую, я якнайшвидше оновлю свою відповідь.
adrianmp

4

Пітон 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
Пд

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

Хаскелл, 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

Сітківка, 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,""))) Розділіть вхід (рядок_ і примусьте його до вектора замість списку, а потім перетворіть його назад на цілі числа.
  • sum(tail(y,: tailбере останні n елементів, знайдених:
    • length(y)%/%2)), де %/%ціле ділення, щоб отримати стелю частника, де довжина непарна.
  • sum(head(y,length(y)%/%2)): як tail, headприймає перші n елементів вектора, знайдені таким же чином.

Правки

  • Збережено сім байт завдяки ніаму
  • Переключено на, =а <-збережено ще два байти.

Чи можете ви length(y)%/%2якось прив’язати до змінної і використовувати це в межах викликів tailта head?
німі

@nimi О так, хороший момент.
Azor Ahai

85 байт tio.run/…
Sumner18

консолідувавши y і l в першу суму, змінивши як. числовий на as.double (), unlist () на el (). Це дозволило мені зробити все це в один рядок, видаляючи дужки, і pryr :: f відгадує формали / змінні з коду
Sumner18

3

Мозг-Флак , 410 206 204 178 + 3 = 181 байт

Ось версія 178 байт, яка використовує -aпрапор.

26 байтів, у яких відіграв DJMcMayhem

Спробуйте в Інтернеті

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

Ось довша версія 410 байт, яка не використовує -aпрапор.

Спробуйте в Інтернеті

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

Пояснення

Ось пояснення коротшого рішення

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

Висуваємо висоту стека (тобто кількість цифр) і ділимо на дві.

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

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

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

Якщо стеки мають різну висоту, ми видаляємо верхній елемент із поточного стеку

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

Ми хочемо, щоб різниця між сумами кожної групи. Тому ми використовуємо наступний алгоритм для підсумовування кожного стека.

{{}}

Це передбачає, що жодна цифра не має значення нуля ASCII, що є правильним припущенням.

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

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

Зараз ми хочемо заперечити суму. Якщо сума дорівнює нулю, вона спливе зверху, виявляючи ту, яку ми натиснули раніше, інакше вона видалить і число, і одне, а нуль поставить зверху.

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

Навіщо використовувати ([]){[{}]{}([])}{}для підсумовування кожного стека? ({{}})має працювати просто чудово, і оскільки ви приймаєте ASCII вхід, вам не доведеться турбуватися про те, що 0 зруйнує цикл.
DJMcMayhem

@DJMcMayhem Добре. Я забув, що на стеку не може бути нуля
Wheat Wizard

3

Власне, 17 16 байт

Ця відповідь натхненна відповіддю ElPedro 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

Тести у ideone

Ми повинні використовувати, 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

EDIT

зменшено до 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
Rod

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

Налаштування

  • Не встановлюйте цифру $d, а лише повторіть довжину введення. Збережено 5 байт.
  • Зміна змісту рядків 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

Пітон 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

C функція, 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;}

Ідеон.


Ви не можете використовувати strlen без включення #include"string.h"\n, що додає 19 до вашої оцінки.
NoSeatbelts

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
Мартін Ендер

@MartinEnder дякую, але як це працює?
shrx

@*короткий для Composition. f@*gє f[g[##]]&.
Мартін Ендер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.