Ich habe gehört, dass Ihr Code schneller ausgeführt werden kann, wenn Sie ihn in umgekehrter Richtung einrücken, sodass der Compiler ihn wie ein Baummuster von der Spitze der "Zweige" nach unten verarbeiten kann. Dies ist hilfreich, da die Schwerkraft die Kompilierungszeit Ihres Codes verkürzt und die Effizienz der Datenstruktur verbessert. Hier ist ein Beispiel für Java-Scripting:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Aber aus irgendeinem Grund hat Notepad keine Einstellung, um dies automatisch zu tun, deshalb brauche ich ein Programm, um es für mich zu tun.
Beschreibung
Bei Einsendungen muss ein Code-Snippet als Eingabe verwendet, der Einzug umgekehrt und der resultierende Code ausgegeben werden.
Dies geschieht nach folgendem Verfahren:
Teilen Sie den Code in Zeilen auf. Jede Zeile beginnt mit null oder mehr Leerzeichen (es gibt keine Tabulatoren).
Finden Sie alle eindeutigen Einrückungsstufen im Code. Für das obige Beispiel wäre dies zum Beispiel
0 4 8 12
Kehren Sie die Reihenfolge dieser Liste der Einrückungsstufen um und ordnen Sie die umgekehrte Liste der ursprünglichen Liste zu. Dies ist schwer in Worten zu erklären, aber für das Beispiel würde es so aussehen
0 — 12 4 — 8 8 — 4 12 — 0
Wenden Sie diese Zuordnung auf den ursprünglichen Code an. In diesem Beispiel wird eine Zeile mit 0-Leerzeichen-Einrückung um 12 Leerzeichen eingerückt, 4 Leerzeichen werden zu 8 Leerzeichen usw.
Input-Output
Der Ein- und Ausgang kann nach Belieben bereitgestellt werden (STDIN / STDOUT, Funktionsparameter / Rückgabewert usw.); Wenn Ihre Sprache keine mehrzeilige Eingabe unterstützt (oder Sie es einfach nicht möchten), können Sie |
stattdessen das Zeichen verwenden, um Zeilen zu trennen.
Die Eingabe besteht nur aus druckbaren ASCII- und Zeilenumbrüchen und enthält keine Leerzeilen.
Testfälle
Eingang:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Ausgabe: der obige Beispielcode.
Eingang:
a
b
c
d
e
f
g
h
Ausgabe:
a
b
c
d
e
f
g
h
Eingang:
1
2
3
2
1
Ausgabe:
1
2
3
2
1
Eingang:
foo
Ausgabe:
foo
quelle
Antworten:
CJam,
43 39 3635 BytesDas sieht zu lange aus. Ich bin sicher, ich optimiere nicht genug!Wie es funktioniert:
Die Grundidee ist, die Eingabe in Zeilenumbrüchen zu teilen, die Anzahl der führenden Leerzeichen in jeder Zeile zu berechnen, eindeutige Zahlen zu sortieren und zu erhalten, dieses Array zu kopieren und die Kopie umzukehren, die ursprünglichen in der Reihenfolge befindlichen Zahlen mit diesen beiden Arrays zu transliterieren und dann das zu bilden letzte Zeichenfolge unter Verwendung dieser Informationen.
Der längste Teil besteht darin, herauszufinden, wie viele führende Leerzeichen in jeder Zeile vorhanden sind, da CJam keine einfache Möglichkeit bietet, dies zu tun.
Code-Erweiterung:
Und im Geiste der Frage. Eine echte Erweiterung des Codes:
Dank Martin 7 Byte und dank Dennis 1 Byte gespart
Probieren Sie es hier online aus
quelle
{}#
hat einen Fehler: Es gibt eine Ganzzahl zurück, aber es sollte ein Long zurückgeben. Ironischerweisei
behebt (umgewandelt in eine Ganzzahl) dies. 2. Da""#
es nicht den gleichen Fehler gibt,_Sm0=#
ist es ein Byte kürzer.Python 2 -
137131 BytesÜbernimmt die Eingabe mit
|
statt mit\n
.Erläuterung
Die ersten drei Zeilen sind ziemlich einfach. Erstellen Sie eine Liste aller Zeilen in der Eingabe, definieren Sie eine Funktion, die angibt, wie viel führendes Leerzeichen eine Zeichenfolge enthält, und erstellen Sie eine sortierte Liste der Werte, die die Funktion für jede Eingabezeile ausgibt.
Die letzte Zeile macht viel mehr Spaß.
quelle
()
4 fürraw_
)f(s)for s in i
sollte seinmap(f,i)
.d=[];d+=set(L)
ist eine kürzere Version vond=sorted(set(L))
.JavaScript, ES6,
113 103101 ByteIch bin mir ziemlich sicher, dass dies zumindest ein bisschen weiter fortgeschritten sein kann, aber hier geht es weiter.Hätte nie gedacht, dass es eine 101-Byte-JS-Lösung geben wird, die Python schlägt!
Dadurch wird eine Methode namens
f
erstellt, die mit der Eingabezeichenfolge aufgerufen werden kann. Wenn Sie in einem aktuellen Firefox arbeiten, haben Sie Vorlagenzeichenfolgen und können die Methode wie folgt aufrufenAnsonsten kann man es auch gerne nennen
Oder probieren Sie das folgende Snippet:
quelle
\s
ein Leerzeichen ersetzen können) und die Klammernx
in der Ersetzungsfunktion entfernen .(x)
: /b
undc
oder? Sie beziehen sich sowieso nur auf dasselbe Array.Ruby, 63 Bytes
Dies definiert eine unbenannte Funktion, die einen String annimmt und zurückgibt. Sie können es aufrufen, indem Sie es anhängen
["string here"]
oder einer Variablen zuweisen und dann diese Variable aufrufen.So funktioniert es:
s.scan(r=/^ */)
Zeigt eine Liste aller führenden Bereiche und Speicher an, in denen Regexr
zur späteren Verwendung gespeichert ist .uniq
beseitigt Duplikate.sort
... sortiert.Springen Sie nun zum Ende und
l.zip(l.reverse)
geben Sie eine Reihe von Paaren an, die ersetzt werden sollen.to_h
verwandelt das in einen Hash und interpretiert die Paare als Schlüssel-Wert-Paare.s.gsub
Ersetzen Sie nun alle Übereinstimmungen des regulären Ausdrucks (alle führenden Leerzeichen), indem Sie diesen Hash als Nachschlagetabelle verwenden, um den Ersatz zu finden.quelle
Pyth 39
Probieren Sie es online aus.
Verwendet die
|
Trennzeichenoption.quelle
Japt
-R
, 27 BytesProbieren Sie es online!
Ausgepackt und wie es funktioniert
Wie es wirklich funktioniert
quelle
Scala,
176171Am Ende wird eine zusätzliche Zeile eingefügt. Wenn ich keine Leerzeichen am Ende der Zeile beibehalten musste, kann ich es auf 167 bringen:
Ungolfed:
quelle
PowerShell , 112 Byte
Probieren Sie es online!
Weniger golfen:
quelle
Haskell, 116
quelle
PHP - 173 Bytes
Der nicht optimierte Code sollte in der
$v
Variablen gespeichert werden:Hier ist die ungolfed und kommentierte Version:
Ich habe wahrscheinlich noch nie etwas so dreckiges geschrieben. Ich schäme mich.
quelle
JavaScript, 351
Ungolfed-Version:
Testen
Code-Snippet anzeigen
Code-Snippet anzeigen
Code-Snippet anzeigen
Code-Snippet anzeigen
quelle
Perl 5, 112
111 + 1 für
-n
(-E
ist kostenlos)Ich bin mir sicher, dass es mit weniger Hüben möglich ist, aber ich verstehe nicht, wie.
quelle