Inspiré par ce post sur Puzzling. Les spoilers pour ce puzzle sont ci-dessous.
Étant donné trois entiers positifs en entrée, (x, y, z)
construisez la plage inclusive [x, y]
, concaténez cette plage ensemble, puis supprimez z
les chiffres non nécessairement consécutifs pour produire les entiers positifs les plus grands et les plus petits possibles. Les zéros non significatifs ne sont pas autorisés (c'est-à-dire que les nombres doivent commencer par [1-9]
). Sortez ces deux nombres dans l'un ou l'autre ordre.
Pour l'exemple du post Puzzling, pour la saisie (1, 100, 100)
, le plus grand nombre possible est 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
et le plus petit nombre est 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
suivant la logique ci-dessous de la réponse de jafe postée ici:
- Nous ne pouvons pas influencer la longueur du numéro (il y a un nombre fixe de chiffres), donc pour maximiser la valeur, nous prenons le premier chiffre maximal, puis le deuxième chiffre, etc.
- Supprimez les 84 premiers non-neuf (il reste 16 chiffres à supprimer):
999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Le plus grand nombre parmi les 17 chiffres suivants est 7, donc à partir d'ici, le chiffre suivant dans la réponse peut être au plus 7 (nous ne pouvons pas supprimer plus de 16 chiffres). Donc, supprimez 15 non-7 ... (1 chiffre à gauche pour supprimer):
999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- À partir d'ici, le chiffre suivant peut être au plus 8, alors supprimez un non-8 du milieu:
99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Logique similaire, mais inversée (c'est-à-dire que nous voulons des
1
s au lieu de s au début9
) pour le plus petit nombre.
Voici un petit exemple: (1, 10, 5)
.
Nous construisons la plage 12345678910
et déterminons quels 5
chiffres nous pouvons supprimer en laissant le plus grand nombre possible. Évidemment, cela signifie que nous voulons maximiser le premier chiffre, car nous ne pouvons pas influencer la longueur de la sortie. Donc, si nous supprimons 12345
, nous nous retrouvons avec 678910
, et c'est le plus grand que nous puissions faire. Faire le plus petit est un peu plus délicat, car nous pouvons plutôt extraire les nombres du milieu, en laissant 123410
le plus petit possible.
Car (20, 25, 11)
, le résultat est plutôt ennuyeux, au fur 5
et à mesure 1
.
Enfin, pour exclure les réponses qui essaient de mettre des zéros en tête, (9, 11, 3)
donne 91011
qui à son tour donne 91
et 10
comme le plus grand et le plus petit.
E / S et règles
- Si c'est plus facile / plus court, vous pouvez coder deux programmes / fonctions - un pour le plus grand et un pour le plus petit - auquel cas votre score est la somme des deux parties.
- L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
- L'entrée peut être supposée correspondre au type de numéro natif de votre langue, mais ni le numéro concaténé ni la sortie ne peuvent être supposés le faire.
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
la source
9, 11, 3
serait le cas.Réponses:
Haskell , 162 octets
Essayez-le en ligne!
Utilise l'algorithme décrit par jafe. Peut-être plus court pour utiliser une méthode moins efficace, mais c'était plus amusant à écrire :)
L'
%
opération prend 4 arguments (en fait 3, mais peu importe):m
qui est une fonction qui sélectionne le membre "optimal" dans une liste (soitmaximum
ouminimum
selon ce que nous voulons);f
qui est une fonction "filtre";n
le nombre de chiffres restant à supprimer; ets
la chaîne. Nous vérifions d'abord si n est égal au nombre de chiffres restants dans la chaîne (j'ai utilisé>=
pour la sécurité) et supprimons le restes
si c'est le cas. Sinon, nous vérifions si nous devons encore supprimer les chiffres (n>0
), puis nous utilisonsspan
pour diviser notre chaîne en trois morceaux:p
les chiffres à supprimer, la chaîne restante. Pour ce faire, nous transmettons un prédicat qui vérifie l'égalité par rapport à notre chiffre optimal. Pour trouver ce chiffre, nous prenons le premierc
le chiffre optimal accessible, etr
n+1
chiffres de la chaîne, filtrez-la, puis passez-la à notre fonction "sélecteur". Maintenant, nous produisons simplement notre chiffre optimal et réapparaissons, en soustrayant la longueur dep
(le nombre de chiffres supprimés) den
. Notez que nous ne transmettons pas notre fonction de filtrage à l'appel récursif et que nous le remplaçons plutôt parid
. En effet, le filtre est uniquement là pour éviter de sélectionner les 0 en tête dans leminimum
cas, ce qui n'est pertinent que lors de la première itération. Après cela, nous n'avons plus besoin de filtre.%
est vraiment seulement une fonction d'aide pour ce#
qui est notre fonction « réelle », en prenantx
,y
etz
. Nous utilisons une compréhension de liste juste pour éviter un peu de répétition, en itérant sur nos tuples de fonction et en les passant%
avecz
et la chaîne concaténée. Cette chaîne est créée en utilisant l'opérateur de monade magique(=<<)
qui, dans ce contexte, fonctionne commeconcatMap
.la source
Gelée , 17 octets
Essayez-le en ligne!
Calcule toutes les possibilités puis conserve les plus grandes et les plus petites.
Argument de gauche:
x,y
pour construire la plage. Argument de droite:z
chiffres à supprimer.la source
Python 2 , 143 octets
Essayez-le en ligne!
Cela fonctionne en calculant toutes les combinaisons de la taille cible (l'ordre des éléments est préservé) et en obtenant les plus petits / plus grands nombres
la source
Charbon de bois , 56 octets ou 21 +
4635 =6756 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Saisissez
x
ety
, créez une plage inclusive et joignez les nombres dans une chaîne.Boucle une fois pour chaque chiffre à supprimer.
Créez une liste de chaînes formées en supprimant chaque caractère possible de la chaîne actuelle et prenez le maximum.
Imprimez le résultat.
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Saisissez
x
ety
, créez une plage inclusive et joignez les nombres dans une chaîne.Saisissez-le
z
et incrémentez-le. Je crée ensuite une liste de cette longueur: j'ai besoin de pouvoir incrémenterz
à l'intérieur du filtre suivant, mais seules les commandes sont autorisées à incrémenter les variables; il y a une faille quiPushOperator
augmente la longueur de la liste.Filtrez les caractères recherchés en vérifiant qu'il n'y a pas de caractères inférieurs dans la zone à découper. La région commence par les premiers
z+1
caractères (puisqu'il est possible de découper le premierz
si nécessaire) et les incréments de point final pour chaque caractère conservé. On prend soin de ne pas choisir un zéro pour le premier caractère.L'algorithme le plus rapide fait 30 octets lorsqu'il est utilisé pour calculer le plus grand nombre possible:
Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: j'ai depuis été en mesure de combiner les deux ci-dessus dans une deuxième solution de 56 octets qui génère les deux résultats:
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Générez la chaîne initiale.
Représentez
z+1
comme la longueur de la liste.Inversez ainsi la liste en la clonant et enregistrez le résultat.
Imprimez les deux résultats sur des lignes distinctes. (Une autre façon de procéder consiste à séparer les résultats par un
\r
caractère littéral .)Générez le plus grand nombre possible.
Générez le plus petit nombre possible en utilisant la liste clonée pour garder une trace de
z
.la source
Gelée ,
1918 octetsEssayez-le en ligne!
Très inefficace, orientez certainement pas aller pour( 19292) =305812874887035355118559193163641366325011573739619723360
1, 100, 100
quela source
05AB1E , 16 octets
Essayez-le en ligne!
Programme complet, lecture des entrées dans cet ordre: y, x, z . Génère une liste de deux listes de caractères.
Explication
la source
Ć`‚
c'est assez intelligent, belle réponse!Matlab, 95 octets
Essayez-le en ligne!
Renvoie une matrice 1x2 avec min et max.
Comment ça fonctionne
la source