Liczba jest zrównoważona, jeśli suma cyfr na każdej połowie liczby jest równa, więc: 1423
jest zrównoważone, ponieważ 1+4 = 2+3
tak jest: 42615
ponieważ 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 00032
zamiast 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.
Ë
zamiast`Q
?Ë
było innym poleceniem, kiedy podjęto to wyzwanie, więc niestety nie.> <> ,
3129 bajtówWypró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
źródło
Haskell,
6463 bajtówOne Byte Saved dzięki nim
źródło
b(a:t@(r:s))=a-last t+b(init t);b _=0
Brachylog , 20 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Java, 85 bajtów
Uwaga: dane wejściowe są podane, ponieważ
String
Java nie może się bez nich obejśćBigInteger
(iBigInteger
są tworzone przy użyciu ...String
)Testowanie i niestosowanie:
źródło
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 bajtów
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ę.
Najpierw przekształcamy dane wejściowe w listę cyfr dziesiętnych i przekazujemy wynik do nienazwanej funkcji po lewej stronie.
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}
Wyodrębniamy pierwszą połowę tej listy (wyłączając środkową cyfrę, chociaż to tak naprawdę nie ma znaczenia, ponieważ odpowiednia różnica i
0
tak będzie ).A następnie podsumowujemy tę listę. To jest:
Zmiana układu:
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:
źródło
JavaScript (ES6),
5955514442 bajtówOkazuje 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:
Testowy fragment kodu
Pokaż fragment kodu
źródło
n[i*2]
! Niezłe.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 bajtów
Pobiera dane wejściowe
$a
jako ciąg znaków (niezbędny do obsługi liczb>2^64-1
bez 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)-(
i0)
, formułując szeregchar
s istring
s. Zwróć uwagę,
na przód, aby wymusić konkatenację macierzy, a nie konkatenację łańcuchów.Cała tablica jest
-join
edytowana razem+
, w wyniku czego powstaje ciąg znaków podobny(+1+4+0)-(+2+3+0)
i widać, że0
s są potrzebne, aby zapobiec błędom składni. Jest to uwzględnione|iex
(skrótInvoke-Expression
i podobne doeval
), które obliczy wynik matematyczny. Tak długo, jak ciąg jest zrównoważony, otrzymasz0
jako wynik, który zamykamy w parens i bierzemy wartość logiczną, a nie!(...)
wynikTrue
. Jeśli jest to niezerowa liczba całkowita, zostanie wyprowadzonaFalse
.Przypadki testowe
źródło
Perl, 29 bajtów
Obejmuje +5 za
-lpF
Podaj numer na STDIN
balanced.pl
:źródło
C #, 83 bajty
Wypróbuj online!
Pełne źródło, w tym przypadek testowy:
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):
źródło
t[l-++i]
zamiastt[l-1-i++]
ireturn !r
zamiastreturn r==0
?Python 3,
10710276 bajtów-26 bajtów autorstwa @Rod !
źródło
floor(l/2)
zl//2
iceil(l/2)
zl//2+l%2
zaoszczędzić 7 bajtów, a następnie usunąć import matematyki, oszczędzając więcej 180
włączonegon[0:l//2]
i możeszn[l//2+l%2:]
po prostu byćn[-(l//2):]
. Czy można przenieść//2
dol=len(n)//2
i korzystanian[:l]
in[-l:]
Rubinowy, 63 bajty
Uwaga: arg
s
musi być ciągiem.Testowanie (wymagany minimalny test 5+):
źródło
Haskell, 55 bajtów
Funkcja rekurencyjna
g
rozpakowuje 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.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.źródło
Retina,
6444 bajtyWypró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.źródło
(.)*?
(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.JavaScript (ES6),
7467...5950 bajtówRekurencyjnie sumuje różnicę pierwszej i ostatniej cyfry, aż pozostaną mniej niż dwie cyfry:
źródło
(s-=i<0?v:-v)
.Math.sign()
nich.R
105 105bajtówOkazuje się, że R jest bardzo gadatliwy. Pobiera dane wejściowe jako znak.
Ładnie sformatowane:
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,
:tail
pobiera 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))
: liketail
,head
bierze pierwsze n elementów wektora, znalezionych w ten sam sposób.Edycje
=
zamiast<-
, zapisano kolejne dwa bajty.źródło
length(y)%/%2
jakiś sposób powiązać zmienną i użyć jej w wywołaniachtail
ihead
?Brain-Flak ,
410206204178 + 3 = 181 bajtówOto 178-bajtowa wersja korzystająca z
-a
flagi.26 bajtów odegranych przez DJMcMayhem
Wypróbuj online
Oto dłuższa 410-bajtowa wersja, która nie używa
-a
flagi.Wypróbuj online
Wyjaśnienie
Oto wyjaśnienie krótszego rozwiązania
Aby rozpocząć, liczba jest konwertowana na wszystkie wartości ASCII przez
-a
flagę.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.
źródło
([]){[{}]{}([])}{}
sumować każdy stos?({{}})
powinno działać dobrze, a ponieważ pobierasz dane ASCII, nie musisz się martwić, że 0 zepsuje pętlę.Właściwie
1716 bajtówTa 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!Ungolfing
źródło
Perl 6 ,
42 3933 bajtówSprawdź to
Sprawdź to
Przetestuj (od Jo King )
Wyjaśnienie:
źródło
..
obsługi liczb całkowitych). Może zamiast tego około 33 bajtówJavaScript, 73 bajty
Dobre stare pętle ES5
Co tu się dzieje?
źródło
Python 2, 73 bajty
Testy są w idealnym stanie
Musimy używać
str()
zamiast ``, ponieważn
może być poza zakresem podpisanych int.źródło
Python 2,
8377 bajtówEDYTOWAĆ
zredukowane do 77 przy pomocy @Rod
Przykłady:
źródło
map(int,input())
zamiast tego[int(h)for h in raw_input()]
,len(g)/2
zawsze będzie int, nie trzeba konwertować ior b==0
nie jest to naprawdę konieczneb==0
jest to potrzebnelen=1
, ale można go skrócić dob<1
PHP,
73676057 bajtówWymaga PHP 7.1 dla przesunięć ciągów ujemnych:
Biegać:
Poprzednia wersja
Uwaga: wymaga PHP 7 dla operatora statku kosmicznego.
Uruchom tak:
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ędzie0
.Przykład z wejściem
15324
:Poprawki
$d
, po prostu iteruj długość wejścia. Zapisano 5 bajtów.null
nie musi być rzutowaneint
na PHP, aby interpretować to jako0
. Zapisano 1 bajt.$argn
źródło
Clojure,
6664 bajtówAktualizacja: wyjęta
str
zmap int
funkcji.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
map
oblicza 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
let
i po prostu zdefiniowanie pojedynczej funkcji.źródło
sed (165 + 1 dla -r) 166
Wyjście:
1 dla prawdy
0 dla fałszu
Wypróbuj online!
źródło
Python 2.7,
10292 bajtyDla pętli działa lepiej: /
Ten sam pomysł, wystarczy użyć długości - i dostać drugą stronę. Nigdy nie osiągnie centrum liczby nieparzystej.
Stary kod
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: /
źródło
Funkcja C, 74
Ideone.
źródło
#include"string.h"\n
, co dodaje 19 do twojego wyniku.char *n
l;i;t;f(char*n){..return!t;}
-2 bajtyRakieta 204 bajty
Wersja szczegółowa:
Testowanie:
Wydajność:
źródło
Pyke, 20 bajtów
Wypróbuj tutaj!
źródło
not [0]
było 0 nie 1Mathematica, 69
źródło
...;;]]&@*IntegerDigits
@*
jest skrótem odComposition
.f@*g
jestf[g[##]]&
.