Vereinfachung von Zahlen

15

Wie, Sie können sich nicht an die 6- oder 7-stellige Telefonnummer erinnern, die für eine Sekunde auf dem Fernsehbildschirm angezeigt wurde ?! Mit der unten beschriebenen speziellen Technik verwandeln Sie sich in ein Wandertelefonbuch!

Offensichtlich ist die Nummer 402leichter zu merken als die Nummer 110010010, und die Nummer 337377ist leichter zu merken als die Nummer 957472. Dies bedeutet, dass die gespeicherte Nummer einerseits so wenig Ziffern wie möglich enthalten sollte, und andererseits ist es wünschenswert, dass die Nummer so viele sich wiederholende Nummern wie möglich enthält.

Als Kriterium für die Schwierigkeit, sich zu erinnern, nehmen wir die Summe der Anzahl der Ziffern in der Zahl und der Anzahl der verschiedenen Ziffern in der Zahl. Eine gespeicherte Nummer kann in ein anderes Zahlensystem geschrieben werden. Vielleicht ist es dann einfacher, sich daran zu erinnern. Zum Beispiel 65535sieht die Zahl in hexadezimaler Schreibweise so aus FFFF.

Aufgabe

Sie müssen ein Programm zur Auswahl der Basis des Zahlensystems schreiben, um das Komplexitätskriterium zu minimieren. Die Basis des Zahlensystems muss im Bereich von 2 bis 36 ausgewählt werden, dann können die Zahlen 0-9und die englischen Buchstaben A-Zzur Darstellung der Zahl verwendet werden.

Eingang

Die Eingabe enthält eine Dezimalzahl von 1 bis 999999999.

Ausgabe

Die Ausgabe muss die Basis des Zahlensystems enthalten (von 2 bis 36), wodurch das Kriterium der Komplexität des Speicherns minimiert wird, und die Zahl im ausgewählten Zahlensystem, die durch ein Leerzeichen getrennt ist. Geben mehrere Basen den gleichen Wert für das Kriterium an, wählen Sie die kleinste aus.

Anmerkungen

  • Die Buchstaben müssen in Großbuchstaben geschrieben sein ( A-Z).

Testfälle

Input-Output

1              2 1

2              3 2

65535       16 FFFF

123          12 A3

Ver Nick sagt Reinstate Monica
quelle
16
Große Herausforderung, aber es braucht mehr Testfälle.
Grimmy
7
Außerdem ist das Ausgabeformat etwas zu streng. Möglicherweise möchten Sie beispielsweise ein Array aus zwei Elementen zulassen, die Basis und die Zeichenfolge, oder sie in umgekehrter Reihenfolge zulassen oder durch ein anderes Zeichen trennen. Ich gehe auch davon aus, dass Sie die Summe der Ziffern zur Anzahl der Ziffern addieren, aber Sie möchten das vielleicht klären.
Erik der Outgolfer
8
Kann ich a-zstatt verwenden A-Z?
Neil
5
Können wir statt nur die entsprechenden Zahlen verwenden A-Z?
Fehler
8
@VerNick Wenn Sie das nächste Mal eine ähnliche Herausforderung schreiben, würde ich vorschlagen, beide Anforderungen zuzulassen, da dies nur eine unnötige Komplikation ist, von der abgeraten wird: siehe z . B. hier .
Fehler

Antworten:

5

Python 2 , 150 149 127 144 Bytes

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'

Probieren Sie es online!


Python 3 , 136 Bytes

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

Probieren Sie es online!


Python 3.8 (Vorabversion) , 131 Byte

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

Probieren Sie es online!


c wandelt eine Zahl zur Basis 10 in eine beliebige Basis (2-36) um, und die erste (anonyme) Funktion findet das kleinste Ergebnis.

TFeld
quelle
5

05AB1E , 16 14 Bytes

-1 Byte dank Kevin Cruijssen

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

Probieren Sie es online!

Oder fügen Sie R) »am Ende hinzu , um genau das angegebene Ausgabeformat zu erreichen, aber die meisten anderen Antworten haben sich nicht darum gekümmert.

Erläuterung:

₆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)
Grimmig
quelle
1
-1 Byte mit ₆L©B®øanstelle von₆LεBy‚}
Kevin Cruijssen
1
@ KevinCruijssen Danke! Ein weiteres -1 mit ā, scheint, als hättest du dieses immer vergessen.
Grimmy
Lol, das tue ich in der Tat. Ich erinnerte mich an diese Herausforderung früher heute, nicht dass es irgendwie geholfen hätte, haha ​​xD
Kevin Cruijssen
@recursive Sie scheinen die Antwort nicht gelesen zu haben. Ich verknüpfe eine Version, die den strengen Ausgabeanforderungen entspricht, und erkläre, warum ich das nicht zur Hauptversion gemacht habe.
Grimmy
@Grimy als Angeklagter schuldig. Entschuldige, dass ich dich belästige.
rekursive
5

Perl 6 , 55 54 Bytes

-1 Byte danke an Jo King.

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

Probieren Sie es online!

nwellnhof
quelle
Verdammt, ich habe dies nicht und bekam so ziemlich die gleiche Antwort , es sei denn , @$_statt .[*]für minus ein Byte
Jo König
4

JavaScript (ES6),  87 85  101 Bytes

Bearbeiten: +16 unnötige Bytes, um das strikte Ausgabeformat zu erfüllen

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)

Probieren Sie es online!

Arnauld
quelle
Ah, ich habe diesen Teil verpasst
TFeld
4

