Diese Herausforderung ist eine Hommage an den PPCG- Benutzer Dennis , der den Räuberteil des Programmiersprachen-Quiz gewonnen hat .
Wenn wir Dennis 'PPCG-Profilseite betrachten , können wir einige ziemlich beeindruckende Dinge sehen:
Er hat derzeit mehr als acht-sechzig tausend Ruf, was ihn an zweiter Stelle in Gesamt rep und übertrifft damit die dritten Platz von fast dreißigtausend. Er hat vor kurzem gewann unsere Wahl für einen neuen Moderator und bekam einen glänzenden neuen Diamanten neben seinen Namen. Aber ich persönlich denke, der interessanteste Teil an Dennis ist seine PPCG-Benutzer-ID-Nummer: 12012.
Auf den ersten Blick 12012
sieht es fast wie ein Palindrom aus , eine Zahl, die umgekehrt dasselbe liest, aber ein wenig verkehrt ist. Es kann das Palindrom werden, 21012
wenn wir die Positionen des ersten 1
und vertauschen 2
, und es kann das Palindrom werden, 12021
wenn wir das letzte 1
und vertauschen 2
. Befolgen Sie außerdem die Konvention, dass führende Nullen in einer Zahl nicht geschrieben werden, und tauschen Sie die ersten 1
und die 0
Ergebnisse aus, 02112
oder vielmehr, 2112
was ein anderes Palindrom ist.
Definieren wir eine Dennis-Zahl als positive Ganzzahl, die selbst nicht palindrom ist, sondern durch Vertauschen der Positionen von mindestens einem Paar von zwei beliebigen Ziffern in ein Palindrom umgewandelt werden kann. Die Reihenfolge einer Dennis-Zahl ist die Anzahl unterschiedlicher Ziffernpaare, die ausgetauscht werden können, um ein (nicht notwendigerweise unterschiedliches) Palindrom zu bilden.
So ist die Reihenfolge der 12012
3 , da 3 verschiedene Paare ihrer Ziffern ( 12012
, , ) um Palindrome zu erzeugen , ausgelagert werden. zufällig ist es die kleinste 3-Dennis-Zahl.12012
12012
12012
10
ist die kleinste Dennis-Zahl und hat die Ordnung 1, weil das umschalten 1
und aka was ein Palindrom 0
ergibt .01
1
Die imaginären führenden Nullen einer Zahl zählen nicht als umschaltbare Ziffern. Zum Beispiel ändert 8908
an 08908
und die ersten beiden Ziffern Vertauschen der Palindrom zu bekommen 80908
ist ungültig. 8908
ist keine Dennis-Nummer.
Man könnte sagen, dass Nicht-Dennis-Nummern die Ordnung 0 haben.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl N aufnimmt und die N-kleinste Dennis-Zahl zusammen mit ihrer Reihenfolge in einem vernünftigen Format wie 12012 3
oder ausgibt oder zurückgibt (12012, 3)
.
Beispiel: 12012
Ist die 774. Dennis-Nummer 774
, sollte die Ausgabe etwa so lauten, wenn es sich um die Eingabe für Ihr Programm handelt 12012 3
. (Seltsamerweise ist 774 eine andere Dennis-Nummer.)
Der kürzeste Code in Bytes gewinnt.
Hier sind die ersten 20 Dennis-Nummern und ihre Referenzbestellungen:
N Dennis Order
1 10 1
2 20 1
3 30 1
4 40 1
5 50 1
6 60 1
7 70 1
8 80 1
9 90 1
10 100 1
11 110 2
12 112 1
13 113 1
14 114 1
15 115 1
16 116 1
17 117 1
18 118 1
19 119 1
20 122 1
quelle
Antworten:
Pyth, 44 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Ein dummer kleiner Fehler (?) In Pyth hat eine 41-Byte-Lösung ruiniert.
Erläuterung:
quelle
.f
. Hier ist die Pull-Anfrage, die ich wegen dieser Frage gestellt habe: github.com/isaacg1/pyth/pull/151CJam, 45 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell, 174 Bytes
p
prüft, ob eine Liste ein Palindrom ist.x!y
ist,True
wenn sich die Listenx
undy
(die die gleiche Länge haben sollten) an genau zwei Stellen unterscheiden. Insbesondere, wennx
es sich um eine Permutation von handelty
, wirdx!y
bestimmt, ob es sich um einen "Swap" handelt.o n
findet die Dennis-Ordnung vonn
. Es filtert nach Swaps zwischen den Permutationen vonx = show n
und zählt dann, wie viele dieser Swaps Palindrome sind. Das Listenverständnis, das diese Zählung durchführt, verfügt über eine zusätzliche Schutzfunktion. Diesnot (p x)
bedeutet, dass es zurückgegeben wird,0
wennn
es sich zunächst um ein Palindrom handelte.Das
snd (span (<'1') v)
Bit ist nurdropWhile
ein Byte kürzer. es verwandelt sich"01221"
in"1221"
.f
Indizes aus einer Liste von(i, o i)
woo i > 0
(dhi
eine Dennis Zahl.) Es normalerweise ein Off-by-one Fehler hier wäre, da(!!)
zählt von 0 , aber das Problem zählt von 1 gelang es mir , hier Abhilfe zu schaffen , indem die Suche von Start-10
(die hat sich in meinem Programm als Dennis-Nummer herausgestellt!) und dabei alle Zahlen an die richtigen Stellen geschoben.f 774
ist(12012,3)
.quelle
Python 2, 176
Ich kann mir nicht vorstellen, dass mein Tauschcode besonders optimal ist, aber das ist das Beste, was ich bekommen habe. Mir gefällt auch nicht, wie oft ich zwischen String und Integer konvertiere ...
Für jede Zahl wird eine Liste erstellt, aus der hervorgeht, ob alle zweistelligen Tauschvorgänge Palindrome sind. Der Zähler wird dekrementiert, wenn mindestens einer dieser Werte wahr ist und die ursprüngliche Zahl kein Palindrom ist. Da
0+True
in Python1
die Summe der Endergebnisse ausgewertet wird, arbeitet die Liste in der Reihenfolge der Dennis-Nummer.quelle
Rust, 390 Bytes
Das neue Java? : /
Ungolfed und kommentiert:
quelle
Gelee , 33 Bytes (nicht konkurrierend)
Probieren Sie es online!
Wie es funktioniert
quelle
APL, 87
Der Schleifenrumpf gibt einen Vektor mit 4 Zahlen zurück: 1)
⍺
das von der Eingabe gelesene linke Argument , 2) die Anzahl der bisherigen Dennis-Zahlen, 3) den aktuellen Wert desX
Schleifenzählers und 4)K
die als Summe der Palindrome berechnete Reihenfolge innerhalb von 1-Swap-Permutationen. Es endet, wenn die ersten beiden Elemente gleich werden und die letzten beiden als Ergebnis zurückgegeben werden.quelle
JavaScript (ES6), 229
Wie üblich glänzt JavaScript durch seine Unfähigkeit zur Kombinatorik (oder vielleicht ist es meine Unfähigkeit ...). Hier bekomme ich alle möglichen Swap-Positionen, wobei alle Binärzahlen der angegebenen Länge und nur 2 gesetzt sind.
Testen Sie die Ausführung des folgenden Snippets in Firefox (da MSIE nicht mit EcmaScript 6 kompatibel ist und in Chrome noch Standardparameter fehlen).
quelle
awk, 199
Struktur
Verwendungszweck
Fügen Sie dies in Ihre Konsole ein und ersetzen Sie die Nummer danach
echo
, wenn Sie möchtenBei höheren Zahlen wird es langsam;)
Ungolfed wiederverwendbare Version
quelle
Rubin, 156
Verwendet die Ruby-Funktion, bei der der Aufruf
"19".next!
zurückkehrt"20"
, um zu vermeiden, dass Typen hin und her konvertiert werden müssen. Wir verwenden nur einen regulären Ausdruck, um das Führen zu ignorieren0s
. Durchläuft alle Paare von Zeichenfolgenpositionen, um nach palindromischen Schaltern zu suchen. Ich schrieb dies ursprünglich eine rekursive Funktion, aber es sprengt den Stapel.Die Ausgabe für 774 ist
["12012", 3]
(das Entfernen der Anführungszeichen würde 4 weitere Bytes kosten, aber ich denke, die Spezifikation erlaubt es ihnen).quelle