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
Antworten:
Perl 5, 18 Bytes
Erfordert einen
-p
Befehlszeilenschalter. Die benannte EigenschaftL
stimmt nur mit Buchstaben übereinA-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\pL
ist 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
Benötigt
-n
(und-l
um mehrere Eingaben zu unterstützen).Probieren Sie es online!
Beispielnutzung
quelle
\w
passt auch zu Ziffern und Unterstrichen.|.
nicht offensichtlich (zumindest für mich).-1
in bemerktprint/\pL*(\pL)/g
, scheint das selbe für deine Testfälle auszugeben!ed, 35 zeichen
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
ed
gedruckt?
, 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
ed
die Datei aus, die den Testfall enthält, und leiten Sie mein Programm so weiter.-s
ist leise. Dies verhindert, dass zued
Beginn 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.quelle
Javascript, 49
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.
quelle
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C 78
Golf gespielt:
Mit Leerzeichen:
Ausgabe:
quelle
c
:main(c,s)char**s;{for
GNU Sed,
403837Testen
Laufen Sie sed:
Ausgabe:
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
quelle
sed
‚s -s
Befehl hati
Flag für Fälle insensitive Matching:s/[a-z]\b/&\n/gi
.\b
betrachtet_
s als Buchstaben. Wenn also ein Wort im Test END mit_
steht, wird der letzte Buchstabe dieses Wortes nicht in die Ausgabe aufgenommenGrep und Paste,
363428Wenn eine letzte neue Zeile benötigt wird, ersetzen Sie diese
tr -d \\n
durchpaste -sd ''
.Bearbeiten
tr
anstelle vonpaste
(-4), danke manatwork .quelle
paste -sd ''
ist abertr -d \\n
kürzer. In Bezug aufgrep
, es hat-i
Schalter Bedeutung „ignoriert Fall“, die es kürzer machen kann:grep -io '[a-z]\b'
.tr
lösche auch den letzten Zeilenumbruch. Groß- und Kleinschreibung ist natürlich kürzer, danke.sed, 37 Zeichen
Gleich lang wie Thors Antwort , aber, denke ich, einfacher.
Die Logik ist recht trivial: Ersetzen Sie die Buchstabenfolgen durch den letzten Buchstaben und löschen Sie dann alle Nicht-Buchstaben.
quelle
Mathematica, 39
Prüfung:
quelle
LetterQ
sollte heißenLettersQ
:) Ich habe nicht daran gedacht, ganze Strings zu testen.K 49
.
quelle
Scala, 59 (oder 43)
Angenommen, die Zeichenfolge ist bereits in
s
:Wenn Sie von einer Eingabeaufforderung aus lesen und drucken müssen, anstatt die REPL-Ausgabe zu verwenden, konvertieren Sie
s
inreadLine
und fügen Sieprintln()
59 ein.quelle
x86: 54 Bytes
Nehmen Sie eine cdecl- Routine mit der Signatur an
void world_end(char *input, char *output)
:quelle
Xi, 32
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 :-)).
quelle
Mathematica
625752Testen
quelle
Python3, 59 Zeichen
Mit Großbuchstaben und Unterstrichen richtig umgehen. Die 2 ist
re.sub
diere.IGNORECASE
Flagge zu übergeben, ohne verwenden zu müssenre.I
.quelle
Python, 76 Zeichen
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
quelle
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 Bytes
quelle
for
.Lua, 42
Anwendungsbeispiel:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
quelle
Mathematica
71474561Zurück zum Zeichenbrett, nachdem @belisarius einen Fehler im Code gefunden hat.
Testen
quelle
\\w
Streichhölzer_
, also funktioniert es nicht (zum Beispiel)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
gibts bei mirflvmrp
,#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
kehre aberfvmrp
hierher zurück. Erhalten wir die gleichen Ergebnisse?Python 2,
88 80 75 6968Eingang:
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.
Gleiche Eingabe, (visuell) gleiche Ausgabe.
<BS>
soll das Backspace-Zeichen sein.quelle
C #
Methode, 105 Bytes: (setzt Verwendung für System, System.Text.RegularExpressions und System.Linq voraus)
Programm, 211 Bytes:
quelle
VBA 147,
161quelle
Ruby 2.0, 25 (+1) Zeichen
Muss mit dem
-p
Schalter ausgeführt werden:quelle
ruby
Version an. 1.9.2 gibt "# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>" aus.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.gsub(/(\w+)\W*/){$1[-1]}
.Netzhaut , 16 Bytes
Probieren Sie es online!
Erläuterung
quelle
Netzhaut , 20 Bytes
Probieren Sie es online aus
Dieses Programm ist kompatibel mit Version 0.8.2
quelle
Java 8, 43 Bytes
Port von @ mbomb007s Retina-Antwort .
Erläuterung:
Probieren Sie es online aus.
Zusätzliche Erklärung für den regulären Ausdruck:
quelle
(?i)
für die Flagge.Smalltalk , Squeak / Pharo
122 Zeichen mit traditioneller Formatierung für diese Methode, die zu String hinzugefügt wurde:
62 Zeichen in Pharo 1.4, mit Regex und seltsamer Formatierung
quelle
J: 60 Zeichen (oder 38 Zeichen für eine weniger korrekte Version)
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.
Probelauf:
quelle
(#~[: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 IntervallindexverbI.
, das64 90 96 122
als 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.;:
interpretiertabc_
als ein Wort, da Variablennamen Unterstriche enthalten können. +10 Bytes zum Hinzufügen(#~~:&'_')
, wahrscheinlich ein ineffizienter Fix'_'-.~
oder so ähnlich.Es ist in PHP . 197 Bytes :( Ich bin Anfänger
EDITED Jetzt sind es 171 Bytes
quelle
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.\W|_
schließt Ziffern aus;\d
Also sollten Sie zu Ihrem regulären Ausdruck hinzufügen oder verwenden/[^a-z]+/i
K 30
quelle
Japt v2, 16 Bytes
Versuch es
quelle
f"%l(?!%l)" q
(funktioniert nicht in v2, weil der Parser das nicht mag(?
)