Oder: "Tauschen Sie den ersten und den letzten Buchstaben jedes Wortes aus."
Ihre Herausforderung besteht darin, die ersten und letzten Buchstaben jedes Wortes zu tauschen, indem Sie eine Folge von alphabetischen ASCII-Zeichen sowie ein weiteres Zeichen als Trennzeichen verwenden. Wenn ein Wort aus einem Zeichen besteht, lassen Sie es in Ruhe.
In den Beispielen / Testfällen werden die Kleinbuchstaben und das Leerzeichen als Begrenzer verwendet.
Sie müssen nicht mit Interpunktion umgehen. Alle Eingaben bestehen nur aus den Buchstaben a bis z, die durch ein Trennzeichen voneinander getrennt sind. Dies ist ein einheitlicher Fall.
Zum Beispiel mit der Zeichenfolge "Hallo Welt":
Input string: "hello world"
Identify each word: "[hello] [world]"
Identify the first and last letters of each word: "[[h]ell[o]] [[w]orl[d]]"
Swap the first letters of each word: "[[o]ell[h]] [[d]orl[w]]"
Final string: "oellh dorlw"
HINWEIS: Das Trennzeichen muss nicht separat eingegeben werden. Das Trennzeichen ist nur das Zeichen, das zum Trennen von Wörtern verwendet wird. Es kann alles sein. Ich wollte kreativen Golfern Optionen offen lassen, also wollte ich mich nicht nur auf Leerzeichen oder neue Linien beschränken. Das Trennzeichen ist nur ein Zeichen, das Wörter in der Eingabezeichenfolge trennt.
Testfälle:
"swap the first and last letters of each word" -> "pwas eht tirsf dna tasl setterl fo hace dorw"
"hello world" -> "oellh dorlw"
"test cases" -> "test sasec"
"programming puzzles and code golf" -> "grogramminp suzzlep dna eodc folg"
"in a green meadow" -> "ni a nreeg weadom"
"yay racecar" -> "yay racecar"
Hello, world!
wird,elloH !orldw
(Satzzeichen als Buchstaben tauschen) oderoellH, dorlw!
(Satzzeichen beibehalten)?Antworten:
TeX, 216 Bytes (4 Zeilen à 54 Zeichen)
Da es nicht um die Anzahl der Bytes geht, geht es um die Qualität der gesetzten Ausgabe :-)
Probieren Sie es online! (Umseitig; nicht sicher, wie es funktioniert)
Vollständige Testdatei:
Ausgabe:
Für LaTeX benötigen Sie nur das Boilerplate:
Erläuterung
TeX ist ein seltsames Biest. Normalen Code zu lesen und zu verstehen, ist eine Selbstverständlichkeit. Das Verständnis von verschleiertem TeX-Code geht noch ein paar Schritte weiter. Ich werde versuchen, dies für Leute verständlich zu machen, die sich mit TeX nicht so gut auskennen. Bevor wir also anfangen, hier ein paar Konzepte zu TeX, damit die Dinge leichter zu befolgen sind:
Für (nicht so) absolute TeX-Anfänger
Erster und wichtigster Punkt in dieser Liste: Der Code muss nicht rechteckig sein, auch wenn die Popkultur Sie dazu veranlasst .
TeX ist eine Makro-Erweiterungssprache. Sie können beispielsweise definieren
\def\sayhello#1{Hello, #1!}
und dann schreiben\sayhello{Code Golfists}
, um TeX zum Drucken zu bringenHello, Code Golfists!
. Dies wird als „nicht begrenztes Makro“ bezeichnet. Um den ersten (und in diesem Fall einzigen) Parameter einzugeben, setzen Sie ihn in geschweifte Klammern. TeX entfernt diese Klammern, wenn das Makro das Argument erfasst. Sie können bis zu 9 Parameter verwenden:\def\say#1#2{#1, #2!}
dann\say{Good news}{everyone}
.Das Gegenstück zu undefinierten oder unzureichend abgegrenzten Makros sind, wenig überraschend, diejenigen begrenzt :) Sie könnten die vorherige Definition mehr ein bisschen machen semantischer :
\def\say #1 to #2.{#1, #2!}
. In diesem Fall folgt auf die Parameter ein sogenannter Parametertext . Solcher Parametertext begrenzt das Argument des Makros (#1
wird durch␣to␣
Leerzeichen eingeschlossen und#2
durch begrenzt.
). Nach dieser Definition können Sie schreiben\say Good news to everyone.
, was zu erweitern wirdGood news, everyone!
. Schön, nicht wahr? :) Ein abgegrenztes Argument ist jedoch (unter Bezugnahme auf das TeXbook ) "die kürzeste (möglicherweise leere) Sequenz von Tokens mit richtig verschachtelten{...}
Gruppen, der in der Eingabe diese spezielle Liste von Tokens ohne Parameter folgt". Dies bedeutet, dass die Expansion von\say Let's go to the mall to Martin
wird einen seltsamen Satz produzieren. In diesem Fall müssten Sie zu „verstecken“ die erste␣to␣
mit{...}
:\say {Let's go to the mall} to Martin
.So weit, ist es gut. Jetzt wird es merkwürdig. Wenn TeX ein Zeichen liest (das durch einen „Zeichencode“ definiert ist), weist es diesem Zeichen einen „Kategoriecode“ (Catcode für Freunde) zu, der definiert, was dieses Zeichen bedeutet. Diese Kombination aus Zeichen- und Kategoriecode ergibt ein Token (mehr dazu hier zum Beispiel). Diejenigen, die für uns hier von Interesse sind, sind im Grunde:
catcode 11 , der Token definiert, die eine Kontrollsequenz bilden können (ein vornehmer Name für ein Makro). Standardmäßig sind alle Buchstaben [a-zA-Z] Kat.-Code 11, sodass ich schreiben kann. Dies
\hello
ist eine einzelne Kontrollsequenz, während\he11o
die Kontrollsequenz\he
von zwei Zeichen1
gefolgt wird, gefolgt von dem Buchstabeno
, da1
es sich nicht um Kat.-Code 11 handelt. Wenn ich tat\catcode`1=11
diesem Punkt aus auf\he11o
eine Steuersequenz sein würde. Eine wichtige Sache ist, dass Catcodes gesetzt werden, wenn TeX das erste Mal das betreffende Zeichen sieht und dieser Catcode eingefroren wird ... FÜR IMMER! (Bedingungen können zutreffen)Kat.-Code 12 , der die meisten anderen Zeichen enthält, wie z. B.
0"!@*(?,.-+/
und so weiter. Sie sind die am wenigsten speziellen Arten von Katcodes, da sie nur zum Schreiben von Gegenständen auf Papier dienen. Aber hey, wer benutzt TeX zum Schreiben?!? (Auch hier gelten möglicherweise die allgemeinen Geschäftsbedingungen.)Catcode 13 , das ist die Hölle :) Wirklich. Hör auf zu lesen und mach etwas aus deinem Leben. Sie möchten nicht wissen, was Catcode 13 ist. Schon mal was von Freitag, den 13. gehört? Ratet mal, woher es seinen Namen hat! Weiter auf eigene Gefahr! Ein Catcode-13-Zeichen, auch als "aktives" Zeichen bezeichnet, ist nicht mehr nur ein Zeichen, sondern selbst ein Makro! Sie können es definieren, um Parameter zu haben und es auf etwas zu erweitern, wie wir es oben gesehen haben. Nachdem du es getan
\catcode`e=13
hast, glaubst du es zu können\def e{I am the letter e!}
, ABER. SIE. KANN NICHT!e
ist nicht mehr ein Brief, so\def
ist nicht das\def
wissen Sie, es ist\d e f
! Oh, wählst du einen anderen Buchstaben, den du sagst? Okay!\catcode`R=13 \def R{I am an ARRR!}
. Sehr gut, Jimmy, probier es aus! Ich wage es, dass Sie das tun und einenR
Code in Ihren Code schreiben ! Das ist ein Catcode 13. ICH BIN RUHIG! Lass uns weitermachen.Okay, jetzt zur Gruppierung. Das ist ziemlich einfach. Alle Zuweisungen (
\def
eine Zuweisungsoperation, auf die\let
wir noch näher eingehen), die in einer Gruppe ausgeführt wurden, werden auf den Stand vor dem Start dieser Gruppe zurückgesetzt, es sei denn, diese Zuweisung ist global. Es gibt verschiedene Möglichkeiten, Gruppen zu starten. Eine davon besteht aus den Zeichen Catcode 1 und 2 (oh, wieder Catcodes). Standardmäßig{
ist Kat.-Code 1 oder}
Anfangsgruppe und Kat.-Code 2 oder Endgruppe. Ein Beispiel:\def\a{1} \a{\def\a{2} \a} \a
Dies wird gedruckt1 2 1
. Außerhalb der Gruppe\a
war1
, dann innerhalb wurde es neu definiert2
, und als die Gruppe endete, wurde es wiederhergestellt1
.Die
\let
Operation ist eine andere Zuweisungsoperation\def
, die jedoch anders ist. Mit definieren\def
Sie Makros, die sich zu Dingen erweitern, mit denen Sie Kopien von bereits vorhandenen Dingen erstellen. Nach (das ist optional) können Sie den Start des Beispiels von dem obigen Punkt mit dem Kat.-Code 13 auf ändern und Spaß damit haben. Oder besser, anstatt Sachen brechen Sie können beheben (würden Sie sich das an!) , Um das Beispiel: . Kurze Frage: Könnten Sie umbenennen ?\let
\let\blub=\def
=
e
\blub e{...
R
\let\newr=R \catcode`R=13 \def R{I am an A\newr\newr\newr!}
\newR
Schließlich die sogenannten "Störräume". Dies ist eine Art Tabuthema, da es Leute gibt, die behaupten, dass der Ruf, der durch die Beantwortung von „unechten Leerzeichen“ -Fragen im TeX - LaTeX Stack Exchange erworben wurde, nicht berücksichtigt werden sollte, während andere dies ausdrücklich ablehnen. Mit wem sind Sie einverstanden? Platzieren Sie Ihre Wetten! Unterdessen: TeX versteht einen Zeilenumbruch als Leerzeichen. Versuchen Sie, mehrere Wörter mit einem Zeilenumbruch (keine Leerzeile ) dazwischen zu schreiben . Fügen Sie nun
%
am Ende dieser Zeilen ein hinzu. Es ist, als ob Sie diese Zeilenende-Leerzeichen „auskommentiert“ hätten. Das ist es :)(Art von) den Code Unolfing
Lassen Sie uns aus diesem Rechteck etwas machen, dem (wohl) leichter zu folgen ist:
Erklärung der einzelnen Schritte
Jede Zeile enthält eine einzelne Anweisung. Gehen wir nacheinander und sezieren sie:
{
Zuerst starten wir eine Gruppe, um einige Änderungen (nämlich Änderungen am Catcode) lokal zu halten, damit sie den eingegebenen Text nicht durcheinander bringen.
\let~\catcode
Grundsätzlich beginnen alle TeX-Verschleierungscodes mit dieser Anweisung. Standardmäßig ist sowohl in TeX als auch in LaTeX das
~
Zeichen das einzige aktive Zeichen, das zur weiteren Verwendung in ein Makro umgewandelt werden kann. Und das beste Werkzeug zur Verrückung von TeX-Code sind Catcode-Änderungen. Daher ist dies im Allgemeinen die beste Wahl. Jetzt\catcode`A=13
können wir statt schreiben~`A13
(das=
ist optional):~`A13
Jetzt ist der Buchstabe
A
ein aktiver Charakter und wir können ihn definieren, um etwas zu tun:\defA#1{~`#113\gdef}
A
ist jetzt ein Makro, das ein Argument akzeptiert (das ein anderes Zeichen sein sollte). Zuerst wird der Catcode des Arguments in 13 geändert, um es zu aktivieren:~`#113
(Ersetzen Sie das Argument~
durch\catcode
und fügen Sie ein hinzu,=
und Sie haben :)\catcode`#1=13
. Schließlich verbleibt ein\gdef
(global\def
) im Eingabestream. Kurz gesagt,A
macht ein anderes Zeichen aktiv und beginnt mit seiner Definition. Lass es uns versuchen:AGG#1{~`#113\global\let}
AG
first “activates”G
und does\gdef
, woraufhin nextG
die Definition startet. Die Definition vonG
ist der von sehr ähnlich, mit derA
Ausnahme, dass stattdessen\gdef
a\global\let
(es gibt kein\glet
ähnliches\gdef
) verwendet wird. Kurz gesagt,G
aktiviert einen Charakter und macht ihn zu etwas anderem. Machen wir Verknüpfungen für zwei Befehle, die wir später verwenden werden:GFF\else
GHH\fi
Jetzt können wir statt
\else
und\fi
einfachF
und verwendenH
. Viel kürzer :)AQQ{Q}
Jetzt verwenden wir
A
wieder ein anderes Makro zu definieren,Q
. Grundsätzlich gilt die obige Aussage (in einer weniger verschleierten Sprache)\def\Q{\Q}
. Dies ist keine besonders interessante Definition, hat aber eine interessante Funktion. Sofern Sie keinen Code knacken möchten, ist das einzige Makro, dasQ
sichQ
selbst erweitert, so dass es sich wie ein eindeutiger Marker verhält (es wird Quark genannt ). Sie können die\ifx
Bedingung verwenden, um zu testen, ob das Argument eines Makros wie folgt lautet\ifx Q#1
:AII{\ifxQ}
Sie können also ziemlich sicher sein, dass Sie einen solchen Marker gefunden haben. Beachten Sie, dass ich in dieser Definition das Leerzeichen zwischen
\ifx
und entfernt habeQ
. Normalerweise würde dies zu einem Fehler führen (beachten Sie, dass das Syntax-Highlight dies für\ifxQ
eine Sache hält), aber da es sich jetztQ
um Catcode 13 handelt, kann es keine Kontrollsequenz bilden. Achten Sie jedoch darauf, diesen Quark nicht zu erweitern, da Sie sonst in einer Endlosschleife stecken bleiben, weil sichQ
erweitert, zuQ
welcher erweitert, zuQ
welcher ...Nun, da die Vorbereitungen abgeschlossen sind, können wir zum richtigen Algorithmus gehen, um ihn zu setzen. Aufgrund der Tokenisierung von TeX muss der Algorithmus rückwärts geschrieben werden. Dies liegt daran, dass TeX zum Zeitpunkt der Definition den Zeichen in der Definition unter Verwendung der aktuellen Einstellungen Catcodes zuweist. Beispiel:
die Ausgabe ist
E1
, während, wenn ich die Reihenfolge der Definitionen ändere:die Ausgabe ist
11
. Dies liegt daran, dass im ersten Beispiel derE
in der Definition angegebene Buchstabe (Catcode 11) vor der Catcode-Änderung als Buchstabe gekennzeichnet wurde, sodass er immer ein Buchstabe istE
. Im zweiten Beispiel wurde jedochE
zuerst\one
aktiviert und erst dann definiert, und jetzt enthält die Definition den Katcode 13,E
der sich zu erweitert1
.Ich werde diese Tatsache jedoch übersehen und die Definitionen neu anordnen, um eine logische (aber nicht funktionierende) Reihenfolge zu erhalten. In den folgenden Abschnitten können Sie davon ausgehen , dass die Buchstaben
B
,C
,D
, undE
aktiv sind.\gdef\S#1{\iftrueBH#1 Q }
(Beachten Sie, dass es in der vorherigen Version einen kleinen Fehler gab, der das letzte Leerzeichen in der obigen Definition nicht enthielt. Ich habe ihn nur beim Schreiben bemerkt. Lesen Sie weiter und Sie werden sehen, warum wir diesen benötigen, um das Makro ordnungsgemäß zu beenden. )
Zuerst definieren wir das Makro auf Benutzerebene
\S
. Dieser sollte kein aktiver Charakter sein, um eine benutzerfreundliche (?) Syntax zu haben, also ist das Makro für gwappins eht setterl\S
. Das Makro beginnt mit einer immer zutreffenden Bedingung\iftrue
(es wird bald klar sein, warum) und ruft dann dasB
Makro auf, gefolgt vonH
(das wir zuvor definiert haben\fi
), um es mit dem zu vergleichen\iftrue
. Dann verlassen wir das Argument des Makros,#1
gefolgt von einem Leerzeichen und dem QuarkQ
. Nehmen wir an\S{hello world}
, wir verwenden dann den Eingabestromsollte so aussehen:\iftrue BHhello world Q␣
(Ich habe das letzte Leerzeichen durch ein ersetzt,␣
damit das Rendern der Site es nicht verschlingt, wie ich es in der vorherigen Version des Codes getan habe).\iftrue
ist wahr, also dehnt es sich aus und wir bleiben mitBHhello world Q␣
. TeX ist nicht entfernen Sie die\fi
(H
) , nachdem die bedingte ausgewertet wird, sondern es lässt sie dort , bis das\fi
ist tatsächlich erweitert. Jetzt ist dasB
Makro erweitert:ABBH#1 {HI#1FC#1|BH}
B
ist ein durch Trennzeichen getrenntes Makro, dessen Parameter text istH#1␣
. Das Argument ist also das, was zwischenH
und einem Leerzeichen steht. Fortsetzung des obigen Beispiels über dem Eingabestream vor der Erweiterung vonB
isBHhello world Q␣
.B
gefolgt vonH
, wie es sollte (sonst würde TeX einen Fehler auslösen), dann ist das nächste Leerzeichen zwischenhello
undworld
, so#1
ist das Worthello
. Und hier müssen wir den Eingabetext in die Leerzeichen aufteilen. Yay: D Der Ausbau derB
entfernt alles bis zum ersten Platz aus dem Eingangsstrom und ersetzt durchHI#1FC#1|BH
mit zu#1
seinhello
:HIhelloFChello|BHworld Q␣
. Beachten Sie, dass esBH
später im Eingabestream eine neue gibt , um eine Endrekursion von durchzuführenB
und später Wörter verarbeiten. Nachdem dieses Wort verarbeitet wurde,B
wird das nächste Wort verarbeitet, bis das zu verarbeitende Wort das Quark istQ
. Das letzte Leerzeichen danachQ
wird benötigt, da für das mit Trennzeichen versehene Makro am Ende des Arguments ein LeerzeichenB
erforderlich ist . In der Vorgängerversion (siehe Bearbeitungsverlauf) hat sich der Code bei Verwendung nicht mehr richtig verhalten\S{hello world}abc abc
(der Abstand zwischen denabc
s würde verschwinden).OK, zurück zum Eingangsstrom:
HIhelloFChello|BHworld Q␣
. Zuerst gibt es dasH
(\fi
), das die Initiale vervollständigt\iftrue
. Jetzt haben wir folgendes (pseudocodiert):Das
I...F...H
Denken ist eigentlich eine\ifx Q...\else...\fi
Struktur. Der\ifx
Test prüft, ob das (erste Token des) ergriffenen Wortes derQ
Quark ist. Wenn es da ist nichts anderes und die Ausführung beendet zu tun, sonst was bleibt , ist:Chello|BHworld Q␣
. JetztC
wird erweitert:ACC#1#2|{D#2Q|#1 }
Das erste Argument von
C
Undelimited wird, es sei denn , so verspannt , es wird ein einzelnes Token wird, wird das zweite Argument , begrenzt durch|
, so dass nach dem Ausbau derC
(mit#1=h
und#2=ello
) der Eingangsstrom ist:DelloQ|h BHworld Q␣
. Beachten Sie, dass ein anderer|
dort abgelegt wird und dash
von danachhello
abgelegt wird. Der halbe Tausch ist erledigt; Der erste Buchstabe ist am Ende. In TeX ist es einfach, das erste Token einer Tokenliste zu erfassen. Ein einfaches Makro\def\first#1#2|{#1}
erhält den ersten Buchstaben, wenn Sie verwenden\first hello|
. Das letzte ist ein Problem, da TeX immer die "kleinste, möglicherweise leere" Token-Liste als Argument aufgreift, sodass wir einige Workarounds benötigen. Das nächste Element in der Token-Liste istD
:ADD#1#2|{I#1FE{}#1#2|H}
Dieses
D
Makro ist eine der Problemumgehungen und nützlich, wenn das Wort nur einen Buchstaben enthält. Angenommen, statthello
wir hattenx
. In diesem Fall würde der Eingangsstrom seinDQ|x
, dannD
erweitern würde (mit#1=Q
und#2
leer):IQFE{}Q|Hx
. Dies ähnelt demI...F...H
(\ifx Q...\else...\fi
) -Block inB
, der erkennt, dass das Argument der Quark ist und die Ausführung unterbricht und nurx
zum Satz verwendet wird. In anderen Fällen (auf das zurückgehendenhello
Beispiel),D
würde erweitern (mit#1=e
und#2=lloQ
) zu:IeFE{}elloQ|Hh BHworld Q␣
. Auch dasI...F...H
wird prüfen ,Q
aber die fehlschlagen und nimmt\else
Zweig:E{}elloQ|Hh BHworld Q␣
. Nun das letzte Stück von diesem Ding, dasE
Makro würde erweitern:AEE#1#2#3|{I#3#2#1FE{#1#2}#3|H}
Der Parametertext hier ist ziemlich ähnlich zu
C
undD
; Das erste und das zweite Argument sind nicht begrenzt, und das letzte Argument ist durch begrenzt|
. Die Eingangsstrom sieht wie folgt aus :E{}elloQ|Hh BHworld Q␣
, dannE
dehnt sich (mit#1
leeren,#2=e
und#3=lloQ
):IlloQeFE{e}lloQ|HHh BHworld Q␣
. Ein weitererI...F...H
Block überprüft das Quark (die siehtl
und kehrtfalse
):E{e}lloQ|HHh BHworld Q␣
. NunE
erweitert wieder (mit#1=e
leeren,#2=l
und#3=loQ
):IloQleFE{el}loQ|HHHh BHworld Q␣
. Und nochmalI...F...H
. Das Makro macht noch ein paar Iterationen, bis dasQ
gefunden ist und dertrue
Zweig genommen wird:E{el}loQ|HHHh BHworld Q␣
->IoQlelFE{ell}oQ|HHHHh BHworld Q␣
->E{ell}oQ|HHHHh BHworld Q␣
->IQoellFE{ello}Q|HHHHHh BHworld Q␣
. Nun wird der Quark gefunden und die bedingten ERWEITERT:oellHHHHh BHworld Q␣
. Puh.Oh, warte, was sind das? NORMALE BRIEFE? Oh Junge! Die Buchstaben sind schließlich gefunden und TeX aufschreibt
oell
, dann ein HaufenH
(\fi
) gefunden und erweitert (nichts) mit dem Eingangsstrom zu verlassen:oellh BHworld Q␣
. Jetzt werden beim ersten Wort der erste und der letzte Buchstabe ausgetauscht, und als Nächstes sucht TeX den anderenB
, um den gesamten Vorgang für das nächste Wort zu wiederholen.}
Zum Schluss haben wir die Gruppe wieder dort gestartet, so dass alle lokalen Zuweisungen rückgängig gemacht werden. Die lokalen Zuweisungen sind die catcode Änderungen der Buchstaben
A
,B
,C
, ... , die Makros gemacht wurden , so dass sie zu ihrer normalen Brief Bedeutung zurückkehren und können ohne Bedenken im Text verwendet werden. Und das ist es. Das dort\S
definierte Makro löst nun die oben beschriebene Verarbeitung des Textes aus.Eine interessante Sache an diesem Code ist, dass er vollständig erweiterbar ist. Das heißt, Sie können es sicher in sich bewegenden Argumenten verwenden, ohne befürchten zu müssen, dass es explodiert. Sie können den Code sogar verwenden, um zu überprüfen, ob der letzte Buchstabe eines Wortes mit dem zweiten in einem
\if
Test übereinstimmt (aus welchem Grund auch immer Sie das benötigen würden) :Entschuldigen Sie die (wahrscheinlich viel zu) wortreiche Erklärung. Ich habe versucht, es auch für Nicht-TeXies so klar wie möglich zu machen :)
Zusammenfassung für den Ungeduldigen
Das Makro
\S
stellt der Eingabe ein aktives Zeichen voran, dasB
durch ein letztes Leerzeichen begrenzte Tokenlisten aufnimmt und an dieses übergibtC
.C
Nimmt das erste Token in dieser Liste und verschiebt es an das Ende der Tokenliste und erweitert esD
um das verbleibende.D
prüft, ob "was bleibt" leer ist; in diesem Fall wurde ein Wort mit einem Buchstaben gefunden; unternimmt dann nichts; sonst expandiertE
.E
Durchläuft die Token-Liste, bis der letzte Buchstabe des Wortes gefunden wird. Wenn er gefunden wird, verlässt er den letzten Buchstaben, gefolgt von der Wortmitte, gefolgt von dem ersten Buchstaben, der am Ende des Token-Streams von verbleibtC
.quelle
JavaScript (ES6),
3936 Bytes3 Bytes dank @FryAmTheEggman gespart
Verwendet einen Zeilenumbruch als Trennzeichen.
Probieren Sie es online!
quelle
(.)(.*)(.)
ist das das Total Recall Emoticon?Netzhaut ,
85 BytesProbieren Sie es online!
3 Bytes gespart dank Kevin Cruijssen !
Verwendet eine neue Zeile als Trennzeichen. Wir nutzen die Rückwärtsstufe von Retina und einige Grenzen. Die erste Grenze ist, auf welche Übereinstimmungen die Umkehrung angewendet werden soll. Wir wählen also alle mit aus
,
. Dann wollen wir, dass der erste und der letzte Buchstabe jedes Matches vertauscht werden, also nehmen wir jeden Buchstaben in den Bereich,,,
der sich in einen Bereich vom Anfang bis zum Ende mit der Schrittgröße Null übersetzt.quelle
V
, wusste aber nicht, dass es mit solchen Indizes verwendet werden kann1,-2
. Schön!Pepe ,
107105 BytesProbieren Sie es online!
Erläuterung:
Notation zu Kommentaren:
command-explanation -> (stack) // explanation
quelle
Python 3 ,
72-58BytesProbieren Sie es online!
quelle
a
)LaskelH , 71 Bytes
Probieren Sie es online!
Beispiel Ein- / Ausgabe:
quelle
where
Klausel kann auf eine Binding in Guard verschoben werden, um 5 Bytes zu sparen: Probieren Sie es online aus!05AB1E , 10 Bytes
Probieren Sie es online!
-3 Danke an @Kevin Cruijssen .
quelle
|ʒRćsRćJ,
loop_as_long_as_there_are_inputs
, dann hätte ich eine 8-Byte-Ausgabe gekannt:[RćsRćJ,
Diese 8-Byte-Ausgabe wird[
theoretisch jedoch nie verwendet, nur wenn Sie nicht genügend Arbeitsspeicher haben oder keine Zeit mehr haben, wie bei TIO (und dies erfordert ein Trailing) Zeilenumbruch in der Eingabe, sonst wird das letzte Wort verwendet) ..ð¡
als Einzelworteingabe möglich sein, arbeitet aberð¡εćsÁì}ðý
auch mit 10 Bytes.J ,
2317 BytesProbieren Sie es online!
quelle
1 A.
!1&A.&.(1&|.)
->({:,1|.}:)
und dann können Sie die entfernen::]
Ruby mit
-p
,424129 ByteProbieren Sie es online!
quelle
\w
s durch.
s ersetzen .Haskell, 54 Bytes
Probieren Sie es online!
quelle
Japt
-S
, 7 BytesVersuch es
quelle
PowerShell , 37 Byte
Probieren Sie es online!
quelle
Stax , 8 Bytes
Führen Sie es aus und debuggen Sie es
Verwendet Zeilenumbrüche als Worttrennzeichen.
quelle
Leerzeichen , 179 Bytes
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Tabulator als Trennzeichen. Die Eingabe sollte einen abschließenden Zeilenumbruch (oder einen Tabulator) enthalten, da das Programm sonst nicht weiß, wann es anhalten soll, da die Eingabe in Whitespace jeweils nur für ein Zeichen erfolgen kann.
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Erklärung im Pseudocode:
Das Programm wird mit einem Fehler beendet, wenn versucht wird, ein Zeichen zu lesen, wenn in TIO kein Zeichen angegeben ist (oder wenn es in einigen Whitespace-Compilern wie vii5ard auf eine Eingabe wartet ).
quelle
Wolfram Language (Mathematica) , 58 Byte
Probieren Sie es online!
-22 Bytes von @attinat
-12 Bytes von @ M.Stern
quelle
StringReplace
mitStringExpression
sStringTake
anstelle vonStringReplace
:StringRiffle[StringSplit@##~StringTake~{{-1},{2,-2},{1}},#2,""]&
StringReplace[#, a : u ~~ w : u .. ~~ b : u :> b <> w <> a /. {u -> Except@#2}] &
QuadR , 20 Bytes
Bilden Sie einfach drei Erfassungsgruppen, die aus 1, 0 oder mehr und 1 Wortzeichen bestehen, und kehren Sie dann ihre Reihenfolge um.
Probieren Sie es online!
quelle
APL + WIN, 50 Bytes
Fordert zur Eingabe einer Zeichenfolge auf und verwendet Leerzeichen als Begrenzer.
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
quelle
Japt
-S
, 10 BytesIch bin davon überzeugt, dass es einen kürzeren Ansatz geben muss (und ich hatte Recht ), aber das reicht für den Moment.
Versuch es
quelle
¸®Ì+Zs1J +Zg
¸®ÎiZÌ+Zs1J
.sed, 64 bytes
quelle
.
stattdessen verwenden[[:alpha:]]
, aber es müsste tatsächlich sein[^ ]
, was es auf 43 reduziert, aber auf Interpunktion und so bricht. Mit[a-zA-Z]
bringt es auf 55 auf, von welchem Punkt ich sehne nur nach diesen süßen, süßen Menschen lesbaren Einheiten ...You do not need to handle punctuation; all of the inputs will only consist of the letters a through z, separated by a delimiter, all of a uniform case.
Mit anderen Worten, Sie brauchen sich keine Gedanken über die Zeichensetzung zu machen, die Ihren Code "kaputt macht", und können einfach loslegen[^ ]
;)[^ ]
sollte das sein,[^[:space:]]
was es auf 67 Zeichen bringt.sed , 34 bytes
Und vermutlich funktioniert die Musteridee mit den meisten RE-Tools (und ich weiß, dass es Unterschiede zwischen Standard-RE und erweitertem RE gibt).
Probieren Sie es online!
quelle
\b
das Match beenden kannst? Probiere es online aus!\b
führt zu 30 Bytes..
für die ausgetauschten Zeichen und Sie können zwei weitere Zeichen verlieren. Dies verringert Ihre Größe auf 26 Byte. eine der kleinsten lesbaren Lösungen.s,\b(.)(\w*)(.)\b,\3\2\1,g
\w
s am Ende.s,\b(\w)(\w*)(\w)\b,\3\2\1,g
28 Zeichen.Ruby, 53 Bytes
Ich habe es ohne Regex versucht. Die Ausgabe druckt jedes Wort in einer neuen Zeile. Wenn das gegen die Regeln verstößt, lass es mich wissen und ich werde es reparieren.
Ungolfed:
quelle
p
war nicht gut, da dies der Ausgabe Anführungszeichen hinzufügte. Sie könnenputs
stattdessen immer verwenden, da die neue Zeile automatisch angehängt wird und kürzer ist alsprint
! Wenn Siesplit
ohne Argumente aufrufen, wird dies automatisch in Leerzeichen aufgeteilt.8088 Assembly, IBM PC DOS,
3938 BytesZerlegt:
Standalone-PC-DOS-Programm. Eingabe über Kommandozeilenargumente, Ausgabe auf Bildschirm.
Laden Sie PWAS.COM herunter und testen Sie es .
quelle
Perl 5
-p
, 24 BytesProbieren Sie es online!
quelle
Batch, 141 Bytes
Übernimmt Eingaben als Befehlszeilenparameter. Die Manipulation von Zeichenfolgen ist im Batch-Modus am besten, und es hilft nicht, einzelne Buchstaben in Sonderfällen zu verwenden.
quelle
C # (Visual C # Interactive Compiler) , 90 Byte
Verwendet Newline als Begrenzer, obwohl wirklich jedes Leerzeichen verwendet werden kann.
Probieren Sie es online!
quelle
Icon , 76 Bytes
Probieren Sie es online!
quelle
Java,
110 bis109 Bytes-1 Byte unter Verwendung einer Newline als Delimeter
TIO
quelle
Haskell ,
7574 BytesEs wurde ein Fehler behoben, auf den Cubic verwies und der auch 1 Byte weniger bedeutete.
Probieren Sie es online!
quelle
map g
ist kürzer als(g<$>)
a
aa
Scala, 100 Bytes
quelle
T-SQL, 126 Bytes
Die Eingabe erfolgt über eine bereits vorhandene Tabelle t mit varchar Feld v , je unseren IO - Standards .
Lesen von hinten nach vorne,
STRING_SPLIT
Aufteilen einer Zeichenfolge in einzelne Zeilen über ein Trennzeichen,STUFF
Ändern der Zeichen an den angegebenen Positionen undSTRING_AGG
erneutes Zusammenfügen der Zeichen .quelle