Japt v2.0a0 -gS, 24 23 Bytes

Nicht schön, aber es macht den Job. +2 Byte für die völlig unnötige Anforderung, dass die Ausgabe in Großbuchstaben erfolgen muss.

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

Versuch es

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
Zottelig
quelle
Ja, es funktioniert gut, aber die Buchstaben müssen in Großbuchstaben geschrieben sein.
Ver Nick sagt Reinstate Monica
1
@VerNick, warum? Das fügt der Herausforderung absolut nichts hinzu.
Shaggy
... Ich denke, das nächste wird "durch ein Leerzeichen getrennt" sein. Anscheinend wurde das Ausgabeformat bei dieser Herausforderung sehr streng festgelegt, und aus den Kommentaren geht nicht hervor, dass es sich ändern wird.
Jonathan Allan
@ JonathanAllan, zum Glück kann ich das mit einem Flaggenwechsel "reparieren".
Shaggy
3

PHP ,124 119 Bytes

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

Probieren Sie es online!

Schade um die +12 Bytes in PHP, um die Ausgabe in Großbuchstaben zu schreiben ... aber ... trotzdem.

640 KB
quelle
3

Zsh , 85 Bytes

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

Für diese Anzahl von Anweisungen in der for-Schleife ist using ...&&...&&...kürzer als {...;...;...;}.

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)

Probieren Sie es online!

Hier ist eine 81-Byte-Lösung, die [base]#[num]stattdessen in der Form gedruckt wird :

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

Probieren Sie es online!

GammaFunktion
quelle
3

J , 67 Bytes

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

Probieren Sie es online!

Galen Ivanov
quelle
2

Kohle , 38 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

Nθ

Geben Sie die Ganzzahl ein.

≔EE³⁴↨θ⁺²ι

Konvertiere es von Basis 2 zu Basis 36 ...

L⁺ιΦι⁼λ⌕ικη

... deduplizieren, verketten und die Länge nehmen.

≔⁺²⌕η⌊ηη

Nehmen Sie den Index der minimalen Komplexität und addieren Sie 2, um die Basis zu erhalten.

Iη ↥⍘θη

Gibt die Basis und die Ganzzahl, die in diese Basis konvertiert wurden, in Großbuchstaben aus.

Neil
quelle
2

Gelee , 25 Bytes

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

Probieren Sie es online!

Ein monadischer Link, der eine Ganzzahl als Argument verwendet und eine Jelly-Zeichenfolge des gewünschten Formats zurückgibt. Wenn eine Liste mit zwei Elementen eine akzeptable Ausgabe darstellt (gemäß den meisten Herausforderungen), könnten 2 Bytes eingespart werden. Wenn Basis 1 für den Flankenfall 1 als Eingabe akzeptabel wäre, könnten weitere 2 Bytes eingespart werden.

Nick Kennedy
quelle
2

Brachylog , 44 Bytes

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

Probieren Sie es online!

Das tut ein bisschen weh zu schreiben.

Nicht verwandte Zeichenfolge
quelle
1

Perl 5 , 161 Bytes

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)):''}

Probieren Sie es online!

Kjetil S.
quelle
1

Python 2 , 140 135 Bytes

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''

Probieren Sie es online!

Chas Brown
quelle
1

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

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

Probieren Sie es online!

Xcali
quelle
1

Wolfram Language (Mathematica) , 109 111 Bytes

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

+2: behoben. Danke für den Fang @Roman

OrderingBy wurde in Mathematica 12.0 eingeführt, auf das TIO noch nicht aktualisiert zu sein scheint.

attinat
quelle
"Wenn mehrere Basen den gleichen Wert für das Kriterium angeben, wählen Sie die kleinste unter ihnen aus.": OrderingByEntspricht dieser Anforderung nicht.
Roman
Vielleicht mit etwas MinimalBy, wie diese ?
Roman
@Roman nicht wahr? Soweit ich das
beurteilen
2
Mit dem Argument 123wird Ihre Lösung 36 3Fanstelle der erforderlichen gedruckt 12 A3. Von OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]bekomme ich die Antwort {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}, so dass die übliche Annahme, dass keine gleichwertigen Einträge nachbestellt werden, hier ignoriert zu werden scheint. Mein $VersionName ist "12.0.0 für Mac OS X x86 (64-Bit) (7. April 2019)".
Roman
Ah, du hast recht. Es ist schlimm, dass ich das nicht bemerkt habe.
14.
1

C (clang) , 165 Bytes

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,_);}

Probieren Sie es online!

n // eingabe

, i = 2 // Iterator von Basis 2 bis 36

, j // aktuelle Komplexität

, p = 99 // beste Komplexität

, r // result = Iterator

, m // temporäre Kopie von n

, x; // m% i

char * g // aktueller String ptr

, * _ // am besten str ptr

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

/ * [37 + 37] = [erhaltene Zeichenfolgen + Test für verwendete Zeichen] * /

t (n) {

für (; g = b [i], // bewege ptr

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

   ++i){//for every base

für (j = 0, m = n; m; m / = i, // Ziffer extrahieren

   *--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; // Inkrementiere Byte relativ zum Zeichen

// und wenn es 0 war, erhöht sich j um 2: 1 für das neue Zeichen und 1 für die Stellenzahl

// sonst nur Ziffern zählen + Zeiger bewegen

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

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

}

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

}

AZTECCO
quelle
1
163 Bytes können mehrmals aufgerufen werden.
Ceilingcat
1

Japt v2.0a0, 31 Bytes

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

Versuch es

Verkörperung der Ignoranz
quelle