Die Aufgabe
Dies ist eine einfache Herausforderung. Ihre Eingabe ist eine einzelne nicht leere Zeichenfolge, die nur Ziffern 0123456789
und Hashes enthält #
. Es enthält genau eine Ziffernfolge, die eine nichtnegative Ganzzahl codiert und möglicherweise das Ende der Zeichenfolge umschließt, und mindestens eine #
. Die Ganzzahl kann führende Nullen haben. Zum Beispiel ##44##
, 013####
und 23###1
gelten Eingänge, während ###
, 0099
und #4#4
ist es nicht.
Ihre Aufgabe ist es, die Ganzzahl n
aus der Zeichenfolge zu extrahieren und die Zeichenfolge schrittweise n
nach rechts gedreht auszugeben .
Beispiele
- Die Eingabe
#1##
sollte 1 Schritt nach rechts gedreht werden, damit die Ausgabe korrekt ist##1#
. - Die Eingabe
#026###
sollte 26 Schritte nach rechts gedreht werden, da die führende 0 ignoriert wird. Die korrekte Ausgabe ist26####0
. - Die Eingabe
1####2
enthält die Ganzzahl 21, die über das Ende gewickelt ist, und sollte daher um 21 Schritte nach rechts gedreht werden. Die korrekte Ausgabe ist##21##
.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Sie können davon ausgehen, dass die Nummer n
in den Standardtyp int
Ihrer Sprache passt . Umgekehrt, wenn dieser Standardtyp int
Ganzzahlen mit willkürlicher Genauigkeit implementiert, müssen Sie (theoretisch) eine willkürlich große Zahl unterstützen n
.
Testfälle
#1## -> ##1#
##4## -> #4###
1####1 -> ####11
1####2 -> ##21##
#026### -> 26####0
#000### -> #000###
###82399 -> ##82399#
51379#97 -> #9751379
#98##### -> ###98###
#######4## -> #4########
60752#1183 -> 8360752#11
####99366800## -> 366800######99
########9##### -> ###9##########
91#####515694837 -> 1#####5156948379
###6114558###### -> #6114558########
######219088736090042#### -> 9088736090042##########21
#46055080150577874656291186550000138168########### -> 0138168############4605508015057787465629118655000
568375993099127531613012513406622393034741346840434468680494753262730615610086255892915828812820699971764142551702608639695081452206500085233149468399533981039485419872101852######################3680 -> 99533981039485419872101852######################36805683759930991275316130125134066223930347413468404344686804947532627306156100862558929158288128206999717641425517026086396950814522065000852331494683
n
die in den Muttersprachentypint
Ihrer Sprache passen (der möglicherweise eine willkürliche Genauigkeit aufweist). Ich werde den Aufforderungstext später aktualisieren.1234
?Antworten:
CJam, 11 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Beachten Sie, dass dies in den letzten beiden Testfällen nicht funktioniert, da die beteiligten Zahlen nicht in 64 Bit passen.
Wie es funktioniert
quelle
Julia,
7165 BytesDies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Wir hängen die Eingabe an sich selbst an, teilen sie
#
als Trennzeichen in ein Array auf , analysieren jede Ganzzahl und nehmen das Maximum. Dies legt fest, wie oft die Zeichenfolge nach rechts verschoben wird. Wir teilen den String in einChar
Array auf, verschieben ihn und setzenjoin
ihn wieder zusammen.quelle
Python, 66 Bytes
quelle
Retina,
6557498 Bytes gespart dank Martin!
Probieren Sie es online!
Beachten Sie, dass für die sehr großen Online-Testfälle und für einige der größeren auf den meisten vernünftigen Computern das Zeitlimit überschritten wird.
Dies nimmt die letzte Nummer in der Zeichenkette und die erste oder keine Nummer in der Zeichenkette und setzt sie vor die Zeichenkette. Dann konvertiert es diese kombinierte Zahl in eine unäre Zahl und dreht sie wiederholt, während es eine unäre Ziffer fallen lässt.
quelle
Gelee,
1210 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Angenommen, die Eingabe ist
51379#97
.Durch zweimaliges Wiederholen der Zeichenfolge (
51379#9751379#97
) können wir sicherstellen, dass sie eine zusammenhängende Darstellung der Zahl enthält.Als nächstes wenden wir bitweise NICHT auf alle Zeichen an. Dieser versucht, auf int umzuwandeln, sodass '1' zu 1 ausgewertet und dann auf ~ 1 = -2 abgebildet wird . Bei einem Fehler (
#
) wird 0 zurückgegeben .Für unser Beispiel gibt dies
Als nächstes teilen wir bei Nullen, um den Teil, der die Zahl codiert, vom Rest zu trennen.
Bitweise NICHT abbildet n zu n - 1 , so dass wir jede Erhöhung zu erhalten -n .
Als nächstes konvertieren wir jede Liste von der Basis 10 in eine Ganzzahl.
Die niedrigste Zahl ist das Negativ der gesuchten. Da sich das Jelly-List-Rotationsatom
ṙ
nach links dreht , vermeiden Sie das Multiplizieren mit -1 , um sich nach rechts zu drehen.Wie es funktioniert
quelle
MATL ,
28251716 Bytes8 Bytes weniger als Dennis 'Idee, das Array aufzuteilen und die Reihenfolge der Teile umzukehren
Die beiden letzten Testfälle funktionieren nicht, weil die Anzahl zu groß ist.
EDIT (20. MAI 2016) Der Code in den Link verwendet
Xz
stattXv
, in der Sprache , auf die jüngsten Veränderungen zurückzuführen ist .Probieren Sie es online!
quelle
PowerShell, 153 Byte
(Siehe aber den Abschnitt "Extra Credit" weiter unten)
PowerShell hat nicht das Konzept, ein Array zu "verschieben", daher musste ich meine eigene Lösung entwickeln. Für größere Zahlen wird es lange dauern , aber irgendwann sollte alles fertig sein, was in eine 32-Bit-Ganzzahl passt.
Übernimmt Eingaben
$a
und legt eine neue Variable$d
als Objekt [System.Collections.ArrayList] fest . Dies ist darauf zurückzuführen, dass Arrays in PowerShell technisch gesehen unveränderlich sind (weiter unten unter "Zusätzliche Gutschrift" erläutert) und daher keine willkürlichen Einfügungen oder Entfernungen unterstützen, die zum Verschieben erforderlich sind. Dann betreten wir einefor
Schleife.Die Ausgangsbedingung ist ein Trick, den ich gefunden habe: Wenn wir die Eingabe zusammenfügen, aufteilen
#
und Leergut ignorieren, entspricht das zweite Element des resultierenden Arrays unserer Zahl, unabhängig vom Zeilenumbruch. Wir setzen das auf$b
und dekrementieren$b
jedes Mal, bis es Null ist.Bei jeder Iteration setzen wir den Helfer
$r
als letztes Element in der Array-Liste, entfernen das letzte Element und fügen dann das Element auf der Vorderseite ein. Dadurch wird das Array effektiv um ein Element nach rechts verschoben.Schließlich geben wir einfach mit aus,
-join$d
damit es zu einer Zeichenfolge verkettet wird.Extra Gutschrift
Wenn das Problem darin bestand, das Array nach links statt nach rechts zu verschieben , können wir es durch Mehrfachzuweisung erheblich verkürzen . Grundsätzlich gilt: "Wenn der Zuweisungswert mehr Elemente als Variablen enthält, werden alle verbleibenden Werte der letzten Variablen zugewiesen."
Im Wesentlichen bedeutet dies so etwas wie
$c=@(1,2,3)
und$a,$b=$c
wird
$a=1
ein Int und$b=@(2,3)
ein Array haben.PowerShell, 90 Byte, führt eine Linksverschiebung anstelle einer Rechtsverschiebung durch
Hier nehmen wir noch einmal die Eingabe und setzen
$b
wie oben. Wir werden$a
als Char-Array neu umgewandelt und geben dann dieselbefor
Schleife wie oben ein. Dieses Mal mussten wir jedoch kein willkürliches Entfernen / Einfügen unterstützen, sodass wir weder das kostspielige[System.Collections.ArrayList]
Objekt noch die teuren Methodenaufrufe verwenden müssen. Stattdessen stellen wir einfach$r
das erste Element von ein$a
und die restlichen Elemente werden in gespeichert$a
. Dann machen wir+=
es wieder bis zum Ende.(Wie ich bereits sagte, sind PowerShell-Arrays technisch unveränderlich, aber der
+=
Operator hier ist überladen. Er nimmt ein Array und ein anderes Objekt auf, fasst sie zu einem neuen Array zusammen (Fachbegriff), gibt das zurück und speichert es als Variablennamen und zerstört es Funktionell haben wir gerade ein Element am Ende des Arrays hinzugefügt, aber technisch (und aus Sicht der Speicher- / Speicherbereinigung usw.) handelt es sich um ein brandneues Array. Dies kann offensichtlich zu einer kostspieligen Operation werden Wenn das Array groß oder komplex ist, ist die Kehrseite: Da Arrays unveränderlich sind, ist es sehr billig, sie zu indizieren oder darüber zu iterieren.)Die Ausgabe bleibt dieselbe Aktion, mit der
-join
Anweisung, sie in eine einzelne Zeichenfolge umzuwandeln.quelle
Im Ernst, 21 Bytes
Probieren Sie es online!
Warnung: Diese Lösung ist sehr ineffizient, sodass bei größeren Testfällen eine Zeitüberschreitung bei TIO auftritt. Verwenden Sie den lokalen Dolmetscher.
Erläuterung:
quelle
Mathematica, 69 Bytes
Suchen Sie Zahlenfolgen in, wenn es 2 gibt, muss deren Reihenfolge umgekehrt werden. Verketten Sie die Zeichenfolgen (wenn es nur eine ist, wird nur die Zahlenzeichenfolge zurückgegeben). Konvertieren Sie die Zeichenfolge in eine numerische Zeichenfolge und drehen Sie sie so oft.
quelle
FromDigits
funktioniert stattToExpression
.Pyth,
2214 BytesProbieren Sie es hier aus!
Erläuterung
Dies funktioniert für alle Testfälle und endet auch bei sehr großen Zahlen sofort.
quelle
-...\#
anstelle von tunh:..."\d+"1
. Es ist auch nicht erforderlich,z
Zeichen in eine Liste zu konvertieren , dies.>
funktioniert auch mit einer Zeichenfolge.JavaScript (ES6) 66
Ausnahmsweise ist das blöde Negativ
%
von Javascript für negative Zahlen nützlichquelle
b+a
ist eine String-Verkettung.a='32',b='1', (b?b+a:a)=='132', (b|0+a)==33
Pyth, 10 Bytes
Probieren Sie es online aus. Testsuite.
Dies ist eine Übersetzung von Dennis 'CJam-Antwort . Ich mache es zu einem Community-Wiki, da ich es mir nicht ausgedacht habe.
Erläuterung
quelle
JavaScript (ES6),
6764 BytesEin weiterer Port von Dennis 'CJam-Antwort.
Bearbeiten: 3 Bytes gespart, indem der Teil der Antwort von edc65 übernommen wurde, auf den er nicht aufmerksam gemacht hat.
quelle
s+s
stattdessen den Trick kopiert . (Ich habe letzte Nacht darüber nachgedacht, aber ich war zu müde, um es zu probieren.)Perl 5, 41 Bytes
39 Bytes plus zwei für die
-lF
Flags (-M5.01
ist frei):perl -lF -M5.01 script.pl
Erläuterung:
-lF
Liest die Eingabe, entfernt den abschließenden Zeilenumbruch, fügt den Rest in den String ein$_
, teilt ihn in Zeichen auf und fügt diesen in das Array ein@F
./#+/
Findet die erste Zeichenkette von#
s in$_
und setzt sie$`
gleich dem Zeug davor und$'
gleich dem Zeug danach. Wenn$`
leer ist,$'
können weitere#
s enthalten sein . Es handelt sich jedoch$'.$`
um eine Zeichenfolge, deren anfänglicher Teilstring angibt, wie oft das Array gedreht werden soll.1..$'.$`
, die$'.$`
als Ganzzahl behandelt und damit nummeriert wird, wodurch alle abschließenden#
s entfernt werden. Die Liste gibt also an1
, wie oft das Array gedreht werden soll.pop
das letzte Element undunshift
es an den Anfang).say
alle Elemente des gedrehten Arrays.quelle
Ruby -
687270 Bytessplit
wandelt einen String in ein Array um(s+s).scan(/\d+/)
Verketten Sie den String mit sich selbst und erhalten Sie ein Array von Zahlen (als Strings)map(&:to_i)
Zeichenketten in Ints konvertierenmax
wähle den größten introtate
max
mal*""
konvertiere das Array zurück in einen String (Abkürzung fürjoin
)Verwendung :
ruby scriptname.rb "[string]"
quelle
05AB1E ,
1413 BytesNun, es ist sehr unwahrscheinlich, dass der Code für Zahlen größer als 100000 endet, aber wenn Sie geduldig genug sind, wird es eine Ausgabe geben :). Code:
Erläuterung:
Probieren Sie es online!
Verwendet die CP-1252- Codierung
quelle
VBSCRIPT,
8299 BYTESDer vorherige Code behandelte keine Fälle, bei denen die Nummer über dem Ende steht
UNGOLFED
das nervt irgendwie ... es gibt wahrscheinlich eine bessere Möglichkeit, dies zu tun, sogar in VBscript
quelle
a
befindet sich die Funktionseingabe und sie gibt die Ausgabe zurück? Auf diese Weise würden Sie dieinputbox
undmsgbox
-Anrufe nicht benötigen .b
?Mathematica,
7358 BytesViel Byte. 15 Bytes gespeichert Dank an IPoiler
quelle
StringRotateRight
spart hier ein paar Bytes.Matlab (73)
quelle
matlab
(86)72Die Funktion summiert die Zeichenfolge zweimal, einmal für die Ganzzahlextraktion, zweitens für die gewünschte Aufgabe, und es dauert nicht allzu lange, da Matlab
(Dim)modulus(Length)
mit der Ausnahme, dass es bei größeren Bereichen zu Segmentierungsfehlern kommt , weiter rotiert .Wird kämpfen, wie man es mehr Golf spielt ....
(86)
quelle