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


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:



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.


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)

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!


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

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.


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!



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.



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.



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!



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!


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.


"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

}


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.