Un nombre est équilibré si la somme des chiffres de chaque moitié du nombre est égale. Ainsi: 1423
est équilibré parce que 1+4 = 2+3
, ainsi est: 42615
parce que 4+2=1+5
. Notez que le chiffre du milieu n'est inclus ni d'un côté ni de l'autre s'il existe un nombre impair de chiffres.
Défi:
Prenez un entier positif en entrée et indiquez une valeur de vérité si elle est équilibrée et une valeur de fausseté si elle est déséquilibrée.
Cas de test (true)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Cas de test (faux)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
Il n'y aura pas de nombres commençant par zéro, par exemple 00032
au lieu de 32
. Vous devez prendre en charge des nombres d'au moins 100 chiffres (plus grands que 2^64-1
). Comme toujours, le format d’entrée facultatif vous permet d’entourer le nombre d’apostrophes si vous le souhaitez.
Ë
au lieu de`Q
?Ë
commande était différente lorsque ce défi a été lancé, alors malheureusement pas.> <> ,
3129 octetsEssayez-le en ligne!
Ligne 1: boucle d'entrée standard
Ligne 2: Jeter le -1 en haut de la pile, appuyer sur deux 0 et faire pivoter l’un vers le bas de la pile (ceci garantit que les entrées de longueur <3 n’épuisent pas la pile plus tard dans le programme)
Ligne 3: Si la longueur de la pile est> 3, additionnez les deux éléments du haut et du bas.
Ligne 4: Si le haut et le bas de la pile sont égaux, donnez 1, sinon 0.
Edit: réalisé qu'il n'y a pas besoin de prendre les caractères mod 12, 2 octets enregistrés
la source
Haskell,
6463 octetsUn octet enregistré grâce à nimi
la source
b(a:t@(r:s))=a-last t+b(init t);b _=0
Brachylog , 20 octets
Essayez-le en ligne!
Explication
la source
Java, 85 octets
Remarque: l'entrée est donnée sous la forme
String
que Java ne peut pas gérer sansBigInteger
(etBigInteger
s sont construits à l'aide de ....String
)Essais et non-golfés:
la source
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 octets
Explication
J'espérais vraiment pouvoir utiliser cette approche dans certaines langues, et cela semble bien se passer dans Mathematica. L'idée est d'éviter d'avoir à obtenir à la fois la moitié avant et la moitié arrière en combinant la liste avec son envers et en ne regardant que la moitié avant.
Tout d'abord, nous transformons l'entrée en une liste de chiffres décimaux et passons le résultat à la fonction non nommée de gauche.
Maintenant, nous soustrayons l'inverse de la liste de la liste elle-même. Si les chiffres sont alors le résultat sera .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Nous extrayons la première moitié de cette liste (en excluant le chiffre du milieu, bien que cela n’importe vraiment pas, car la différence correspondante sera de
0
toute façon).Et puis on résume cette liste. Donc, c'est:
Réarrangement:
L'entrée est équilibrée si les deux moitiés ont la même somme. Par conséquent, cette expression est égale à zéro si l'entrée est équilibrée. Donc c'est ce que nous vérifions:
la source
JavaScript (ES6),
5955514442 octetsIl s'avère que j'utilisais entièrement la mauvaise stratégie. Cette version trouve récursivement la somme de la première moitié moins la somme de la seconde moitié, puis renvoie le NON logique du résultat.
Si nous pouvions retourner la fausseté à la place de la vérité et vice-versa, ce serait 35 octets:
Extrait de test
Afficher l'extrait de code
la source
n[i*2]
! Joli.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 octets
Prend les entrées
$a
sous forme de chaîne (nécessaire pour prendre en charge les nombres>2^64-1
sans entrer dans une[biginteger]
distribution extrêmement maladroite sur la ligne de commande).Pour l'explication, supposons l'entrée de
'1423'
. Nous construisons ensuite une nouvelle chaîne. Les deux tranches de tableau sont évidentes ($a[...]
), et qui est entouré de trois chaînes supplémentaires(
,0)-(
et0)
, la formulation d' un tableau dechar
s etstring
s. Notez le,
début pour appliquer la concaténation de tableau, pas la concaténation de chaîne.Ce tableau entier est
-join
édité avec+
, ce qui donne une chaîne semblable à(+1+4+0)-(+2+3+0)
, et vous pouvez voir que les0
s sont nécessaires pour éviter les erreurs de syntaxe. C'est introduit dans|iex
(court pourInvoke-Expression
et similaire àeval
), qui calculera le résultat mathématique. Tant que la chaîne est équilibrée, vous obtenez0
une sortie, que nous encapsulons dans des entre parenthèses et prenons le booléen-not de celle-ci!(...)
, à la sortieTrue
. S'il s'agit d'un entier non nul, il sera affichéFalse
.Cas de test
la source
Perl, 29 octets
Comprend +5 pour
-lpF
Donner un numéro sur STDIN
balanced.pl
:la source
C #, 83 octets
Essayez-le en ligne!
Source complète, incluant le cas de test:
Le type de données BigInteger autorise toute longueur de nombre. Si le nombre est trop grand, le compilateur se plaint ( erreur CS1021: la constante intégrale est trop grande ). La méthode BigInteger.Parse (String) est donc utilisée à la place.
La solution peut en réalité être réduite à 72 octets en considérant que l'entrée est une chaîne (et met à jour le programme en conséquence):
la source
t[l-++i]
au lieu det[l-1-i++]
, etreturn !r
au lieu dereturn r==0
?Python 3,
10710276 octets-26 octets par @Rod !
la source
floor(l/2)
parl//2
etceil(l/2)
avecl//2+l%2
pour sauver 7 octets, puis retirez l'importation de mathématiques, d' économiser plus 180
activern[0:l//2]
et vousn[l//2+l%2:]
pourriez l'êtren[-(l//2):]
. Ou vous pourriez déplacer le//2
àl=len(n)//2
et utilisern[:l]
etn[-l:]
Ruby, 63 octets
Remarque: arg
s
doit être une chaîne.Test (minimum 5+ requis):
la source
Haskell, 55 octets
La fonction récursive
g
déroule une chaîne numérique des deux côtés en prenant la tête à plusieurs reprises, puis en inversant. Il soustrait le résultat récursif de la tête, ce qui lui donne des coefficients alternés de +1 et -1, +1 étant appliqué à la première moitié et -1 à la seconde moitié.Donc, il prend la somme de la première moitié moins la somme de la seconde moitié. Cela pose le problème qu’avec un nombre impair de chiffres, le centre se sépare à gauche, mais la fonction principale corrige ce problème en
(<*"xx")
doublant chaque caractère, c’est-à-dire que "12345" devient "1122334455". De cette façon, le chiffre du milieu se divise de manière égale des deux côtés et s’annule.la source
Retina,
6444 octetsEssayez-le en ligne
La première étape divise la chaîne au milieu, en omettant le caractère du milieu s'il en existe un (
pris et modifié à partir d' ici .Avec l'aimable autorisation de Martin.) Ensuite, remplacez les chiffres par leur représentation unaireet faitescorrespondre si les deux moitiés sont égales.la source
(.)*?
(chaque itération pousse une capture sur la pile 2). Ensuite, nous essayons d’atteindre la fin en sortant de la pile avec(?<-2>.)*$
(après un chiffre moyen optionnel). La première fois que cela est possible, c’est lorsque nous avons saisi exactement la moitié des chiffres (arrondis au chiffre 2) dans le groupe 2.JavaScript (ES6),
7467...5950 octetsAdditionne de manière récursive la différence entre les premier et dernier chiffres jusqu'à ce qu'il ne reste plus que deux chiffres:
la source
(s-=i<0?v:-v)
.Math.sign()
.R,
10596 octetsIl s'avère que R est très prolixe. Prend la saisie en tant que personnage.
Bien formaté:
Explication
y<-as.numeric(unlist(strsplit(x,"")))
Fractionner l'entrée (une chaîne de caractères) et la contraindre à un vecteur au lieu d'une liste, puis la reconvertir en nombres entiers.sum(tail(y,
:tail
prend les n derniers éléments, trouvés par:length(y)%/%2))
, où%/%
est la division entière, pour obtenir le plafond du quotient, où la longueur est impair.sum(head(y,length(y)%/%2))
: liketail
,head
prend les n premiers éléments du vecteur, trouvés de la même manière.Édite
=
lieu de<-
, enregistré deux autres octets.la source
length(y)%/%2
manière ou d'une autre à une variable et l'utiliser dans les appels detail
ethead
?Brain-Flak ,
410206204178 + 3 = 181 octetsVoici une version de 178 octets qui utilise le
-a
drapeau.26 octets joués par DJMcMayhem
Essayez-le en ligne
Voici une version plus longue de 410 octets qui n'utilise pas l'
-a
indicateur.Essayez-le en ligne
Explication
Voici une explication de la solution plus courte
Pour commencer, le nombre est converti en toutes ses valeurs ASCII par le
-a
drapeau.Nous poussons la hauteur de la pile (c'est-à-dire le nombre de chiffres) et divisons par deux.
Pour chaque nombre inférieur au nombre que nous venons de pousser, nous passons un chiffre à l'autre pile
Si les piles ont des hauteurs différentes, nous retirons l’élément supérieur de la pile actuelle.
Nous voulons la différence entre les sommes de chaque pile. Nous utilisons donc l'algorithme suivant pour additionner chaque pile.
Cela suppose qu'aucun chiffre ne possède une valeur ASCII égale à zéro, ce qui est une hypothèse valide.
Nous courons cela pour les deux piles et prenons la différence (Le
<(())>
est nécessaire pour la prochaine partie.Nous voulons maintenant annuler la somme. Si la somme est égale à zéro, la partie supérieure apparaîtra, révélant celle que nous avons poussée précédemment, sinon le numéro et le numéro seront supprimés et un zéro s'affichera.
la source
([]){[{}]{}([])}{}
pour additionner chaque pile?({{}})
devrait fonctionner correctement, et puisque vous utilisez l'entrée ASCII, vous n'avez pas à vous soucier de ce que 0 gâche la boucle.En fait,
1716 octetsCette réponse est inspirée de la réponse d' ElPedro à Python 2 et de leur idée d'utilisation
[-b:]
. Les suggestions de golf sont les bienvenues. Essayez-le en ligne!Ungolfing
la source
Perl 6 ,
42 3933 octetsEssaye-le
Essaye-le
Testez-le (de Jo King )
Explication:
la source
..
des non-entiers). Que diriez-vous de 33 octets à la placeJavascript, 73 octets
Bonnes boucles ES5
Qu'est-ce qu'il se passe ici?
la source
Python 2, 73 octets
Les tests sont à l' idéone
Nous devons utiliser
str()
plutôt que «puisquen
peut être en dehors de la plage de int signé.la source
Python 2,
8377 octetsMODIFIER
réduit à 77 avec l'aide de @Rod
Exemples:
la source
map(int,input())
place[int(h)for h in raw_input()]
, vouslen(g)/2
serez toujours int, pas besoin de convertir, et ceor b==0
n'est pas vraiment nécessaireb==0
c'est nécessaire pourlen=1
, mais vous pouvez le raccourcirb<1
PHP,
73676057 octetsRequiert PHP 7.1 pour les décalages de chaîne négatifs:
Courir:
La version précédente
Note: nécessite PHP 7 pour l'opérateur du vaisseau spatial.
Courez comme ça:
Explication
Itère sur les chiffres du numéro. Vérifie si le chiffre appartient à la première moitié ou à la seconde moitié (ou est le chiffre du milieu) en comparant l'index du chiffre à la longueur de l'entrée avec la comparaison combinée (
2 * $x <=> $l - 1
). Puis multipliez cela par le chiffre, prenez la somme de tous les chiffres. Si c'est un nombre équilibré, la somme sera0
.Exemple avec entrée
15324
:Tweaks
$d
, répétez simplement la longueur de l'entrée. Enregistré 5 octets.null
n'a pas besoin d'être converti pourint
que PHP l'interprète comme0
. Enregistré 1 octet.$argn
la source
Clojure,
6664 octetsMise à jour:
str
sortie de lamap int
fonction.Cela aurait été raccourci si le format d'entrée était plus flexible, je devais maintenant d'abord mapper l'entier en une séquence de valeurs ASCII. Le
map
calcul interne calcule les différences de valeurs par paires des deux moitiés et vérifie si la somme des deltas est égale à zéro.((comp f g h) x y z)
=(f (g (h x y z))
.En fait, cela a fini par avoir la même longueur que de simplement faire le mappage dans un
let
et simplement définir une fonction.la source
sed (165 + 1 pour -r) 166
Sortie:
1 pour vrai
0 pour faux
Essayez-le en ligne!
la source
Python 2.7,
10292 octetsCar la boucle fonctionne mieux: /
Même idée, utilisez simplement la longueur - je veux obtenir un autre côté. Il n'atteindra jamais le centre d'un nombre impair.
Ancien code
Gets input
Enregistre la longueur de l'entrée
Fonction récursive pour obtenir la somme de la chaîne
Comparer la première moitié de la somme à la seconde moitié de la somme
Essayer de l'obtenir en dessous de 100, mais c'est difficile: /
la source
Fonction C, 74
Idéone.
la source
#include"string.h"\n
, ce qui ajoute 19 à votre score.char *n
l;i;t;f(char*n){..return!t;}
-2 octetsRaquette 204 octets
Version détaillée:
Essai:
Sortie:
la source
Pyke, 20 octets
Essayez-le ici!
la source
not [0]
c'était 0, pas 1Mathematica, 69
la source
...;;]]&@*IntegerDigits
@*
est l'abréviation deComposition
.f@*g
estf[g[##]]&
.