Krótki i słodki opis wyzwania:
Opierając się na ETAOIN SHRDLU , Twoim zadaniem jest napisanie najkrótszego programu lub funkcji w dowolnym języku, który wypisuje 26 liter alfabetu angielskiego na podstawie ich częstotliwości na wejściu.
Naprawdę długa, sucha i dokładna specyfikacja:
- Twój program / funkcja otrzyma jako wejście ciąg tekstu, który będzie zawierał jedną lub więcej wielkich i / lub małych liter, a także może zawierać znaki interpunkcyjne, cyfry, symbole i inne znaki niealfabetyczne.
- Program / funkcja musi wyprowadzać tylko 26 wielkich liter alfabetu angielskiego, w tym te, które nie pojawiają się na wejściu, uporządkowane od największej do najmniejszej w zależności od tego, ile razy pojawiają się na wejściu.
- Edycja: Częstotliwość jest obliczana bez rozróżniania wielkości liter, ale dane wyjściowe muszą być pisane wielkimi literami.
- Jeśli dwie lub więcej liter ma tę samą częstotliwość, mogą być w dowolnej kolejności.
Żadne inne dane wyjściowe, takie jak białe znaki, nie są dozwolone.- Edytuj 7/1/2014: W oparciu o informacje zwrotne zmieniam tę zasadę. Jedynym dozwolonym wyjściem jest opcjonalne początkowe i / lub końcowe białe znaki, takie jak końcowy znak nowej linii. Żadne inne dane wyjściowe nie są dozwolone.
- Niezdefiniowane zachowanie jest dozwolone dla danych wejściowych, które nie zawierają żadnych liter.
Zwycięzca zostanie wybrany za 7 dni, więc zacznij pisać!
Przykładowe dane wejściowe:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Przykładowe dane wyjściowe:
EITUSALNROMCDPVGQBFHJKWXYZ
Uwaga: KWXYZ
dla tego wejścia istnieje 5-krotny remis .
Edytować:
Konkurs się skończył! Dziękujemy wszystkim, którzy wzięli udział. A teraz zwycięzca (zwycięzcy!): Zarówno CJam Dennisa, jak i Pyta Isaacga otrzymały 19 ogromnych postaci. (Przepraszam, ale nie zamierzam przyjąć żadnej z odpowiedzi, ponieważ uważam, że byłoby to niesprawiedliwe w stosunku do drugiej.) Edytuj: Biorąc radę Dennisa, oznaczę jego odpowiedź jako zaakceptowaną, ponieważ to on jako pierwszy osiągnąć 19 znaków. Wyróżnienia należą do odpowiedzi Ilmari Karonen na trzecie miejsce w Golfscript przy 22 znakach, a także 75- znakowej odpowiedzi Python podziemnego kolejki, która uzyskała najwięcej pozytywnych opinii. Jeszcze raz dziękuję wszystkim, którzy wzięli udział!
Odpowiedzi:
CJam,
2119 bajtówWypróbuj online.
Przykład
(bez nowej linii)
Jak to działa
Więcej wystąpień oznacza, że więcej znaków zostanie usuniętych, więc najczęściej pojawiają się na początku tablicy.
źródło
Python 2 lub 3 -
7775 bajtówMiałem odpowiedź przed tym pobranym wkładem ze STDIN, ale zdałem sobie sprawę, że jest to technicznie nieprawidłowe. Użyłem,
input()
który pobiera tylko jedną linię, ale przykładowe dane wejściowe pytania sugerują, że powinien on obsługiwać wiele linii jednocześnie. Aby spełnić specyfikację, zmieniłem moją odpowiedź w funkcję, która pobiera argument ciągu. Ku mojemu zaskoczeniu było to dwa bajty mniejsze! Nie przyszło mi to do głowyprint(...)
iinput()
były dłuższe niżf=lambda s:
is
.Dzięki temu odpowiedź jest kompatybilna zarówno z Python 2, jak i Python 3. Początkowo był to tylko Python 3, ponieważ był używany
input()
(który został wywołanyraw_input()
w 2). Teraz, gdy jest to funkcja, działa w obu przypadkach.Wyjaśniono
źródło
count
nie jest zmienną ani niczym, jest to dosłowna funkcja. Tak fajne, jak byłoby to możliwe, aby pomnożyć wartość zwracaną przez funkcję-1
przez umieszczenie-
na wierzchu, ale nie jest to cecha pytona.Bash, 65 bajtów
Przykład
Jak to działa
źródło
{A..Z}
. Wszystkie ustawienia narodowe LC_COLLATE działają, ponieważ OpenBSD ma tylko LC_COLLATE = C.Pyth 1.0.2 , 19
20Wypróbuj tutaj: http://ideone.com/fork/YlWpEJ
Dowiedz się więcej o Pyth tutaj: http://esolangs.org/wiki/Pyth
Przykład:
Daje:
Wyjaśnienie:
=ZUw
: Konwertuj tekst na wielkie litery i zapisz w Z.sV
: Wydrukuj sumę rewersum;d
: Ostatnie wpisy zS
: Posortowane według pierwszego wpisu, w porządku rosnącymm[cZkk)
: Listy [liczba k w Z, k]UG
: Dla k wielkimi literami.Szorstki odpowiednik Pythona:
To nie jest wpis, pomyślałem, że ludzie mogą go zobaczyć. W Pyth 1.0.4 następujący program jest rozwiązaniem składającym się z 10 znaków:
Wyjaśnienie:
JUw
: Konwertuj tekst na wielkie litery i zapisz w J.o
: (Drukuj) Sortuj według_cJN
: -1 * (liczba N w J)UG
: Powyżej N wielkimi literami.Nie jest to legalne rozwiązanie, ponieważ kilka zmian z Pyth 1.0.2 na 1.0.4, w tym dodanie funkcji
o
sortowania według, było odpowiedzią na ten problem.źródło
Z
aby móc się do nich później odwoływać? Czy po prostu umieszczenie wyrażenia naZ
jego miejscu spowodowałoby wielokrotne czytanie danych wejściowych?JavaScript ( ES6 )
119117Edycja: (-2) Usunięto potrzebę
toUpperCase
używania wsplit
wywołaniu RegEx bez rozróżniania wielkości liter .Alternatywa (ta sama długość): Skondensowano sortowanie i liczenie znaków w jedną funkcję.
W funkcji:
105104Edycja: (-1) Skondensowano sortowanie i liczenie znaków w jedną funkcję.
źródło
GolfScript, 22 znaki
Wypróbuj online.
Wyjaśnienie:
:?
przypisuje ciąg wejściowy do symbolu?
. (Używam symbolu interpunkcyjnego, aby następujący numer91
nie był analizowany jako część nazwy symbolu).91,
konstruuje listę liczb od 0 do 90 (kod ASCIIZ
).+
dołącza tę listę do ciągu wejściowego, tym samym konwertując go z tablicy kodów ASCII na ciąg (i wygodnie usuwając również ciąg wejściowy ze stosu).-26>
pobiera ostatnie 26 znaków tego ciągu, tworząc ciąg zawierający wielkie litery ASCII odA
doZ
.{ }$
Stosuje blok kodu do wszystkich znaków w ciągu wejściowego i sortuje te znaki, w zależności od wyniku..
duplikuje znak i32+
konwertuje kopię z wielkich na małe.]
Zbiera te dwa znaki do tablicy,?\-
wykonuje ciąg wejściowy przechowywane w?
i usuwa wszystkie wystąpienia znaków w tablicy z nim, a,
liczy się długość pozostałego ciąg, który będzie kluczem sortowania. Znaki będą sortowane w kolejności rosnącej według tego klucza, a zatem w kolejności malejącej według liczby wystąpień.źródło
91,+-26>
.22
, a nie25
:)Haskell, 110 bajtów
Przykładowe użycie:
źródło
(/=c)
z pozbyciem się0-
?Ruby 2.0, 53 znaki
EDYCJA : Naprawiono do poprawnego działania z ciągami wielowierszowymi, dzięki @ durron597!
Tworzy wywoływaną funkcję,
f
której można użyć w następujący sposób:Drukuje do STDOUT:
źródło
EITASUROLNCMPDVQGBHFKJWXYZ
na przykład w pytaniugets
zwraca linię na raz. Można to naprawić, zmieniającgets
na,gets$n
ale zmiana na funkcję jest o 1 znak krótsza.Perl,
5446 bajtówAKTUALIZACJA: po dalszych optymalizacjach może zostać zmniejszona do 46 bajtów: (thx dennis for
-n
/{}
hack; chinese perl goth for<=>
->-
hack)Ma być uruchamiany z biegiem z
perl -nE
Oryginalne rozwiązanie (nie wymaga specjalnych opcji Perla):
Zweryfikowane w Perl 5.8.3, 5.14.2
Jeśli pojawi się ostrzeżenie, oddzielną
eg
ifor
spacją (+1 char), jeśli przeszkadzaprzykładowe użycie:
OBJAŚNIENIE: Do każdego znaku (
.
) w każdym wierszu wejściowym (for<>
) zastosuj „wzór” podstawienia, który w rzeczywistości jest oceniany jako wyrażenie (e
flagas///
), które inkrementuje znak w górę (uc
) (.
/$&
jest krótszy niż bardziej oczywiste(.)
/$1
) liczą się w (niezainicjowanym) haszu (%h
). Następnie skrót literowy częstotliwości jest używany w funkcji porównania sortowania w celu wydrukowania wielkich liter alfabetu we właściwej kolejności.źródło
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
iEND{}
, ale zawsze były dłuższe. Jeśli chcesz, możesz zaktualizować odpowiedź-n
owija sięwhile(<>){...}
wokół kodu. Unikam edytowania kodu innych użytkowników. Zbyt łatwo popełnić błąd, niektóre rzeczy działają tylko na niektórych komputerach itp.}{
„zastrzyku”, a nie tylko o dobrze znanej-n
opcji. Można by się spodziewać, że ciąg kod faktycznie technicznie jest owinięty przez while Pętla ciąg kodu przed egzekucją, nie tylko po prostu, że to jakoś działa jak jak gdyby był owinięty ..$h{$b}<=>$h{$a}
z$h{$b}-$h{$a}
R, 123 bajty
Kod został ulepszony dzięki sugestiom @RichieCotton.
Wynik:
źródło
C ++,
185183179177 bajtówOczywiście nie oczekuje się wygranej (czy C ++ może kiedykolwiek wygrać?), Ale mimo to jest to zabawne ćwiczenie.
Wyjaśnienie:
źródło
VBScript
181109Zaktualizowano, aby używać zupełnie innego algorytmu. Wygrywa JavaScript!
Ładny:
Gra w golfa:
źródło
J
4135 bajtówPróbny:
Wyjaśnienie:
Kluczem jest dodanie lewej tablicy, aby wszystkie litery były dostępne i już w kolejności. Zabawną konsekwencją użycia rzeczownika jako trzeciego palca widelca jest to, że działa on zarówno jako czasownik, jak i fraza.
źródło
Groovy -
1301231151129892Zgodnie z radą @ cfrick (dwa razy!):
Mały test (bezwstydnie skradziony z @jpjacobs):
I proponowany test również przechodzi
źródło
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
za 104it.grep(~/(?i)$c/)
zamiastit.toUpperCase().grep(c)
toUpperCase
denerwowało.SAS - 217 (myślę)
Dane wejściowe należy umieścić w wierszu po wyciągu cards4 lub na odpowiednich kartach dziurkowanych dla twojego systemu. Myślę, że takie podejście pozwala zaoszczędzić kilka znaków w porównaniu z próbą zacytowania danych wejściowych.
Wiem, że nie jest to pełna specyfikacja, ponieważ zwraca tylko znaki pojawiające się w ciągu wejściowym. Być może będę musiał przemyśleć to trochę.
źródło
AppleScript, 278
Zauważyłem, że tak
"a" = "A"
jest w AppleScript. Mogę użyć tego w golfie kodu, ale reszta skryptu jest zbyt trudna. Użyłem AppleScript 1.8.3.To definiuje funkcję
f
. Jeśli dodaszf("a string")
na dole skryptu i uruchomisz go w edytorze skryptów, wyświetli wynik.Sformatowane i skomentowane:
źródło
VBScript
157156 bajtówEdytuj: zmieniono msgbox (p) na msgbox p
Bardziej czytelny:
Gra w golfa: (155 znaków + 1 powrót karetki)
Miałem go wcześniej w 171 z kodem, który uznałem za bardziej interesujący, ale metoda sortowania drei jest wygodniejsza i krótsza i wymaga len (s), co powoduje, że „dla” jest krótsze niż „while” dla pierwszej pętli. (ziewać)
źródło
for t=0
powinny byćfor t=1
, w przeciwnym razie zawsze wydrukować cały alfabet.J -
3835 znakówFunkcja pobierająca dane po prawej jako ciąg znaków. Nie jestem zwycięzcą, ale pisanie było fajne.
Wyjaśniono:
toupper
to czasownik w standardowej bibliotece, który zwiększa ciąg. To staje się właściwym argumentem czasownika, a lewym argumentem jest alfabet: punkty kodowe ASCII od 65 do 90.[
i,e.~#])
wybiera (#
) te litery w prawym arg (]
), które są elementami (e.~
) po lewej, a następnie wstawia (,
) lewy arg ([
). To znaczy, trzymamy tylko wielkie litery i dodajemy jedną kopię alfabetu na końcu, aby upewnić się, że złapiemy je wszystkie.#/.~@
następnie podaje częstotliwości każdego znaku. Zdarza się, że jest to podane w kolejności alfabetycznej, więc zaraz potem możemy downsortować (\:
) alfabet (lewy argument[
).Szybki, leniwy przykład poniżej. Nie krępuj się go wypróbować na tryj.tk .
źródło
T-SQL 178
Zasadniczo jest to moje rozwiązanie VBScript, ale zaimplementowane w SQL.
Jest to nadużycie wyjściowe XML w celu konkatenacji kolumny. W praktyce można go połączyć z zewnętrznym stołem w celu emulacji
GROUP_CONCAT
funkcje w MySQL i innych.Deklarowanie
@
zmiennej:Kod:
źródło
Perl, 78 bajtów
Wynik dla przykładu w pytaniu:
Nie golfowany:
źródło
echo -e 'x\ny\n\nz\n'
wyjścia, który powinien zwrócićXYZABCDEFGHIJKLMNOPQRSTUVW
, aleXYABCDEFGHIJKLMNOPQRSTUVWZ
zamiast tego daje wynik . Zgadnij dlaczego .. :)PHP - 105 bajtów
Oto zrzut heksowy, przyczyna znaków specjalnych:
I nieco mniej golfowa wersja:
Przykład:
źródło
preg_filter()
?echo join(array_keys($f));
można zapisać jeden bajtC # w LINQPad - 203 bajtów
Przyjąłem inne podejście do odpowiedzi Logana Dam. Najpierw upewniłem się, że każdy znak w ciągu wejściowym jest posortowany według wyglądu i istnieje tylko raz w ciągu wyjściowym. Następnie dodałem każdy brakujący znak z alfabetu do ciągu wyjściowego.
Niestety, nie wybiłbym odpowiedzi Logana Dama, gdybym zrobił to w Visual Studio.
Bardziej czytelna wersja:
źródło
C # (i LINQ)
255226210 bajtówKorzystając z porady Patricka Huizingi, składnia zapytania jest teraz krótsza:
Wyjaśnienie:
Równoważna składnia metody (217):
Oryginalny post:
źródło
P
zamiastProgram
istring[]a
zamiaststring[] args
ic=>...
zamiast(c)=>...
.using
instrukcji możesz także umieścić klasę wSystem.Linq
przestrzeni nazw i usunąć obie za pomocą instrukcji. Następnie możesz zapisać niektóre postacie i nadal będzie dobrze działać.namespace
jest dłuższy niż,using
a dwa dodatkowe{}
s będą mnie kosztować więcej.namespace System.Linq{}
jest wyraźnie krótszy niżusing System;using System.Linq;
tylko na to patrzeć. Chodzi o to, abyusing
całkowicie pominąć oba .C ++
701322232 bajtyPierwsza wersja 701 bajtów (idiomatyczne użycie STL)
Rozszerzona czysta wersja:
Chodzi o to, aby zademonstrować „właściwy” program C ++ bez żadnych włamań. Zignoruj płytę kotłową i fakt, że kompiluje się ona tylko w VC ++
Objaśnienie:
Wypełniamy A do Z ciągiem znaków za pomocą iota () , co zapewnia, że kiedy policzymy wystąpienia, każdy znak pojawi się, nawet jeśli nie ma go na wejściu.
transform () kopiuje znak po znaku ze standardowego wejścia i umieszcza go na końcu s po wywołaniu toupper () na każdym
Liczba każdego znaku jest zmniejszana na mapie (utrzymując liczby ujemne, możemy sortować malejąco bez dodatkowego kodu)
Wpisy mapy zliczania są kopiowane do zestawu par, zamieniając (char, count) na (count, char). Ponieważ zestawy są uporządkowane, sortujemy je według malejącej liczby częstotliwości
Na koniec kopiujemy zawartość zestawu do standardu, używając transformacji i używając select2nd (), aby wybrać tylko drugiego członka pary.
Kod jest dość czytelny. Rozwiązanie C ++ 11 wyglądałoby o wiele ładniej, ponieważ możemy używać lambd
Wersja C ++ 11 - nie potrzeba lambda, ale auto i zakres oparte na sprawiają, że wszystko jest bardzo czyste (pomyśl o tym, możesz zrobić bardzo podobnie ze zwykłym C ++ 98)
Wersja rozszerzona:
Następna iteracja (po co czytać ze stdin, skoro mamy argv):
Wersja rozszerzona:
źródło
Galaretka , 9 bajtów (niekonkurencyjna)
Wyjaśnienie
Odczytuje się to jako „posortuj wielkie litery według liczby wystąpień w danych wejściowych pisanych wielkimi literami, odwróconych”, co jest dość dosłownym tłumaczeniem wyzwania: P
Wypróbuj online!
To wyzwanie było powiązane z Jelly HyperTraining, w którym rozwiązaliśmy to wyzwanie. Wysłałem to, ponieważ jako pierwszy osiągnąłem 10 bajtów.
-1 bajt dzięki Erik the Outgolfer (nauczyciel JHT)
źródło
ØAŒuċ¥@ÞU
C ++ 377
Implementuje qsort przy użyciu liczby liter w tablicy n, aby posortować alfabet w tablicy A. Uruchom za pomocą wiersza poleceń:
golf.exe < in.txt
źródło
C, 117 (119) bajtów
95
z223
kosztem 1 dodatkowym bajt.char c;
na justc;
i++c
toc=c+1%255
.źródło
PowerShell - 139 znaków
Po pierwsze, nie jestem ekspertem od PowerShell. Jestem pewien, że są krótsze niż to. Ale był z tego zadowolony i postanowił się podzielić.
Jak to działa:
źródło
Cejlon , 98 bajtów
źródło
APL,
2620 znaków⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
-6 dzięki Adamowi.
źródło
('\w'⎕r'\u0')
→1(819⌶)