Zaczerpnięty z zimowego konkursu programistycznego ACM 2013. Jesteś osobą, która lubi brać rzeczy dosłownie. Dlatego dla was koniec Świata jest wydany; ostatnie litery „The” i „World” zostały połączone.
Stwórz program, który pobiera zdanie, i wypisz ostatnią literę każdego słowa w tym zdaniu na możliwie najmniejszej przestrzeni (jak najmniej bajtów). Słowa są oddzielone tylko literami alfabetu (65–90, 97–122 w tabeli ASCII.) Oznacza to, że znaki podkreślenia, tyldy, groby, nawiasy klamrowe itp. Są separatorami. Między każdym słowem może znajdować się więcej niż jeden separator.
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
Odpowiedzi:
Perl 5, 18 bajtów
Wymaga
-p
przełącznika linii poleceń. Nazwana właściwośćL
pasuje tylko do znaków literowychA-Za-z
. Istnieje kilkaset takich nazwanych właściwości, ale w przypadku tekstu ASCII bardzo niewiele z nich jest interesujących. Poza\pL
tym jedyną prawdziwą nutą jest\pP
, która pasuje do interpunkcji.Wypróbuj online!
Perl 5, 17 bajtów
Jednobajtowe ulepszenie Dom Hastings
Wymaga
-n
(i-l
do obsługi wielu wejść).Wypróbuj online!
Przykładowe użycie
źródło
\w
pasuje również do cyfr i znaków podkreślenia.|.
nie było oczywiste (przynajmniej dla mnie).-1
inprint/\pL*(\pL)/g
, wyjście wydaje się taki sam dla przypadków testowych!ed, 35 znaków
Tak więc świat kończy się na ed. Ponieważ lubię być zbyt dosłowny, postanowiłem napisać, aby napisać rozwiązanie w ed - i najwyraźniej jest to faktycznie język programowania . Jest zaskakująco krótki, nawet biorąc pod uwagę wiele krótszych rozwiązań w tym wątku. Byłoby miło, gdybym mógł użyć czegoś innego
[a-zA-Z]
, ale biorąc pod uwagę, że ed nie jest językiem programowania, jest wystarczająco dobry.Po pierwsze, chciałbym powiedzieć, że analizuje to tylko ostatni wiersz w pliku. Można by parsować więcej, wystarczy wpisać
,
na początku dwóch pierwszych wierszy (to określiło zakres „wszystko”, w przeciwieństwie do standardowego zakresu ostatniego wiersza), ale zwiększyłoby to rozmiar kodu do 37 znaków.Teraz wyjaśnienia. Pierwszy wiersz robi dokładnie to samo, co robi Perl (z wyjątkiem bez obsługi znaków Unicode). Nie skopiowałem rozwiązania Perla, właśnie wynalazłem coś podobnego przez przypadek.
Drugi wiersz wypisuje ostatni wiersz, dzięki czemu można zobaczyć wynik. Trzecia linia zmusza do wyjścia - muszę to zrobić, w przeciwnym
ed
razie wydrukuje,?
aby przypomnieć, że nie zapisałeś pliku.Teraz, jak to wykonać. To bardzo proste. Po prostu uruchom
ed
z plikiem zawierającym przypadek testowy, podczas pipetowania mojego programu, w ten sposób.-s
milczy. Zapobiega toed
wysyłaniu brzydkiego rozmiaru pliku na początku. W końcu używam go jako skryptu, a nie edytora, więc nie potrzebuję metadanych. Gdybym tego nie zrobił, ed pokazałby rozmiar pliku, którego inaczej nie mogłem zapobiec.źródło
JavaScript, 49
Używa wyrażenia regularnego, aby usunąć wszystkie znaki poprzedzające literę, a także wszystkie znaki nieliterowe. Następnie zostaje nam ostatnia litera każdego słowa.
Dzięki Tomsmeding dla miłej poprawy.
źródło
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C, 78
Gra w golfa:
Z białymi znakami:
Wydajność:
źródło
c
:main(c,s)char**s;{for
GNU Sed,
403837Testowanie
Uruchom sed:
Wydajność:
Wyjaśnienie
Pierwsze podstawienie zastępuje wszystkie granice słów poprzedzone wybraną grupą dopasowania nową linią. Ułatwia to usunięcie wszystkich obcych znaków w drugiej zamianie.
Edytować
źródło
sed
„ss
polecenie mai
flagę dla przypadków niewrażliwego dopasowywania:s/[a-z]\b/&\n/gi
.\b
uważa_
s za litery, więc jeśli jakieś słowo w teście END z_
, ostatnia litera tego słowa nie jest uwzględniona w danych wyjściowychGrep and Paste,
363428Jeśli potrzebna jest ostateczna new-line, należy wymienić
tr -d \\n
zpaste -sd ''
.Edytować
tr
zamiastpaste
(-4), dzięki manatwork .źródło
paste -sd ''
, aletr -d \\n
jest krótszy. Jeśli chodzigrep
, ma-i
przełącznik sens „ignorować sprawy”, który może sprawić, że krótsza:grep -io '[a-z]\b'
.tr
usuń także ostatnią nową linię. Dzięki temu tryb bez rozróżniania wielkości liter jest oczywiście krótszy.sed, 37 znaków
Równa długość do odpowiedzi Thora , ale myślę, że prościej.
Logika jest dość trywialna - zamień sekwencje liter na ostatnią literę, a następnie usuń wszystkie nie-litery.
źródło
Mathematica, 39
Test:
źródło
LetterQ
powinienem się nazywaćLettersQ
:) Nie myślałem o tym do testowania całych łańcuchów.K, 49
.
źródło
Scala, 59 (lub 43)
Zakładając, że ciąg jest już w
s
:Jeśli potrzebujesz czytać z monitu i drukować, zamiast korzystać z danych wyjściowych REPL, przekonwertuj
s
nareadLine
i zapakujprintln()
dla 59.źródło
x86: 54 bajty
Załóżmy procedurę cdecl z podpisem
void world_end(char *input, char *output)
:źródło
Xi, 32
Xi jest językiem wciąż w fazie beta, ale wydaje się, że działa dobrze z golfem kodowym, więc pomyślałem, że równie dobrze mogę pokazać jeszcze jedno krótkie i funkcjonalne rozwiązanie (i trochę reklamować język :-)).
źródło
Mathematica
625752Testowanie
źródło
Python3, 59 znaków
Prawidłowo dotyczy wielkich liter i znaków podkreślenia. W 2 jest przekazać
re.sub
dore.IGNORECASE
flagi bez konieczności użyciare.I
.źródło
Python, 76 znaków
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
źródło
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 bajty
źródło
for
.Lua, 42 lata
Przykład użycia:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
źródło
Mathematica
71474561Wróć do tablicy kreślarskiej po tym, jak @belisarius znalazł błąd w kodzie.
Testowanie
źródło
\\w
pasuje_
, więc nie działa (na przykład)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Daj mi czekaćflvmrp
, ale#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
wracafvmrp
tutaj. Czy otrzymujemy te same wyniki?Python 2,
88 80 75 6968Wkład:
435_ASDC__uio;|d re;fG o55677jkl..f
Wydajność:
CodeGolf
To rozwiązanie można skrócić do 67 znaków, jeśli zezwolisz, aby na początku były uwzględniane znaki cofania (kod ASCII 8). Dane wyjściowe będą wizualnie identyczne.
To samo wejście, (wizualnie) to samo wyjście.
<BS>
ma być znakiem backspace.źródło
DO#
Metoda, 105 bajtów: (zakłada użycia dla System, System.Text.RegularExpressions i System.Linq)
Program, 211 bajtów:
źródło
VBA, 147
161źródło
Ruby 2.0, 25 (+1) znaków
Należy uruchomić za pomocą
-p
przełącznika:źródło
ruby
wersję. 1.9.2 wyprowadza „# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>”.ruby 2.0.0p0 (2013-02-24 revision 39474
). Podczas uruchamiania programu z wersją 1.8.7 wyświetla on wartość ASCII! Nie wiedziałem, że istnieje tak wiele różnic między wersjami.gsub(/(\w+)\W*/){$1[-1]}
.Siatkówka , 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Siatkówka , 20 bajtów
Wypróbuj online
Ten program jest kompatybilny z wersją 0.8.2
źródło
Java 8, 43 bajty
Port odpowiedzi Retina @ mbomb007 .
Wyjaśnienie:
Wypróbuj online.
Dodatkowe wyjaśnienie wyrażenia regularnego:
źródło
(?i)
dotyczy flagi.Smalltalk , Squeak / Pharo flavour
122 char z tradycyjnym formatowaniem tej metody dodany do String:
62 znaki w Pharo 1.4, z wyrażeniem regularnym i dziwnym formatowaniem
źródło
J: 60 znaków (lub 38 znaków w przypadku mniej poprawnej wersji)
Jeśli chcemy, aby program się zepsuł, gdy tylko słowa kończą się dwukropkiem lub znakiem podkreślenia, możemy uprościć to do 38 znaków.
Przykładowy przebieg:
źródło
(#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:
lub 43 bajtów dla non-wyraźnej wersji:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:
. Używa to czasownika indeksu interwałuI.
, który interpretuje64 90 96 122
jako zestaw interwałów(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
, i zwraca indeks iterval, do którego należy jego argument, kod ascii znaku. Jeśli ten indeks jest nieparzysty, nie jest alfabetyczny.;:
interpretujeabc_
jako jedno słowo, ponieważ nazwy zmiennych mogą zawierać podkreślenia. +10 bajtów do dodania(#~~:&'_')
, prawdopodobnie nieefektywna poprawka'_'-.~
lub coś podobnego.To jest w PHP . 197 bajtów :( Jestem początkujący
ZMIENIONO Teraz jest 171 bajtów
źródło
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;}}
ma 149, jeśli to działa.\W|_
nie obejmuje cyfr; więc powinieneś dodać\d
do wyrażenia regularnego lub użyć/[^a-z]+/i
K 30
źródło
Japt v2, 16 bajtów
Spróbuj
źródło
f"%l(?!%l)" q
(nie działa w v2, ponieważ parser nie lubi(?
)