Czy to liczba zrównoważona?


38

Liczba jest zrównoważona, jeśli suma cyfr na każdej połowie liczby jest równa, więc: 1423jest zrównoważone, ponieważ 1+4 = 2+3tak jest: 42615ponieważ 4+2=1+5. Zauważ, że środkowa cyfra nie jest uwzględniona po obu stronach (lub po obu stronach), jeśli występuje nieparzysta liczba cyfr.

Wyzwanie:

Weź jako liczbę całkowitą dodatnią i wyślij prawdziwą wartość, jeśli jest zbalansowana, i wartość fałsz, jeśli jest niezrównoważona.

Przypadki testowe (prawda)

1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088

Przypadki testowe (fałsz)

10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454

Nie będzie numery zaczynające się od zera, na przykład 00032zamiast 32. Musisz obsługiwać liczby do co najmniej 100 cyfr (tak większe niż 2^64-1). Jak zawsze, opcjonalny format wejściowy, więc w razie potrzeby możesz otoczyć liczbę apostrofami.

Odpowiedzi:


12

05AB1E , 14 7 bajtów

€D2äO`Q

Wyjaśnienie

Na przykładzie 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)

Wypróbuj online!


Nie możesz użyć Ëzamiast `Q?
Erik the Outgolfer,

@EriktheOutgolfer: Ëbyło innym poleceniem, kiedy podjęto to wyzwanie, więc niestety nie.
Emigna

10

> <> , 31 29 bajtów

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

Wypróbuj online!

Wiersz 1: standardowa pętla wejściowa

Wiersz 2: Odrzuć -1 na stosie, popchnij dwa zera i obróć jeden na dół stosu (zapewnia to, że dane wejściowe o długości <3 nie wyczerpią stosu później w programie)

Linia 3: Jeśli długość stosu wynosi> 3, dodaj dwa górne i dolne dwa elementy stosu razem.

Wiersz 4: Jeśli górna i dolna część stosu są równe, wypisz 1, 0 w przeciwnym razie.

Edycja: zdałem sobie sprawę, że nie trzeba brać znaków mod 12, zapisane 2 bajty



5

Brachylog , 20 bajtów

@eL@2tM,Lr@2t:M:+a#=

Wypróbuj online!

Wyjaśnienie

@eL                    Get the list of digits L of the input
  L@2tM,               Get the second half M of L
        Lr@2t          Get the second half of the reverse of L
             :M        The list [L, M]
               :+a#=   The sum of elements of L and the sum of elements of M must be equal

5

Java, 85 bajtów

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

Uwaga: dane wejściowe są podane, ponieważ StringJava nie może się bez nich obejść BigInteger(i BigIntegersą tworzone przy użyciu ... String)

Testowanie i niestosowanie:

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);
    }
  }
}

Niezła odpowiedź. Można zapisać 2 bajty poprzez pętli for pusty: for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));.
todeale

@todeale Spójrz na kod do gry w golfa, a nie bez golfa. Myślę, że twoja sugestia i moja gra w golfa wykorzystują tę samą ilość bajtów
Olivier Grégoire

Ups! Teraz widzę.
todeale

5

Mathematica, 57 bajtów

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

Wyjaśnienie

Naprawdę miałem nadzieję, że uda mi się zastosować to podejście w jakimś języku i wydaje się, że w Mathematica radzi sobie całkiem dobrze. Chodzi o to, aby uniknąć konieczności uzyskania zarówno przedniej, jak i tylnej połowy, łącząc listę z jej odwrotnością i patrząc tylko na przednią połowę.

...&@*IntegerDigits

Najpierw przekształcamy dane wejściowe w listę cyfr dziesiętnych i przekazujemy wynik do nienazwanej funkcji po lewej stronie.

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

Teraz odejmujemy odwrotność listy od samej listy. Jeśli cyfry są, to wynik będzie .{a1,a2,...,an}{a1-an,a2-an-1,...,an-a1}

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

Wyodrębniamy pierwszą połowę tej listy (wyłączając środkową cyfrę, chociaż to tak naprawdę nie ma znaczenia, ponieważ odpowiednia różnica i 0tak będzie ).

