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 402
leichter zu merken als die Nummer 110010010
, und die Nummer 337377
ist 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 65535
sieht 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-9
und die englischen Buchstaben A-Z
zur 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
quelle
a-z
statt verwendenA-Z
?A-Z
?Antworten:
Python 2 ,
150149127144 BytesProbieren Sie es online!
Python 3 , 136 Bytes
Probieren Sie es online!
Python 3.8 (Vorabversion) , 131 Byte
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.quelle
05AB1E ,
1614 Bytes-1 Byte dank Kevin Cruijssen
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:
quelle
₆L©B®ø
anstelle von₆LεBy‚}
ā
, scheint, als hättest du dieses immer vergessen.Perl 6 ,
5554 Bytes-1 Byte danke an Jo King.
Probieren Sie es online!
quelle
@$_
statt.[*]
für minus ein ByteJavaScript (ES6),
87 85101 BytesBearbeiten: +16 unnötige Bytes, um das strikte Ausgabeformat zu erfüllen
Probieren Sie es online!
quelle
Japt v2.0a0
-gS
,2423 BytesNicht 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.
Versuch es
quelle
PHP ,
124119 BytesProbieren Sie es online!
Schade um die +12 Bytes in PHP, um die Ausgabe in Großbuchstaben zu schreiben ... aber ... trotzdem.
quelle
Zsh , 85 Bytes
Für diese Anzahl von Anweisungen in der for-Schleife ist using
...&&...&&...
kürzer als{...;...;...;}
.Probieren Sie es online!
Hier ist eine 81-Byte-Lösung, die
[base]#[num]
stattdessen in der Form gedruckt wird :Probieren Sie es online!
quelle
J , 67 Bytes
Probieren Sie es online!
quelle
Kohle , 38 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie die Ganzzahl ein.
Konvertiere es von Basis 2 zu Basis 36 ...
... deduplizieren, verketten und die Länge nehmen.
Nehmen Sie den Index der minimalen Komplexität und addieren Sie 2, um die Basis zu erhalten.
Gibt die Basis und die Ganzzahl, die in diese Basis konvertiert wurden, in Großbuchstaben aus.
quelle
Stax , 19 Bytes
Führen Sie es aus und debuggen Sie es
Kein ausgefallener Algorithmus, nur unkomplizierte Brute Force. Etwa ein Drittel des Programms arbeitet mit Format-Wrangling für die genauen Ausgaberegeln.
Bonusprogramm : Ausgabe für [1..1000]
quelle
Gelee , 25 Bytes
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.
quelle
Brachylog , 44 Bytes
Probieren Sie es online!
Das tut ein bisschen weh zu schreiben.
quelle
Perl 5 , 161 Bytes
Probieren Sie es online!
quelle
Python 2 ,
140135 BytesProbieren Sie es online!
quelle
Perl 5
-Minteger -MList::Util=uniq,first -ap
,123112 BytesProbieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
109111 Bytes+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.quelle
OrderingBy
Entspricht dieser Anforderung nicht.MinimalBy
, wie diese ?123
wird Ihre Lösung36 3F
anstelle der erforderlichen gedruckt12 A3
. VonOrderingBy[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$Version
Name ist "12.0.0 für Mac OS X x86 (64-Bit) (7. April 2019)".C (clang) , 165 Bytes
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
für (j = 0, m = n; m; m / = i, // Ziffer extrahieren
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
}
quelle
Japt v2.0a0, 31 Bytes
Versuch es
quelle