Die Welt endet in ed

21

Entnommen direkt aus dem ACM Winter Programming Contest 2013. Sie sind eine Person, die es mag, Dinge wörtlich zu nehmen. Deshalb ist für Sie das Ende der Welt angesagt. die letzten Buchstaben von "The" und "World" verkettet.

Erstellen Sie ein Programm, das einen Satz enthält, und geben Sie den letzten Buchstaben jedes Wortes in diesem Satz auf möglichst kleinem Raum (mit den wenigsten Bytes) aus. Wörter werden mit allen Buchstaben vom Alphabet getrennt (65 - 90, 97 - 122 in der ASCII-Tabelle). Dies bedeutet, dass Unterstriche, Tilden, Gräber, geschweifte Klammern usw. Trennzeichen sind. Zwischen jedem Wort kann mehr als ein Trennzeichen stehen.

asdf jkl;__zxcv~< vbnm,.qwer| |uiop-> flvmrp
pigs, eat dogs; eat Bob: eat pigs-> ststbts
looc si siht ,gnitirw esreveR-> citwR
99_bottles_of_beer_on_the_wall->sfrnel

beary605
quelle
Könnten Sie einen Testfall mit Ziffern und Unterstrichen hinzufügen?
Grc
10
Die Welt endet in ed? Ich wusste, dass Vim und Emacs nicht mithalten konnten!
Joe Z.
So lange ich mich erinnern kann, war der Aufsatz „Echte Männer benutzen Ed“ Teil der Emacs-Distribution.
JB
Werden die Eingaben nur ASCII sein?
Phil H

Antworten:

16

Perl 5, 18 Bytes

s/\pL*(\pL)|./$1/g

Erfordert einen -pBefehlszeilenschalter. Die benannte Eigenschaft Lstimmt nur mit Buchstaben überein A-Za-z. Es gibt mehrere hundert solcher benannten Eigenschaften, aber wenn es sich um ASCII-Text handelt, sind nur sehr wenige von ihnen interessant. Außerdem \pList die einzige andere echte Note \pP, die der Interpunktion entspricht.

Probieren Sie es online!


Perl 5, 17 Bytes

Eine Ein-Byte-Verbesserung von Dom Hastings

print/\pL*(\pL)/g

Benötigt -n(und -lum mehrere Eingaben zu unterstützen).

Probieren Sie es online!


Beispielnutzung

$ more in.dat
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
99_bottles_of_beer_on_the_wall

$ perl -p ends-in-ed.pl < in.dat
flvmrp
ststbts
citwR
sfrnel
primo
quelle
Ich denke, \wpasst auch zu Ziffern und Unterstrichen.
Grc
Hmm, in der Tat. Das muss aktualisiert werden.
Primo
2
Brillant. Regex war eine offensichtliche Lösung, aber |.nicht offensichtlich (zumindest für mich).
Peter Taylor
1
Habe gerade ein -1in bemerkt print/\pL*(\pL)/g, scheint das selbe für deine Testfälle auszugeben!
Dom Hastings
18

ed, 35 zeichen

s/[a-zA-Z]*\([a-zA-Z]\)\|./\1/g
p
Q

So endet die Welt in ed. Da ich gerne zu wörtlich bin, habe ich mich entschlossen zu schreiben, um die Lösung mit ed zu schreiben - und anscheinend ist es tatsächlich eine Programmiersprache . Es ist überraschend kurz, selbst wenn man bedenkt, dass es in diesem Thread bereits viele kürzere Lösungen gibt. Es wäre schöner, wenn ich etwas anderes als verwenden könnte [a-zA-Z], aber da ed keine Programmiersprache ist, ist es eigentlich gut genug.

Zunächst möchte ich sagen, dass dies nur die letzte Zeile in der Datei analysiert. Es wäre möglich, mehr zu analysieren. Geben Sie einfach ,am Anfang der ersten beiden Zeilen ein (dieser Bereich gibt "alles" an, im Gegensatz zum Standardbereich für die letzte Zeile), aber dies würde die Codegröße auf 37 Zeichen erhöhen.

Nun zu den Erklärungen. Die erste Zeile entspricht genau der Perl-Lösung (außer ohne Unterstützung für Unicode-Zeichen). Ich habe die Perl-Lösung nicht kopiert, sondern nur zufällig etwas Ähnliches erfunden.

In der zweiten Zeile wird die letzte Zeile gedruckt, sodass Sie die Ausgabe sehen können. Die dritte Zeile wird beendet - ich muss es tun, andernfalls wird edgedruckt ?, um Sie daran zu erinnern, dass Sie die Datei nicht gespeichert haben.