Tr@...

A następnie podsumowujemy tę listę. To jest:

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

Zmiana układu:

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

Wejście jest zrównoważone, jeśli dwie połówki mają tę samą sumę. Dlatego wyrażenie to wynosi zero, jeśli wejście jest zbalansowane. Więc to sprawdzamy:

...==0

5

JavaScript (ES6), 59 55 51 44 42 bajtów

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

Okazuje się, że całkowicie używałem niewłaściwej strategii. Ta wersja rekurencyjnie znajduje sumę pierwszej połowy minus sumę drugiej połowy, a następnie zwraca logiczne NIE wyniku.

Gdybyśmy mogli zwrócić fałsz zamiast prawdy i odwrotnie, byłoby to 35 bajtów:

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

Testowy fragment kodu


Naprawdę to lubię n[i*2]! Niezłe.
Arnauld,

@Arnauld Dzięki :-) Znalazłem teraz zupełnie inne podejście, które wcale tego nie potrzebuje ...
ETHproductions

To wspaniale!
Arnauld,

Nie można używać f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)?
mbomb007,

@ mbomb007 Nope; to zwróci wartość logiczną (wymuszoną do 0 lub 1) po każdej rekurencji, a nie sumę.
ETHprodukcje

4

PowerShell v2 +, 85 bajtów

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

Pobiera dane wejściowe $ajako ciąg znaków (niezbędny do obsługi liczb >2^64-1bez wchodzenia w wyjątkowo niezgrabne [biginteger]rzucanie w wierszu poleceń).

Dla wyjaśnienia załóżmy, że wprowadzamy '1423'. Następnie tworzymy nowy ciąg. Dwie kromki tablicy są oczywiste ( $a[...]), i który jest otoczony trzema dodatkowymi strunami (, 0)-(i 0), formułując szereg chars i strings. Zwróć uwagę ,na przód, aby wymusić konkatenację macierzy, a nie konkatenację łańcuchów.

Cała tablica jest -joinedytowana razem +, w wyniku czego powstaje ciąg znaków podobny (+1+4+0)-(+2+3+0)i widać, że 0s są potrzebne, aby zapobiec błędom składni. Jest to uwzględnione |iex(skrót Invoke-Expressioni podobne do eval), które obliczy wynik matematyczny. Tak długo, jak ciąg jest zrównoważony, otrzymasz 0jako wynik, który zamykamy w parens i bierzemy wartość logiczną, a nie !(...)wynik True. Jeśli jest to niezerowa liczba całkowita, zostanie wyprowadzona False.

Przypadki testowe

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 bajtów

Obejmuje +5 za -lpF

Podaj numer na STDIN

balanced.pl <<< 1423

balanced.pl:

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

4

C #, 83 bajty

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;};

Wypróbuj online!

Pełne źródło, w tym przypadek testowy:

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
        }
    }
}

Typ danych BigInteger dopuszcza dowolną długość liczb. Jeśli liczba jest zbyt duża, kompilator narzeka ( błąd CS1021: Stała całkowania jest zbyt duża ), dlatego zamiast niej użyto metody BigInteger.Parse (String) .

Rozwiązanie można w rzeczywistości zmniejszyć do 72 bajtów, biorąc pod uwagę, że dane wejściowe to ciąg znaków (i odpowiednio aktualizuje program):

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

1
Nic dziwnego, że moja odpowiedź c wyglądała dość podobnie do tej. Czy możesz to zrobić t[l-++i]zamiast t[l-1-i++]i return !rzamiast return r==0?
Cyfrowa trauma

Prefiks operatora inkrementacji powinien załatwić sprawę i zaoszczędzić 2 bajty, ale w C # zwracana wartość musi być wartością logiczną, więc! R nie będzie go wycinać. Dzięki, zaktualizuję moją odpowiedź tak szybko, jak to możliwe.
adrianmp

4

Python 3, 107 102 76 bajtów

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

-26 bajtów autorstwa @Rod !


