Simplification des nombres

16

Comment, vous ne vous souvenez pas du numéro de téléphone à 6 ou 7 chiffres qui est apparu sur l'écran du téléviseur pendant une seconde?! En utilisant la technique spéciale décrite ci-dessous, vous vous transformerez en un répertoire de marche!

De toute évidence, le nombre 402est plus facile à retenir que le nombre 110010010, et le nombre 337377est plus facile à retenir que le nombre 957472. Cela signifie que le numéro mémorisé, d'une part, doit contenir le moins de chiffres possible, et d'autre part, il est souhaitable que le numéro contienne autant de numéros répétitifs que possible.

Comme critère de difficulté de mémorisation, nous prenons la somme du nombre de chiffres en nombre et du nombre de chiffres différents en nombre. Un nombre mémorisé peut être écrit dans un autre système numérique, peut-être sera-t-il alors plus facile à retenir. Par exemple, le nombre 65535dans la notation hexadécimale ressemble FFFF.

Tâche

Vous devez écrire un programme pour sélectionner la base du système numérique afin de minimiser le critère de complexité. La base du système numérique doit être sélectionnée dans la plage de 2 à 36, puis les chiffres 0-9et les lettres anglaises A-Zpeuvent être utilisés pour représenter le nombre.

Contribution

L'entrée contient un entier décimal de 1 à 999999999.

Production

La sortie doit contenir la base du système numérique (de 2 à 36), minimisant le critère de complexité de mémorisation, et le nombre dans le système numérique sélectionné, séparés par un espace. Si plusieurs bases donnent la même valeur pour le critère, choisissez la plus petite d'entre elles.

Remarques

  • Les lettres doivent être en majuscules ( A-Z).

Cas de test

Entrée sortie

1              2 1

2              3 2

65535       16 FFFF

123          12 A3

Ver Nick dit de réintégrer Monica
la source
16
Grand défi, mais il a besoin de plus de cas de test.
Grimmy
7
De plus, le format de sortie est un peu trop strict, vous pouvez par exemple autoriser un tableau de deux éléments, la base et la chaîne, ou les autoriser dans l'ordre inverse ou séparés par un autre caractère. En outre, je suppose que vous ajoutez la somme des chiffres au nombre de chiffres, mais vous voudrez peut-être clarifier cela.
Erik the Outgolfer
8
Puis-je utiliser à la a-zplace de A-Z?
Neil
5
Pouvons-nous simplement utiliser les numéros correspondants à la place de A-Z?
flawr
8
@VerNick La prochaine fois que vous écrivez un défi similaire, je suggère d'autoriser ces deux demandes, car elles ne sont qu'une complication inutile qui est déconseillée: voir par exemple ici .
flawr

Réponses:

6

Perl 6 , 55 54 octets

-1 octet merci à Jo King.

{~map({$^b,.base($b)},2..36).min:{@$_+.Set}o*[1].comb}

Essayez-le en ligne!

nwellnhof
la source
1
Vous pouvez remplacer @$_par @_et cela fonctionne toujours.
SirBogman
2
@SirBogman Cela se produit juste avec les très rares cas de test.
nwellnhof Il y a
Ça a du sens. Cela ne semblait pas tout à fait correct.
SirBogman Il y a
5

Python 2 , 150 149 127 144 octets

lambda n:min((len(c(n,b))+len(set(c(n,b))),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n/b,b,chr(n%b+48+7*(n%b>9))+s)or s or'0'

Essayez-le en ligne!


Python 3 , 136 octets

lambda n:min((len((*c(n,b),*{*c(n,b)})),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

Essayez-le en ligne!


Python 3.8 (pré-version) , 131 octets

lambda n:min((len((*(x:=c(n,b)),*{*x})),b,x)for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

Essayez-le en ligne!


c convertit un nombre de base 10 en n'importe quelle base (2-36), et la première fonction (anonyme) trouve le résultat le plus petit.

TFeld
la source
5

05AB1E , 16 14 octets

-1 octet grâce à Kevin Cruijssen

₆LBāøΣнDÙìg}1è

Essayez-le en ligne!

Ou ajoutez R) »à la fin pour se conformer exactement au format de sortie spécifié, mais la plupart des autres réponses n'ont pas dérangé.

Explication:

₆L          # range 1..36
  B         # convert the input to each of those bases
   āø       # enumerate (pair each element with its 1-based index)
Σ     }     # sort by
     g      # length
 н          # of the first element
    ì       # concatenated to
  DÙ        # itself, uniquified
1è          # take the second entry (first will always be base 1)
Grimmy
la source
1
-1 octet en utilisant ₆L©B®øau lieu de₆LεBy‚}
Kevin Cruijssen
1
@KevinCruijssen Merci! Un autre -1 en utilisant ā, semble que vous oubliez toujours celui-là.
Grimmy
Lol, je le fais en effet .. Je m'en suis souvenu de ce défi plus tôt dans la
journée
@recursive vous ne semblez pas avoir lu la réponse. Je lie une version conforme aux exigences de sortie strictes et explique pourquoi je n'en ai pas fait la version principale.
Grimmy
@Grimy coupable comme accusé. Désolé de vous déranger.
récursif
4