Nun, wie man es ausführt. Nun, es ist sehr einfach. Führen Sie einfach eddie Datei aus, die den Testfall enthält, und leiten Sie mein Programm so weiter.

ed -s testcase < program

-sist leise. Dies verhindert, dass zu edBeginn eine hässliche Dateigröße ausgegeben wird. Schließlich verwende ich es als Skript und nicht als Editor, sodass ich keine Metadaten benötige. Wenn ich das nicht tun würde, würde ed eine Dateigröße anzeigen, die ich sonst nicht verhindern könnte.

Konrad Borowski
quelle
Ich habe ed installiert, nur um das zu versuchen.
Primo
6

Javascript, 49

alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))

Es wird ein regulärer Ausdruck verwendet, um alle Zeichen vor einem Buchstaben sowie alle Nichtbuchstaben zu entfernen. Dann bleibt uns der letzte Buchstabe jedes Wortes.

Vielen Dank an Tomsmeding für eine schöne Verbesserung.

grc
quelle
3
Sie können dies wahrscheinlich verbessern, indem Sie die Regex-Groß- und Kleinschreibung alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
ignorieren
6

C 78

Golf gespielt:

main(int c,char**s){for(;c=*s[1]++;)isalpha(c)&&!isalpha(*s[1])?putchar(c):0;}

Mit Leerzeichen:

main(int c,char**s)
{
  for(;c=*s[1]++;)
    isalpha(c)&&!isalpha(*s[1])?putchar(c):0;
}

Ausgabe:

Bildbeschreibung hier eingeben