2
można zastąpić floor(l/2)z l//2i ceil(l/2)z l//2+l%2zaoszczędzić 7 bajtów, a następnie usunąć import matematyki, oszczędzając więcej 18
Rod

1
także nie potrzebujesz 0włączonego n[0:l//2]i możesz n[l//2+l%2:]po prostu być n[-(l//2):]. Czy można przenieść //2do l=len(n)//2i korzystania n[:l]in[-l:]
Rod

5
Wygląda również naprawdę dziwnie, gdy import nie jest na górze.
mbomb007,

@Rod Przyjechałem tutaj, aby zmienić wszystkie rzeczy, o których wspomniałeś w pierwszym komentarzu, ale byłem zaskoczony drugim, wielkie dzięki! :)
Yytsi

@Rod Korzystając z ostatniej wskazówki dotyczącej drugiego komentarza, jednocyfrowe przypadki testowe zwracają wartości falsey :(
Yytsi

4

Rubinowy, 63 bajty

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

Uwaga: arg smusi być ciągiem.

Testowanie (wymagany minimalny test 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 bajtów

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

Funkcja rekurencyjna grozpakowuje ciąg liczbowy z obu końców, wielokrotnie podnosząc głowę, a następnie cofając. Odejmuje wynik rekurencyjny od głowy, co powoduje naprzemienne współczynniki +1 i -1, przy czym +1 stosuje się do pierwszej połowy, a -1 do drugiej połowy.

   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

Tak więc bierze sumę pierwszej połowy minus suma drugiej połowy. Ma to problem polegający na tym, że przy nieparzystej liczbie cyfr środkowe (<*"xx")krawaty łączą się w lewo, ale główna funkcja naprawia to , podwajając każdy znak, tj. „12345” staje się „1122334455”. W ten sposób środkowa cyfra dzieli się równo po obu stronach i kasuje.


3

Retina, 64 44 bajty

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

Wypróbuj online

Pierwszy etap dzieli łańcuch na środku, pomijając środkowy znak, jeśli taki istnieje ( wzięty i zmodyfikowany stąd . Dzięki uprzejmości Martina.) Następnie zamień cyfry na ich jednoznaczną reprezentację i dopasuj, jeśli dwie połówki są równej długości.


Dlaczego miałbyś używać grupy, która nie zdobywa w golfie kodowym? ;) Niezależnie od tego, w .NET jest znacznie krócej, aby podzielić ciąg z grupami równoważącymi: retina.tryitonline.net/... (Próbowałem również wielu etapów, ale kończy się to nieco dłużej retina.tryitonline.net/... ).
Martin Ender

@MartinEnder Tak, wiedziałem, że tak będzie, ale tak naprawdę nigdy nie zrozumiałem tej koncepcji. Przypuszczam, że przeoczyłem grupę, która nie schwytała.
mbomb007,

1
W tym przypadku jest to naprawdę proste: liczymy postacie (.)*?(każda iteracja wypycha przechwytywanie na stos 2). Następnie staramy się dotrzeć do końca, ponownie wyskakując ze stosu (?<-2>.)*$(po opcjonalnej środkowej cyfrze). Po raz pierwszy jest to możliwe, gdy przechwycimy dokładnie połowę cyfr (w zaokrągleniu w dół) do grupy 2.
Martin Ender

3

JavaScript (ES6), 74 67 ... 59 50 bajtów

Rekurencyjnie sumuje różnicę pierwszej i ostatniej cyfry, aż pozostaną mniej niż dwie cyfry:

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
Niezła technika. Myślę, że możesz (s-=i<0?v:-v).
ETHprodukcje

@ETHproductions - Interesujące, aby zobaczyć, jak blisko są metody zi bez Math.sign()nich.
Arnauld,

Cholera, mogłeś mnie pokonać na dobre ... fajnie :)
ETHproductions

Myliłem się ;-)
ETHproductions

3

R 105 105 bajtów

Okazuje się, że R jest bardzo gadatliwy. Pobiera dane wejściowe jako znak.

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

Ładnie sformatowane:

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

