Inspiriert von diesem Beitrag über Rätsel. Die Spoiler für dieses Rätsel finden Sie weiter unten.
Wenn Sie drei positive Ganzzahlen als Eingabe haben (x, y, z)
, konstruieren Sie den Einschlussbereich [x, y]
, verknüpfen Sie diesen Bereich und entfernen Sie dann z
nicht unbedingt aufeinanderfolgende Ziffern, um die größtmöglichen und kleinsten positiven Ganzzahlen zu erhalten. Führende Nullen sind nicht zulässig (dh die Zahlen müssen mit beginnen [1-9]
). Gib diese beiden Zahlen in beliebiger Reihenfolge aus.
Für das Beispiel aus der Rätselhafte Post, für die Eingabe (1, 100, 100)
möglich , die größte Zahl ist 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
und die kleinste Zahl ist 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100
, im
Anschluss an dem unten Logik von JAFE der Antwort gepostet dort:
- Wir können die Länge der Zahl nicht beeinflussen (es gibt eine feste Anzahl von Stellen). Um den Wert zu maximieren, nehmen wir die maximale erste Stelle, dann die zweite Stelle usw.
- Entfernen Sie die 84 ersten Nicht-Neunen (16 Stellen müssen noch entfernt werden):
999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Die größte Zahl innerhalb der nächsten 17 Ziffern ist 7, daher kann die nächste Ziffer in der Antwort höchstens 7 sein (wir können nicht mehr als 16 Ziffern entfernen). Entfernen Sie also 15 Nicht-7-Zeichen ... (1 Ziffer muss noch entfernt werden):
999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Von hier aus kann die nächste Ziffer höchstens 8 sein, entfernen Sie also eine Nicht-8 aus der Mitte:
99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Ähnliche Logik, aber umgekehrt (dh wir wollen führende
1
s anstelle von führenden9
s) für die kleinste Zahl.
Hier ist ein kleines Beispiel: (1, 10, 5)
.
Wir konstruieren den Bereich 12345678910
und bestimmen, welche 5
Ziffern wir entfernen können, wobei die größtmögliche Anzahl übrig bleibt. Dies bedeutet natürlich, dass wir die führende Ziffer maximieren möchten, da wir die Länge der Ausgabe nicht beeinflussen können. Wenn wir also entfernen 12345
, bleibt uns nichts anderes übrig 678910
, und das ist das größte, was wir machen können. Das kleinste zu machen ist ein bisschen schwieriger, da wir stattdessen Zahlen aus der Mitte herauszupfen können, um 123410
das kleinstmögliche zu erhalten.
Denn (20, 25, 11)
das Ergebnis ist eher langweilig, als 5
und 1
.
Schließlich, um Antworten auszuschließen, die führende Nullen versuchen, (9, 11, 3)
gibt 91011
das wiederum 91
und 10
als die größten und kleinsten.
I / O und Regeln
- Wenn es einfacher / kürzer ist, können Sie zwei Programme / Funktionen codieren - eines für das größte und eines für das kleinste. In diesem Fall ist Ihre Punktzahl die Summe beider Teile.
- Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
- Die Eingabe kann davon ausgegangen werden in Ihrer Sprache nativen Nummerntyp passen, jedoch weder die verkettete Nummer noch der Ausgang kann so tun , angenommen werden.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
quelle
9, 11, 3
würde es tun.Antworten:
Haskell , 162 Bytes
Probieren Sie es online!
Verwendet den von jafe beschriebenen Algorithmus. Es könnte kürzer sein, eine weniger effiziente Methode zu verwenden, aber das Schreiben hat mehr Spaß gemacht :)
Die
%
Operation benötigt 4 Argumente (eigentlich 3, aber was auch immer):m
Diese Funktion wählt das "optimale" Element aus einer Liste aus (entwedermaximum
oderminimum
je nachdem, was wir wollen).f
das ist eine "Filter" -Funktion;n
die Anzahl der Stellen, die noch zu löschen sind; unds
die Zeichenfolge. Zuerst prüfen wir, ob n der Anzahl der in der Zeichenfolge verbleibenden Ziffern entspricht (ich habe es>=
aus Sicherheitsgründen verwendet) und lassen den Rest fallen,s
falls dies der Fall ist . Andernfalls prüfen wir, ob wir noch Ziffern (n>0
) löschen müssen, und zerlegen dannspan
unsere Zeichenfolge in drei Teile:p
die zu löschenden Ziffern,c
die optimal erreichbare Ziffer undr
die verbleibende Zeichenfolge. Wir tun dies, indem wir ein Prädikat übergeben, das die Gleichheit mit unserer optimalen Ziffer vergleicht. Um diese Ziffer zu finden, nehmen wir die erstenn+1
Ziffern der Zeichenkette, filtern sie und übergeben sie dann an unsere "Auswahl" -Funktion. Jetzt geben wir einfach unsere optimale Ziffer und wiederholen sie, indem wir die Länge vonp
(die Anzahl der gesunkenen Ziffern) von subtrahierenn
. Beachten Sie, dass wir unsere Filterfunktion nicht an den rekursiven Aufruf übergeben, sondern durch ersetzenid
. Dies liegt daran, dass der Filter nur dazu dient, die Auswahl von führenden Nullen zu vermeiden,minimum
wenn dies nur für die erste Iteration relevant ist. Danach brauchen wir keinen Filter mehr.%
ist wirklich nur eine Hilfsfunktion für#
die unsere „echte“ Funktion ist, nehmenx
,y
undz
. Wir verwenden ein Listenverständnis, um Wiederholungen zu vermeiden. Wir iterieren über unsere Funktionstupel und übergeben sie%
zusammen mitz
und der verketteten Zeichenfolge. Diese Zeichenfolge wird mit dem Magic-Monad-Operator erstellt(=<<)
, der in diesem Zusammenhang wie folgt funktioniertconcatMap
.quelle
Gelee , 17 Bytes
Probieren Sie es online!
Berechnet alle Möglichkeiten und behält dann die größten und kleinsten bei.
Linkes Argument:
x,y
um den Bereich zu konstruieren. Richtiges Argument:z
Zu entfernende Ziffern.quelle
Python 2 , 143 Bytes
Probieren Sie es online!
Dies funktioniert, indem alle Kombinationen der Zielgröße berechnet werden (die Elementreihenfolge bleibt erhalten) und die kleinsten / größten Zahlen daraus erhalten werden
quelle
Kohle , 56 Bytes oder 21 +
4635 =6756 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie
x
und einy
, erstellen Sie einen Inklusivbereich und fügen Sie die Zahlen zu einer Zeichenfolge zusammen.Schleife einmal für jede zu entfernende Ziffer.
Erstellen Sie eine Liste von Zeichenfolgen, indem Sie jedes mögliche Zeichen aus der aktuellen Zeichenfolge entfernen und das Maximum verwenden.
Drucken Sie das Ergebnis.
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie
x
und einy
, erstellen Sie einen Inklusivbereich und fügen Sie die Zahlen zu einer Zeichenfolge zusammen.Geben Sie es ein
z
und erhöhen Sie es. Ich erstelle dann eine Liste dieser Länge: Ich muss in der Lage sein,z
innerhalb des folgenden Filters zu inkrementieren , aber nur Befehle dürfen Variablen inkrementieren; Es gibt eine Lücke,PushOperator
die die Länge der Liste erhöht.Filtern Sie nach den Zeichen, die gesucht werden sollen, indem Sie sicherstellen, dass der aufteilbare Bereich keine niedrigeren Zeichen enthält. Die Region beginnt mit den ersten
z+1
Zeichen (da das erste Zeichenz
bei Bedarf entfernt werden kann) und erhöht den Endpunkt für jedes Zeichen, das beibehalten wird. Es wird darauf geachtet, für das erste Zeichen keine Null zu wählen.Der schnellere Algorithmus ist 30 Byte, wenn er zur Berechnung der größtmöglichen Anzahl verwendet wird:
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: Ich habe seitdem in der Lage, die beiden oben genannten zu einer zweiten 56-Byte-Lösung zu kombinieren, die beide Ergebnisse generiert:
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Generieren Sie die Anfangszeichenfolge.
Stellen Sie
z+1
die Länge der Liste dar.Kehren Sie die Liste um, klonen Sie sie und speichern Sie das Ergebnis.
Drucken Sie die beiden Ergebnisse in separaten Zeilen. (Eine andere Möglichkeit besteht darin, die Ergebnisse mit einem wörtlichen
\r
Zeichen zu trennen .)Generieren Sie die größtmögliche Anzahl.
Generieren Sie mithilfe der geklonten Liste die kleinstmögliche Anzahl, um den Überblick zu behalten
z
.quelle
Jelly ,
1918 BytesProbieren Sie es online!
Sehr ineffizient, definitiv kein Punkt für das Gehen( 19292) =305812874887035355118559193163641366325011573739619723360
1, 100, 100
alsquelle
05AB1E , 16 Bytes
Probieren Sie es online!
Vollständiges Programm, Eingaben in dieser Reihenfolge lesen: y, x, z . Gibt eine Liste mit zwei Zeichenlisten aus.
Erläuterung
quelle
Ć`‚
ist ziemlich schlau, nette Antwort!Matlab, 95 Bytes
Probieren Sie es online!
Gibt eine 1x2 Matrix mit min und max zurück.
Wie es funktioniert
quelle