JavaScript (ES6),  87  85101 octets

Edit: +16 octets inutiles pour se conformer au format de sortie strict

n=>(g=m=>--b>2?g(m<(v=new Set(s=n.toString(b)).size+s.length)?m:(o=b+' '+s.toUpperCase(),v)):o)(b=37)

Essayez-le en ligne!

Arnauld
la source
Ah, j'ai raté cette partie
TFeld
4

Japt v2.0a0 -gS, 24 23 octets

Pas joli, mais ça fait l'affaire. +2 octets pour l'exigence totalement inutile que la sortie soit en majuscules.

37o2@sX u ¸iXÃñÈÌiXÌâ)l

Essayez-le

37o2@sX u ¸iXÃñÈÌiXÌâ)l     :Implicit input of integer
37o2                        :Range [2,37)
    @                       :Map each X
     sX                     :  Convert the input to a base-X string
        u                   :  Uppercase
          ¸                 :  Split on spaces (there are none, so this returns a singleton array)
           iX               :  Prepend X
             Ã              :End map
              ñ             :Sort by
               È            :Pass each X through the following function
                Ì           :  Last element of X
                 i          :  Prepend
                  XÌâ       :    Last element of X, deduplicated
                     )      :  End prepend
                      l     :  Length
                            :Implicit output of the first sub-array, joined with spaces
Hirsute
la source
Oui, cela fonctionne bien, mais les lettres doivent être en majuscules.
Ver Nick dit Réintégrer Monica
1
@VerNick, pourquoi? Cela n'ajoute absolument rien au défi.
Shaggy
... Je suppose que la prochaine chose sera "séparée par un espace". Il semble que le format de sortie a été rendu très strict sur ce défi, et les commentaires ne semblent pas changer.
Jonathan Allan
@JonathanAllan, heureusement, je peux "réparer" celui-ci avec un changement de drapeau.
Shaggy
3

PHP ,124 119 octets

for($i=36;$b=strtoupper(base_convert($argn,10,--$i));$o[strlen($b.count_chars($b,3))]="$i $b");krsort($o);echo end($o);

Essayez-le en ligne!

Dommage pour les +12 octets en PHP pour mettre en majuscule la sortie ... mais ... de toute façon.

640 Ko
la source
3

Zsh , 85 octets