Wyjaśnienie

  • y<-as.numeric(unlist(strsplit(x,""))) Podziel dane wejściowe (string_ i wymusz je na wektorze zamiast na liście, a następnie zamień z powrotem na liczby całkowite.
  • sum(tail(y,: tailpobiera ostatnie n elementów, znalezionych przez:
    • length(y)%/%2)), gdzie %/%jest dzielenie liczb całkowitych, aby uzyskać pułap ilorazu, gdzie długość jest nieparzysta.
  • sum(head(y,length(y)%/%2)): like tail, headbierze pierwsze n elementów wektora, znalezionych w ten sam sposób.

Edycje

  • Oszczędność siedmiu bajtów dzięki Niam
  • Przełączono na =zamiast <-, zapisano kolejne dwa bajty.

Czy możesz w length(y)%/%2jakiś sposób powiązać zmienną i użyć jej w wywołaniach taili head?
nimi

@nimi O tak, dobra uwaga.
Azor Ahai,

85 bajtów tio.run/…
Sumner18

konsolidując y i l do pierwszej sumy, zmieniając as.numeric na as.double (), unlist () na el (). Pozwoliło mi to zrobić to wszystko w jednym wierszu, usuwając nawiasy klamrowe, a pryr :: f zgaduje formals / zmienne z kodu
Sumner18

3

Brain-Flak , 410 206 204 178 + 3 = 181 bajtów

Oto 178-bajtowa wersja korzystająca z -aflagi.

26 bajtów odegranych przez DJMcMayhem

Wypróbuj online

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

Oto dłuższa 410-bajtowa wersja, która nie używa -aflagi.

Wypróbuj online

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

Wyjaśnienie

Oto wyjaśnienie krótszego rozwiązania

Aby rozpocząć, liczba jest konwertowana na wszystkie wartości ASCII przez -aflagę.

Pchamy wysokość stosu (tj. Liczbę cyfr) i dzielimy przez dwa.

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

Dla każdej liczby mniejszej niż liczba, którą właśnie wypchnęliśmy, przenosimy cyfrę na drugi stos

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

Jeśli stosy mają różne wysokości, usuwamy górny przedmiot z bieżącego stosu

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

Chcemy różnicy między sumami każdego stosu. Dlatego używamy następującego algorytmu do sumowania każdego stosu.

{{}}

Zakłada się, że żadna cyfra nie ma wartości ASCII równej zero, co jest prawidłowym założeniem.

Sprawdzamy to dla obu stosów i przyjmujemy różnicę ( <(())>jest to konieczne do następnej części.

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

Teraz chcemy negować tę sumę. Jeśli suma wynosi zero, wyskoczy na wierzch, odsłaniając tę, którą wypchnęliśmy wcześniej, w przeciwnym razie usunie zarówno liczbę, jak i jedną i umieści zero na górze.

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

Dlaczego warto ([]){[{}]{}([])}{}sumować każdy stos? ({{}})powinno działać dobrze, a ponieważ pobierasz dane ASCII, nie musisz się martwić, że 0 zepsuje pętlę.
DJMcMayhem

@DJMcMayhem Dobra uwaga. Zapomniałem, że na stosie nie może być zera
Wheat Wizard

3

Właściwie 17 16 bajtów

Ta odpowiedź jest inspirowana odpowiedzią ElPedro na Python 2 i ich pomysłem użycia [-b:]. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

$♂≈;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 bajtów

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

Sprawdź to

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

Sprawdź to

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

Przetestuj (od Jo King )

Wyjaśnienie:

{ # 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
}

Wydaje się, że to już nie działa (podejrzewam zmianę w sposobie ..obsługi liczb całkowitych). Może zamiast tego około 33 bajtów
Jo King

2

JavaScript, 73 bajty

Dobre stare pętle ES5

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

Co tu się dzieje?

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 bajty

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

Testy są w idealnym stanie

Musimy używać str()zamiast ``, ponieważ nmoże być poza zakresem podpisanych int.


Ach, dlatego właśnie dostałem L na końcu. +1
ElPedro

2

Python 2, 83 77 bajtów

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

EDYTOWAĆ

zredukowane do 77 przy pomocy @Rod

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

Przykłady:

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

możesz użyć map(int,input())zamiast tego [int(h)for h in raw_input()], len(g)/2zawsze będzie int, nie trzeba konwertować i or b==0nie jest to naprawdę konieczne
Rod

w rzeczywistości b==0jest to potrzebne len=1, ale można go skrócić dob<1
Rod

2

PHP, 73 67 60 57 bajtów

Wymaga PHP 7.1 dla przesunięć ciągów ujemnych:

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

Biegać:

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

Poprzednia wersja

Uwaga: wymaga PHP 7 dla operatora statku kosmicznego.

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

Uruchom tak:

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

Wyjaśnienie

Iteruje po cyfrach liczby. Sprawdza, czy cyfra należy do pierwszej połowy, czy do drugiej połowy (lub jest cyfrą środkową), porównując indeks cyfry z długością wejścia z połączonym porównaniem ( 2 * $x <=> $l - 1). Następnie pomnóż to przez cyfrę, weź sumę wszystkich cyfr. Jeśli jest to liczba zrównoważona, suma będzie 0.

Przykład z wejściem 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

Poprawki

  • Nie ustawiaj cyfry na $d, po prostu iteruj długość wejścia. Zapisano 5 bajtów.
  • Przesunięcie łańcucha nullnie musi być rzutowane intna PHP, aby interpretować to jako 0. Zapisano 1 bajt.
  • Użycie ujemnych przesunięć łańcucha w celu uzyskania cyfr z drugiej połowy i iteracji do połowy łańcucha. Zapisano 7 bajtów, ale wymaga PHP 7.1
  • Zaoszczędzono 3 bajty $argn

2

Clojure, 66 64 bajtów

Aktualizacja: wyjęta strz map intfunkcji.

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

Byłoby to zwarte, gdyby format wejściowy był bardziej elastyczny, teraz musiałem najpierw odwzorować liczbę całkowitą na sekwencję wartości ASCII. Wewnętrzne mapoblicza parami różnice wartości z dwóch połówek, a to sprawdza, czy suma delt wynosi zero.

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

W rzeczywistości skończyło się to taką samą długością, jak po prostu mapowanie wewnątrz leti po prostu zdefiniowanie pojedynczej funkcji.


1

sed (165 + 1 dla -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

Wyjście:
1 dla prawdy
0 dla fałszu

Wypróbuj online!


1

Python 2.7, 102 92 bajty

Dla pętli działa lepiej: /

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

Ten sam pomysł, wystarczy użyć długości - i dostać drugą stronę. Nigdy nie osiągnie centrum liczby nieparzystej.

Stary kod

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:])

Pobiera dane wejściowe
Zapisuje długość danych wejściowych
Funkcja rekurencyjna, aby uzyskać sumę ciągu
Porównać sumę pierwszej połowy z sumą drugiej połowy

Próbuję uzyskać go poniżej 100, ale jest to trudne: /


1

Funkcja 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;}

Ideone.


Nie możesz użyć strlen bez uwzględnienia #include"string.h"\n, co dodaje 19 do twojego wyniku.
NoSeatbelts 30.09.16

1
@NoSeatbelts Tak, możesz - wypróbuj link Ideone. Kompilator najprawdopodobniej dostarczy ci kilka ostrzeżeń, ale i tak skompiluje działający plik wykonywalny (przynajmniej GCC i Clang). Z jakiego kompilatora korzystasz? Jest nawet wskazówka na ten temat .
Cyfrowa trauma

1
Przestrzeń nie jest potrzebnachar *n
Cyoce

usuń spacje l;i;t;f(char*n){..return!t;}-2 bajty
Khaled.K

1

Rakieta 204 bajty

(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)))

Wersja szczegółowa:

(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  ) ) ) 

Testowanie:

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

Wydajność:

#t
#t
#f
#f


1

Mathematica, 69

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

2
Możesz zaoszczędzić kilka bajtów, zmieniając koniec na...;;]]&@*IntegerDigits
Martin Ender

@MartinEnder dzięki, ale jak to działa?
shrx

@*jest skrótem od Composition. f@*gjest f[g[##]]&.
Martin Ender
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.