JoeFish
quelle
1
Sie können 4 Bytes sparen, indem Sie die K & R-Deklaration verwenden und Folgendes festlegen c:main(c,s)char**s;{for
Toby Speight
5

GNU Sed, 40 38 37

s/[a-z]\b/&\n/g; s/[^\n]*\(.\)\n/\1/g

Testen

cat << EOF > data.txt
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
EOF

Laufen Sie sed:

sed 's/[A-Za-z]\b/&\n/gi; s/[^\n]*\(.\)\n/\1/g' data.txt

Ausgabe:

flvmrp
ststbts
citwR

Erläuterung

Die erste Ersetzung ersetzt alle Wortgrenzen, denen die gewünschte Übereinstimmungsgruppe vorausgeht, durch eine neue Zeile. Dies macht es einfach, alle überflüssigen Zeichen in der zweiten Ersetzung zu entfernen.

Bearbeiten

  • Verwenden Sie das case-insensitive Flag (-2), danke manatwork .
  • Zähle keine Leerzeichen (-1).
Thor
quelle
sed‚s - sBefehl hat iFlag für Fälle insensitive Matching: s/[a-z]\b/&\n/gi.
Manatwork
@manatwork: Guter Punkt, das würde es nur zu GNU sed machen, aber es scheint, dass es schon ist, danke.
Thor
\bbetrachtet _s als Buchstaben. Wenn also ein Wort im Test END mit _steht, wird der letzte Buchstabe dieses Wortes nicht in die Ausgabe aufgenommen
Marty Neal,
3

Grep und Paste, 36 34 28

> echo 'asdf jkl;__zxcv~< vbnm,.qwer| |uiop' | grep -io '[a-z]\b' | tr -d \\n
flvmrp

> echo 'pigs, eat dogs; eat Bob: eat pigs'   | grep -io '[a-z]\b' | tr -d \\n
ststbts

echo 'looc si siht ,gnitirw esreveR'         | grep -io '[a-z]\b' | tr -d \\n
citwR

Wenn eine letzte neue Zeile benötigt wird, ersetzen Sie diese tr -d \\ndurch paste -sd ''.

Bearbeiten

  • Verwenden Sie die Groß- und Kleinschreibung grep (-2), danke manatwork .
  • Verwenden Sie transtelle von paste(-4), danke manatwork .
  • Zählen Sie keine Leerzeichen um die Pipe (-2).
Thor
quelle
Ziemlich kreativ damit, paste -sd ''ist aber tr -d \\nkürzer. In Bezug auf grep, es hat -iSchalter Bedeutung „ignoriert Fall“, die es kürzer machen kann: grep -io '[a-z]\b'.
Manatwork
@manatwork, trlösche auch den letzten Zeilenumbruch. Groß- und Kleinschreibung ist natürlich kürzer, danke.
Thor
Es gibt keine Regel, die einen endgültigen Zeilenumbruch erfordert.
Manatwork
@manatwork: Ich kann der aktualisierten Antwort zustimmen.
Thor
3

sed, 37 Zeichen

Gleich lang wie Thors Antwort , aber, denke ich, einfacher.

s/[a-z]*\([a-z]\)/\1/ig;s/[^a-z]*//ig

Die Logik ist recht trivial: Ersetzen Sie die Buchstabenfolgen durch den letzten Buchstaben und löschen Sie dann alle Nicht-Buchstaben.

ugoren
quelle
3

Mathematica, 39

""<>StringCases[#,(__~~x_)?LetterQ:>x]&

Prüfung:

""<>StringCases[#,(__~~x_)?LetterQ:>x]& /@
 {"asdf jkl;__zxcv~< vbnm,.qwer| |uiop",
  "pigs, eat dogs; eat Bob: eat pigs",
  "looc si siht ,gnitirw esreveR",
  "99_bottles_of_beer_on_the_wall"}
{"flvmrp", "ststbts", "citwR", "sfrnel"}
Mr.Wizard
quelle
Gut LetterQsollte heißen LettersQ:) Ich habe nicht daran gedacht, ganze Strings zu testen.
Dr. Belisarius
@belisarius Tatsächlich wird dieses Konstrukt zeichenweise angewendet, so dass es ein buchstäbliches "LetterQ" sein und trotzdem funktionieren kann.
Mr.Wizard
2

K 49

{last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}

.

k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"looc si siht ,gnitirw esreveR"
"citwR"
tmartin
quelle
2

Scala, 59 (oder 43)

Angenommen, die Zeichenfolge ist bereits in s:

s.split("[^a-zA-Z]+").map(_.last).mkString

Wenn Sie von einer Eingabeaufforderung aus lesen und drucken müssen, anstatt die REPL-Ausgabe zu verwenden, konvertieren Sie sin readLineund fügen Sie println()59 ein.

Rex Kerr
quelle
2

x86: 54 Bytes

Nehmen Sie eine cdecl- Routine mit der Signatur an void world_end(char *input, char *output):

60 8b 74 24 24 8b 7c 24 28 33 d2 8a 0e 8a c1 24
df 3c 41 72 08 3c 5a 77 04 8a d1 eb 09 84 d2 74
05 88 17 47 33 d2 46 84 c9 75 e0 84 d2 74 03 88
17 47 88 0f 61 c3
user1354557
quelle
1
Übrigens ist mir klar, dass die Frage nach einem Programm und nicht nach einer Routine fragt , aber ich wollte etwas anderes machen. Entgegen der Problemstellung bin ich wohl doch keine "Person, die Dinge gerne wörtlich nimmt". : P
user1354557
2

Xi, 32

println$ @{=>.-1}<>input re"\W+"

Xi ist eine Sprache, die sich noch in der Beta-Phase befindet, aber sie scheint gut mit Code-Golf zu funktionieren. Ich dachte mir, ich könnte noch eine weitere kurze und funktionale Lösung zeigen (und die Sprache ein wenig bewerben :-)).

arshajii
quelle
2

Mathematica 62 57 52

Row@StringTake[StringCases[#,LetterCharacter..],-1]&

Testen

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", 
     "pigs,eat dogs;eat Bob:eat pigs", 
     "looc si siht,gnitirw esreveR"}

Row@StringTake[StringCases[#,LetterCharacter..],-1]&/@ l
(*{flvmrp,ststbts,citwR}*)
Dr. belisarius
quelle
Ich habe deins fälschlicherweise bearbeitet, dann aber zurückgesetzt. Hoppla.
DavidC
2

Python3, 59 Zeichen

import re;print(re.sub('.(?=[a-z])|[^a-z]','',input(),0,2))

Mit Großbuchstaben und Unterstrichen richtig umgehen. Die 2 ist re.subdie re.IGNORECASEFlagge zu übergeben, ohne verwenden zu müssen re.I.

Nolen Royalty
quelle
2

Python, 76 Zeichen

import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))

indrajeet
quelle
Sie können das Leerzeichen danach entfernen print.
Flornquake
Verkürzen, indem Sie auf Python 3 portieren: import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Steven Rumbalski
1

Python 3.x, 64 Bytes

import re;print(''.join(a[-1] for a in re.split('\W+',input())))
Michael0x2a
quelle
2
Das letzte Beispiel funktioniert nicht. Außerdem tritt ein Fehler auf, wenn die Zeile mit einem Trennzeichen beginnt oder endet
AMK
Sie können das Leerzeichen vorher entfernen for.
Bakuriu
1

Lua, 42

print(((...):gsub('.-(.)%f[%A]%A*','%1')))

Anwendungsbeispiel: lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"

Egor Skriptunoff
quelle
1

Mathematica 71 47 45 61

Zurück zum Zeichenbrett, nachdem @belisarius einen Fehler im Code gefunden hat.

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" &

Testen

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", "asdf jkl__zxcv~<vbnm,.qwer| |uiop", 
"pigs,eat dogs;eat Bob:eat pigs", "looc si siht,gnitirw esreveR"};

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" & /@ l

{"flvmrp", "flvmrp", "ststbts", "citwR"}

DavidC
quelle
\\wStreichhölzer _, also funktioniert es nicht (zum Beispiel)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Dr. belisarius
Warte Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"gibts bei mir flvmrp, #~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"kehre aber fvmrphierher zurück. Erhalten wir die gleichen Ergebnisse?
Dr. belisarius
@belisarius Du hattest Recht mit dem Fehler in meiner früheren Version. Ich habe es mit der falschen Saite getestet!
DavidC
Hehe, wieder +1
Dr. Belisarius
@belisarius Jungs, siehe die Antwort, die ich gepostet habe. Wenn es richtig ist, ist es kürzer.
Mr.Wizard
1

Python 2, 88 80 75 69 68

s=p=''
for c in raw_input()+' ':a=c.isalpha();s+=p[a:];p=c*a
print s

Eingang: 435_ASDC__uio;|d re;fG o55677jkl..f

Ausgabe: CodeGolf


Diese Lösung kann auf 67 Zeichen gekürzt werden, wenn Sie zulassen, dass die Ausgabe am Anfang Rücktastenzeichen (ASCII-Code 8) enthält. Die Ausgabe ist optisch identisch.

s=p='<BS>'
for c in raw_input()+p:a=c.isalpha();s+=p[a:];p=c*a
print s

Gleiche Eingabe, (visuell) gleiche Ausgabe. <BS>soll das Backspace-Zeichen sein.

flornquake
quelle
1

C #

Methode, 105 Bytes: (setzt Verwendung für System, System.Text.RegularExpressions und System.Linq voraus)

string R(string i){return string.Concat(Regex.Split(i,"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last()));}

Programm, 211 Bytes:

using System;using System.Text.RegularExpressions;using System.Linq;class A{static void Main(){Console.WriteLine(string.Concat(Regex.Split(Console.ReadLine(),"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last())));}}
Es istNotALie.
quelle
1

VBA 147, 161

Sub a(s)
For n=0 To 255:m=Chr(n):s=Replace(s,IIf(m Like"[A-Za-z]","",m)," "):Next
For Each r In Split(s," "):t=t & Right(r,1):Next
MsgBox t
End Sub
Gaffi
quelle
1

Ruby 2.0, 25 (+1) Zeichen

gsub(/(\w+)\W*/){$1[-1]}

Muss mit dem -pSchalter ausgeführt werden:

 $ ruby -p ed.rb <<< "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
flvmrp
daniero
quelle
Bitte geben Sie die rubyVersion an. 1.9.2 gibt "# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>" aus.
Manatwork
Du hast recht. Ich hatte völlig vergessen, dass ich es installiert habe, aber meine aktuelle Ruby-Version ist 2.0 ( ruby 2.0.0p0 (2013-02-24 revision 39474). Beim Ausführen des Programms mit Version 1.8.7 wird ein ASCII-Wert ausgegeben! Wusste nicht, dass es so viele Unterschiede zwischen den Versionen gibt.
Daniero
Danke, muss auf jeden Fall mein Ruby aktualisieren. (. Sowohl der Dolmetscher und das Wissen) Die zweite Erfassungsgruppe ist nicht erforderlich: gsub(/(\w+)\W*/){$1[-1]}.
Manatwork
Oh, das ist es natürlich nicht. Danke, aktualisiert :)
daniero
1

Netzhaut , 16 Bytes

Li, -1|""`[a-z]+

Probieren Sie es online!

Erläuterung

Li, -1|""`[a-z]+
L         [a-z]+        List all the sequences of letters in the input
 i                      case insensitive
  ,                     Keep all the results
    -1                  but only the last character for each of them
      |""               Use the empty string as separator
Löwe
quelle
1

Java 8, 43 Bytes

s->s.replaceAll("(?i).(?=[a-z])|[^a-z]","")

Port von @ mbomb007s Retina-Antwort .

Erläuterung:

Probieren Sie es online aus.

s->  // Method with String as both parameter and return-type
  s.replaceAll("(?i).(?=[a-z])|[^a-z]","")
     //  Remove every match of this regex, and return as result

Zusätzliche Erklärung für den regulären Ausdruck:

"(?i).(?=[a-z])|[^a-z]"  // Main regex to match
 (?i)                    //  Case insensitive
     .                   //   Any character
      (?=[a-z])          //   Followed by a letter (as positive look-ahead)
               |[^a-z]   //   or a non-letter

""                       // Replace it with: nothing
Kevin Cruijssen
quelle
1
Das ist eigentlich (?i)für die Flagge.
Jakob
0

Smalltalk , Squeak / Pharo
122 Zeichen mit traditioneller Formatierung für diese Methode, die zu String hinzugefügt wurde:

endOfWords
    ^(self subStrings: (CharacterSet allCharacters select: #isLetter) complement) collect: #last as: String

62 Zeichen in Pharo 1.4, mit Regex und seltsamer Formatierung

endOfWords^''join:(self regex:'[a-zA-Z]+'matchesCollect:#last)
aka.nice
quelle
0

J: 60 Zeichen (oder 38 Zeichen für eine weniger korrekte Version)

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0

Wenn wir das Programm abbrechen lassen möchten, wenn Wörter mit einem Doppelpunkt oder einem Unterstrich enden, können wir dies auf 38 Zeichen vereinfachen.

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:

Probelauf:

    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'asdf jkl;__zxcv~< vbnm,.qwer| |uiop'
flvmrp
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'pigs, eat dogs; eat Bob: eat pigs'
ststbts
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'99_bottles_of_beer_on_the_wall'
sfrnel
SL2
quelle
1
38 Bytes (für eine korrekte Ausführung): (#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:oder 43 Bytes für eine nicht-explizite Version: (#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:. Dies verwendet das Intervallindexverb I., das 64 90 96 122als Intervallmenge interpretiert wird (__, 64] (64, 90], (90, 96], (96, 122], (122, _), und gibt den Index des Itervals zurück, zu dem sein Argument, der ASCII-Code des Zeichens, gehört. Wenn dieser Index ungerade ist, ist er nicht alphabetisch.
Bolce Bussiere
@BolceBussiere funktioniert aus irgendeinem Grund nicht mit Unterstrichen (letzter Testfall).
FrownyFrog
@FrownyFrog ah, ich verstehe warum, ;:interpretiert abc_als ein Wort, da Variablennamen Unterstriche enthalten können. +10 Bytes zum Hinzufügen (#~~:&'_'), wahrscheinlich ein ineffizienter Fix
Bolce Bussiere
@BolceBussiere das ist einfach so '_'-.~oder so ähnlich.
FrownyFrog
0

Es ist in PHP . 197 Bytes :( Ich bin Anfänger

$l=$_GET['line'];
$l=preg_replace('/(\W|_)+/',' ',$l);
$s=explode(' ',$l);
foreach($s as $d){
$a=substr($d,-1,1);
$o=ORD($a);
if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){
echo $a;
  }
}

EDITED Jetzt sind es 171 Bytes

<?$l=$_GET['l'];$l=preg_replace('/(\W|_)+/',' ',$l);$s=explode(' ',$l);foreach($s as $d){$a=substr($d,-1,1);$o=ORD($a);if(($o>=97&&$o<=122)||($o>=65&&$o<=90)){echo$a;}}
Sasori
quelle
1
Beim Golfen sollten Sie Ihre Variablennamen so weit wie möglich auf einzelne Zeichen reduzieren.
Gaffi
1
Ich bin neu hier.
Sasori
Sicher. Vielleicht möchten Sie auch hier nach zusätzlicher PHP-spezifischer Hilfe suchen .
Gaffi
foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}ist 149, wenn es funktioniert.
Magic Octopus Urn
\W|_schließt Ziffern aus; \dAlso sollten Sie zu Ihrem regulären Ausdruck hinzufügen oder verwenden/[^a-z]+/i
Titus
0

K 30

q)k)f:{x@&-1=-':(1_x," ")in,/.Q`a`A}
q)f "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
q)f "pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
q)f "looc si siht ,gnitirw esreveR"
"citwR"
q)f "99_bottles_of_beer_on_the_wall"
"sfrnel"
rrr
quelle
0

Japt v2, 16 Bytes

r/\L*\l+)\L*/@YÌ

Versuch es

Zottelig
quelle
Ich denke du kannst es einfach machen f"%l(?!%l)" q(funktioniert nicht in v2, weil der Parser das nicht mag (?)
ETHproductions