for b ({36..2})x=$[[#$b]$1]&&x=${x#*\#}&&a[$#x+${#${(us::)x}}]=$b\ $x
a=($a)
<<<$a[1]

Pour ce nombre d'instructions dans la boucle for, l'utilisation ...&&...&&...est plus courte que {...;...;...;}.

for b ({36..2})                   # order decreasing: smaller bases overwrite larger ones
    x=$[[#$b]$1] && \             # set x to [base]#[num] 
    x=${x#*\#} && \               # strip leading [base]#
    a[$#x+${#${(us::)x}}]=$b\ $x  # use score as index to store "[base] [number]"
#            ${(us::) }           # (s::)plit into characters, take (u)nique
a=($a)                            # remove empty elements from array
<<<$a[1]                          # print out the first element (smallest score)

Essayez-le en ligne!

Voici une solution de 81 octets qui s'imprime à la [base]#[num]place dans le formulaire :

for b ({36..2})x=$[[#$b]$1]&&y=${x#*\#}&&a[$#y+${#${(us::)y}}]=$x
a=($a)
<<<$a[1]

Essayez-le en ligne!

GammaFunction
la source
3

J , 67 octets

(];'0123456789ABCDEF'{~b)[:(2+]i.<./)](#+#@~.)@(b=:#.inv~)"+2+i.@35

Essayez-le en ligne!

Galen Ivanov
la source
2

Fusain , 38 octets

Nθ≔EE³⁴↨θ⁺²ιL⁺ιΦι⁼λ⌕ικη≔⁺²⌕η⌊ηηIη ↥⍘θη

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

Nθ

Saisissez l'entier.

≔EE³⁴↨θ⁺²ι

Convertissez-le de la base 2 à la base 36 ...

L⁺ιΦι⁼λ⌕ικη

... dédupliquer, concaténer et prendre la longueur.

≔⁺²⌕η⌊ηη

Prenez l'indice de la complexité minimale et ajoutez 2 pour obtenir la base.

Iη ↥⍘θη

Imprime la base et l'entier converti en cette base en majuscules.

Neil
la source
2

Stax , 19 octets

Ç╛;ⁿY3█↕(╖S♪*ò▌?½╦l

Exécuter et déboguer

Aucun algorithme sophistiqué, juste une force brute simple. Environ un tiers du programme est en train de modifier le format des règles de sortie précises.

Programme bonus: sortie pour [1..1000]

récursif
la source
2

Gelée , 25 octets

bⱮ36µQL+LN)Mḟ1Ḣ,ị‘ịØBʋ¥⁸K

Essayez-le en ligne!

Un lien monadique prenant un entier comme argument et renvoyant une chaîne Jelly du format souhaité. Si une liste de deux éléments était une sortie acceptable (selon la plupart des défis), elle pourrait économiser 2 octets. Si la base 1 était acceptable pour le cas de bord de 1 en entrée, cela pourrait économiser 2 octets supplémentaires.

Nick Kennedy
la source
2

Brachylog , 44 octets

∧Y≜∧36≥Xℕ₂≜&ḃ↙X Zd,Zl≡Y∧XwṢwZ{-₁₀;Ạụᵗ∋₍|}ᵐwᵐ

Essayez-le en ligne!

Cela faisait un peu mal à écrire.

Chaîne indépendante
la source
1

Perl 5 , 161 octets

sub f{$X=99;for$b(2..36){$_=c($_[0],$b);$x=uniq(/./g)+y///c;($X,$B,$C)=($x,$b,$_)if$x<$X}$B,$C}
sub c{my($n,$b)=@_;$n?c(int$n/$b,$b).chr(48+$n%$b+7*($n%$b>9)):''}

Essayez-le en ligne!

Kjetil S.
la source
1

Python 2 , 140 135 octets

lambda n:min([(b,g(n,b))for b in range(2,36)],key=lambda(b,s):len(s)+len(set(s)))
g=lambda n,b:n and g(n/b,b)+chr(n%b+48+7*(n%b>9))or''

Essayez-le en ligne!

Chas Brown
la source
1

Perl 5 -Minteger -MList::Util=uniq,first -ap , 123 112 octets

$"=$,;map{@r=();$t="@F";do{unshift@r,(0..9,A..Z)[$t%$_]}while$t/=$_;$a[@r+uniq@r]||="$_ @r"}2..36;$_=first{$_}@a

Essayez-le en ligne!

Xcali
la source
1

Wolfram Language (Mathematica) , 109 111 octets

Print[a=OrderingBy[#~IntegerDigits~Range@36,Tr[1^#]+Tr[1^Union@#]&,1][[1]]," ",ToUpperCase[#~IntegerString~a]]&

+2: fixe. Merci pour la capture @Roman

OrderingBy a été introduit dans Mathematica 12.0, que TIO ne semble pas encore avoir mis à jour.

attinat
la source
"Si plusieurs bases donnent la même valeur pour le critère, choisissez la plus petite d'entre elles.": OrderingByN'est pas conforme à cette exigence.
Roman
Peut-être quelque chose avec MinimalBy, comme ça ?
Roman
@Roman n'est-ce pas? Pour autant que je sache, il préserve l'ordre relatif de deux indices qui ont la même valeur ..
attinat
2
Avec l'argument 123, votre solution s'imprime 36 3Fau lieu de ce qui est requis 12 A3. De OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]je reçois la réponse {36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 6, 5, 11, 10, 9, 8, 7, 4, 3, 2, 1}, donc l'hypothèse habituelle de pas d' entrées équivalentes ré-commande semble être ignoré ici. Mon $Versionest "12.0.0 pour Mac OS X x86 (64 bits) (7 avril 2019)".
Roman
Ah, tu as raison. C'est dommage de ne pas l'avoir remarqué.
attinat
1

C (clang) , 165 octets

n,i=2,j,p=99,r,m,x;char*g,*_,b[74][37];t(n){for(;g=b[i],i<37;r=j<p?_=g,p=j,i:r,++i)for(j=0,m=n;m;m/=i,*--g=x+=x>9?87:48)j+=b[i+36][x=m%i]++?1:2;printf("%i,%s",r,_);}

Essayez-le en ligne!

n // entrée

, i = 2 // itérateur de la base 2 à 36

, j // complexité actuelle

, p = 99 // meilleure complexité

, r // resultat = itérateur

, m // copie temporaire de n

, x; // m% i

char * g // chaîne actuelle ptr

, * _ // meilleur str ptr

, b [74] [37]; // tampon

/ * [37 + 37] = [chaînes obtenues + test des caractères utilisés] * /

t (n) {

for (; g = b [i], // move ptr

   i<37 ; 
   r=j<p?_=g,p=j,i:r, // save best solution

   ++i){//for every base

pour (j = 0, m = n; m; m / = i, // extrait le chiffre

   *--g=x+=x>9?87:48)
   // move ptr backward for printf use and transform to ascii value

j + = b [i + 36] [x = m% i] ++? 1: 2; // incrémente l'octet par rapport au caractère

// et si c'était 0 incréments j de 2: 1 pour le nouveau caractère utilisé et 1 pour le nombre de chiffres

// else incr seulement les chiffres comptent + déplacer le pointeur

// printf ("% s -", ​​g); // test

// printf ("r% ip% ij% i \ n", r, p, j); // test

}

printf ("% i,% s", r, _); // sortie

}

AZTECCO
la source
1
163 octets peuvent être appelés plus d'une fois.
plafondcat
1

Japt v2.0a0, 31 octets

2o37 ñ@sX Ê+UsX â ÊÃÎ
+S+NÎsU u

Essayez-le

Incarnation de l'ignorance
la source