introduction
Dans ce défi, vous devez diviser un entier en deux parties. Étant donné que personne n'aime manger le plus petit morceau de gâteau, votre objectif est d'être aussi juste que possible. Par exemple, si vous souhaitez scinder le nombre entier 7129
en deux parties, vous avez trois possibilités.
7,129
, 71,29
et 712,9
sont toutes des possibilités, mais 71,29
est le moyen le plus juste de le scinder en deux, car il minimise la différence entre les deux:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Défi
Étant donné un entier, déterminez le meilleur moyen de le partitionner comme décrit ci-dessus et signalez la différence résultante.
Règles
- La division n'a de sens que pour des entiers de longueur au moins deux, l'entrée sera toujours ≥ 10
- L'entrée peut être un entier, une liste de chiffres ou une chaîne
- Vous n'êtes pas obligé de gérer une entrée invalide
Testcases
Il vous suffit de signaler la différence résultante, le partitionnement n’est ici qu’à titre d’illustration:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 octets
Code:
Utilise le codage 05AB1E . Essayez-le en ligne!
Explication
la source
£
par°‰
vous n'en aurez¤â
plus besoin .Python 2 , 64 octets
Essayez-le en ligne!
la source
Perl 6 , 40 octets
Essaye-le
Étendu:
la source
C, 94 octets
Essayez-le en ligne!
la source
Python 2 , 51 octets
Essayez-le en ligne!
la source
Prolog (SWI) ,
195189154117bytes35 octets sauvés grâce à Eminga
Essayez-le en ligne!
C’est la première fois que je joue au golf avec prologue, alors c’est peut-être un peu horrible. Voici comment cela fonctionne.
Au plus haut niveau que nous avons
*
.*
prendA
etH
, et détermine siH
est le plus petit moyen de se séparerA
.La première ligne utilise ici une technique de ce poste SO , pour essentiellement réaliser une carte du prédicat
r(A)
sur les entiers de0
àA
. Puisquer
confirme les valeurs de chaque partition, cela nous donnera les valeurs de toutes les partitions possibles, plus toute une charge de déchets supplémentaires. Toutes ces partitions seront stockéesL
dans aucun ordre particulier. Une fois que cela est fait, nous trions la liste pour trouver le plus petit élément. Nous utilisons ensuite une coupe pour éviter les retours en arrière.Ensuite, nous avons la définition de
r
.r
Calcule d’ abord les deux résultats de la scission en les nommantX
etY
.Ensuite, nous affirmons que
C
c’est la différence et que c’est positif.la source
X is div(A,10**B),Y is div(A,10**B)
sera toujours le casC=0
(le sensH
sera toujours égal à 0 ). DevraisY is mod(A,10**B)
je présume.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
économiser 32 octets (si vous utilisez au moins le prologue SWI, vous n'êtes pas sûr des autres versions).A*H
lieu d'l(A,H)
enregistrer 3 autres. Et si vous utilisez SWI, vous pouvez ajouter un lien TIO,!
ce pas? Il ne devrait pas y avoir de retour en arrière à ce stade.,!
ce ne serait pas nécessaire, mais lorsque je teste le programme, il effectue une trace. Il semble essayer toutes les commandes possiblesL
, puis les trie toutes. Cela signifie que cela donnera les mêmesA!
temps de réponse .Haskell ,
68 ans65 octetsEssayez-le en ligne!
Explication
la source
Charbon de bois , 14 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. De manière pratique, je peux utiliser la variante à 2 arguments de
Slice
. Explication:la source
Gelée ,
9 à8 octetsEssayez-le en ligne!
-1 octet grâce à Dennis. L'entrée est une liste de chiffres.
Explication
la source
Funky ,
15913499 octetsEn fait, il semble que la pose soit conforme aux spécifications.
Essayez-le en ligne!
la source
Retina , 36 octets
Essayez-le en ligne!
Explication
Cela génère toutes les partitions possibles sur des lignes séparées, ainsi qu'une ligne de fin avec l'entrée d'origine.
Convertissez chaque nombre de chaque partition en unaire.
Supprimer une quantité maximale et égale de
1
s des deux parties de chaque partition (c'est-à-dire supprimer le minimum et le soustraire du maximum, ce qui donne la différence absolue).Triez les lignes.
Comptez le
1
s sur la première ligne, ce qui donne la différence absolue minimale.la source
J ,
32, 2723 octets-5 octets grâce à FrownyFrog! -4 octets si l'entrée est une chaîne.
Essayez-le en ligne!
Original: prend un nombre en entrée
Comment ça marche:
Essayez-le en ligne!
la source
JavaScript (ES6), 64 octets
Prend l'entrée sous forme de chaîne.
Cas de test
Afficher l'extrait de code
Commenté
Non récursif (ES7), 65 octets
Prend l'entrée sous forme de chaîne.
Cas de test
Afficher l'extrait de code
Commenté
Remarque : Dans les deux versions,
l
une chaîne est forcée lors de la première itération. Normalement, nous devrions faire attention aux zéros non significatifs dans un littéral numérique:0123 - 10 === 73
car0123
est analysé comme une valeur octale (ceci est maintenant déconseillé, mais reste valide en mode non strict). Mais'0123' - '10' === 113
, le zéro de tête étant cette fois ignoré. Donc, il est judicieux de le faire.A partir de la spécification de l'opération abstraite
ToNumber
appliquée à une chaîne:la source
APL (Dyalog) , 27 octets
Essayez-le en ligne!
Comment?
¯1+≢⍵
- longueur den
moins 1∘.=⍨⍳
- matrice d'identité1,
- Préposer1
pour chaque ligne↓
- divisé en rangées⊂∘⍵¨
- pour chaque partitionner la chaîne par celle-ci↑
- aplatir-/
- réduire chaque paire avec soustraction|
- prendre des valeurs absolues⌊/
- le minimumAPL (Dyalog) , 35 octets
Essayez-le en ligne!
la source
Gelée , 11 octets
Essayez-le en ligne!
-3 octets grâce à dylnan
Comment ça marche
la source
L=2$$Ðf
pourṖLÐṂ
dans ce casPython 2 , 58 octets
Essayez-le en ligne!
la source
Pyth , 15 octets
Essayez-le en ligne!
la source
MATL , 15 octets
L'entrée est une chaîne représentant l'entier.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Wolfram Language (Mathematica) , 66 octets
Prend une liste de chiffres.
Essayez-le en ligne!
la source
Propre ,
10683 octetsDéfinit la fonction
@
en prenant une chaîne.Le problème le plus complexe est le suivant
f=toInt o(%)n
: Il prend latoInt
classe de fonctions et la compose (o
) avec la classe d'opérateur de tranche au curry (%
) déjà fournie avec le premier argument (n
). Puisqu'il n'y a qu'un seul type (String
équivalent à{#Char}
) qui a des surcharges pour les deux%
ettoInt
la ligne est effectivement compilée, alors qu'il est normalement difficile de composer des fonctions lorsque vous jouez au golf en raison du manque d'informations contextuelles données au compilateur.Essayez-le en ligne!
la source
Gelée , 12 octets
Un lien monadique prenant une liste de chiffres et renvoyant l'entier.
Essayez-le en ligne!
Comment?
la source
Pyth, 10 octets
Suite de tests
Prend l'entrée sous forme de chaîne.
Cela utilise l'une des fonctionnalités les plus récentes de Pyth, c'est-à-dire que l'application d'une fonction à une liste permet par défaut de mapper la fonction sur la liste, si aucun autre comportement n'est défini. Cela signifie que l'
v
application à une liste de chaînes évalue toutes les chaînes.Notez que la liste des divisions permet la division en une seule pièce, mais que la valeur de celle-ci sera toujours supérieure au minimum, elle est donc ignorée en toute sécurité.
la source
Tcl , 116 octets
Essayez-le en ligne!
Explication
Cela fonctionne en utilisant une astuce regex permettant un cas final dégénéré qui calculera toujours à une différence supérieure à la différence minimale. Pour «12345», les valeurs sont:
la source
lmap
instead offoreach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Ruby, 44 bytes
Try it online!
la source
APL+WIN, 31 bytes
Prompts for screen input of integer as a string.
Explanation:
la source
Perl 5,
5141 + 1 (-p
) = 42 bytesTry it online!
inspired by @Nahuel-Fouilleul's comment
la source
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C# (.NET Core),
112107 + 18 = 125 bytesTry it online!
The count includes the 18 bytes in
using System.Linq;
. Takes input as astring
.la source
string.Remove
might save you a few bytesCommon Lisp, 131 bytes
My first time participating in code golf and I decided to use Lisp, since I like it.
Here is my solution:
Input needs to be a string, not integer or list.
la source