Wyzwanie:
Utwórz wykres ASCII z najczęściej używanymi słowami w danym tekście.
Zasady:
- Akceptuj
a-z
iA-Z
(znaki alfabetu) tylko jako część słowa. - Zignoruj wielkość liter ( w naszym celu
She
==she
). - Zignoruj następujące słowa (dość arbitralne, wiem):
the, and, of, to, a, i, it, in, or, is
Wyjaśnienie: biorąc pod uwagę
don't
: byłoby to przyjęte jako 2 różne „słowa” w zakresacha-z
iA-Z
: (don
it
).Opcjonalnie (to zbyt późno, aby zostać formalnie zmianę specyfikacji teraz), który może zdecydować się odrzucać wszystkie single-literą „słowa” (może to potencjalnie powodują skrócenie listy ignorowanych zbyt).
Przetwórz dane text
(przeczytaj plik określony za pomocą argumentów wiersza poleceń lub potokiem; przypuszczam us-ascii
) i zbuduj nam plik word frequency chart
o następujących cechach:
- Wyświetl tabelę (zobacz również poniższy przykład) dla 22 najczęściej używanych słów (uporządkowanych według malejącej częstotliwości).
- Słupek
width
przedstawia liczbę wystąpień (częstotliwość) słowa (proporcjonalnie). Dodaj jedną spację i wydrukuj słowo. - Upewnij się, że te kreski (plus spacja-słowo-spacja) zawsze pasują :
bar
+[space]
+word
+[space]
powinno zawsze zawierać <=80
znaki (upewnij się, że uwzględniłeś możliwe różne długości kresek i słów: np .: drugie najczęściej używane słowo może być znacznie dłuższe niż pierwszy, choć nie różni się tak bardzo pod względem częstotliwości). Zmaksymalizuj szerokość słupków w ramach tych ograniczeń i odpowiednio skaluj słupki (zgodnie z reprezentowanymi przez nie częstotliwościami).
Przykład:
Tekst przykładu można znaleźć tutaj ( Alice's Adventures in Wonderland, autorstwa Lewisa Carrolla ).
Ten konkretny tekst dałby następujący wykres:
_________________________________________________________________________ | _________________________________________________________________________ | Ona | _______________________________________________________________ | ty | ____________________________________________________________ | powiedziany | ____________________________________________________ | alicja | ______________________________________________ | był | __________________________________________ | że | ___________________________________ | tak jak | _______________________________ | jej | ____________________________ | z | ____________________________ | w | ___________________________ | s | ___________________________ | t | _________________________ | na | _________________________ | wszystko | ______________________ | to | ______________________ | dla | ______________________ | miał | _____________________ | ale | ____________________ | być | ____________________ | nie | ___________________ | one | __________________ | więc
Dla twojej informacji: są to częstotliwości, na których zbudowany jest powyższy wykres:
[('she', 553), ('you', 481), ('said', 462), ('alice', 403), ('was', 358), ('that ', 330), (' as ', 274), (' ona ', 248), (' z ', 227), (' at ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' ale ', 175), (' być ', 167), (' nie ', 166), (' oni ', 155), (' tak ', 152)]
Drugi przykład (aby sprawdzić, czy zaimplementowano pełną specyfikację):
Zamień każde wystąpienie you
w połączonym pliku Alicji w Krainie Czarów nasuperlongstringstring
:
________________________________________________________________ | ________________________________________________________________ | Ona | _______________________________________________________ | superlongstringstring | _____________________________________________________ | powiedziany | ______________________________________________ | alicja | ________________________________________ | był | _____________________________________ | że | ______________________________ | tak jak | ___________________________ | jej | _________________________ | z | _________________________ | w | ________________________ | s | ________________________ | t | ______________________ | na | _____________________ | wszystko | ___________________ | to | ___________________ | dla | ___________________ | miał | __________________ | ale | _________________ | być | _________________ | nie | ________________ | one | ________________ | więc
Zwycięzca:
Najkrótsze rozwiązanie (według liczby znaków, na język). Baw się dobrze!
Edycja : Tabela podsumowująca dotychczasowe wyniki (2012-02-15) (pierwotnie dodana przez użytkownika Nas Banov):
Język Łagodny Surowy ========= ======= ====== Kaczmarek 130 143 Perl 185 Windows PowerShell 148199 Mathematica 199 Wiśniewska 185 205 Unix Toolchain 194 228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Kaczor 321 Matlab 404 C # 422 Wiśniewska 386 PHP 450 F # 452 TSQL 483 507
Liczby przedstawiają długość najkrótszego rozwiązania w określonym języku. „Ścisłe” odnosi się do rozwiązania, które w pełni realizuje specyfikację (rysuje |____|
słupki, zamyka pierwszą ____
kreskę na górze linią, uwzględnia możliwość tworzenia długich słów z dużą częstotliwością itp.). „Zrelaksowany” oznacza, że zdecydowano się na skrócenie pewnych swobód do rozwiązania.
Uwzględniane są tylko rozwiązania krótsze niż 500 znaków. Lista języków jest posortowana według długości rozwiązania „ścisłego”. „Unix Toolchain” oznacza różne rozwiązania, które używają tradycyjnej powłoki * nix oraz mieszanki narzędzi (takich jak grep, tr, sort, uniq, head, perl, awk).
źródło
s
it
są reprezentowane.Odpowiedzi:
LabVIEW 51 węzłów, 5 struktur, 10 diagramów
Nauczenie słonia stepowania nigdy nie jest ładne. Pominę liczbę znaków.
Program przebiega od lewej do prawej:
źródło
Ruby 1,9, 185 znaków
(w dużej mierze oparte na innych rozwiązaniach Ruby)
Zamiast używać jakichkolwiek przełączników wiersza poleceń, takich jak inne rozwiązania, możesz po prostu przekazać nazwę pliku jako argument. (tj.
ruby1.9 wordfrequency.rb Alice.txt
)Ponieważ używam tutaj literałów znakowych, to rozwiązanie działa tylko w Rubim 1.9.
Edycja: zastąpiono średniki podziałami wierszy dla „czytelności”. : P
Edycja 2: Shtéf wskazał, że zapomniałem spacji na końcu - naprawiłem to.
Edycja 3: ponownie usunięto spację;)
źródło
GolfScript,
177175173167164163144131130 znakówWolno - 3 minuty dla przykładowego tekstu (130)
Wyjaśnienie:
„Dobrze” (miejmy nadzieję). (143)
Mniej wolno - pół minuty. (162)
Wyjście widoczne w dziennikach wersji.
źródło
206
powłoka, grep, tr, grep, sort, uniq, sort, head, perl
hm, tak jak powyżej:sort -nr
->sort -n
a potemhead
->tail
=> 208 :)update2: erm, oczywiście powyższe jest głupie, ponieważ zostanie wtedy odwrócone. Zatem 209.
update3: zoptymalizowano wyrażenie regularne wykluczania -> 206
dla zabawy, oto wersja tylko dla Perla (znacznie szybsza):
źródło
Transact SQL ustalane na podstawie rozwiązanie (SQL Server 2005)
1063892873853827820783683647644630 znakówDziękuję Gabe'owi za kilka przydatnych sugestii dotyczących zmniejszenia liczby znaków.
Uwaga: Dodane podziały wierszy w celu uniknięcia pasków przewijania wymagany jest tylko ostatni podział wiersza.
Czytelna wersja
Wynik
I z długim sznurkiem
źródło
0.000
na just0
, a następnie użycie-C
zamiast1.0/C
. A coFLOAT
doREAL
uratuje udar zbyt. Najważniejsze jest jednak to, że wygląda na to, że masz wieleAS
instancji, które powinny być opcjonalne.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Ruby
207213211210207203201200 znakówUlepszenie Anurag, zawierające sugestię od rfusca. Usuwa również argumenty do sortowania i kilka innych drobnych golfistów.
Wykonaj jako:
Edycja: wstaw 'wstawienia' z powrotem, musi tam być, aby uniknąć cudzysłowów na wyjściu.
Edit2: Zmieniono
plik- > IO Edit3: usunięto / i
Edit4: Usunięto nawiasy wokół (f * 1.0), ponownie
zliczono Edit5: Użyj dodawania ciągu w pierwszej linii; rozwijać się
s
w miejscu.Edit6: Zmieniono m float, usunięto 1.0. EDYCJA: Nie działa, zmienia długości. EDYCJA: Nie gorzej niż przed
Edit7: Użyj
STDIN.read
.źródło
Mathematica (
297284248244242199 znaków) Pure Functionaloraz badanie prawa Zipfa
Spójrz Mamo… bez vars, bez rąk… bez głowy
Edycja 1> zdefiniowano niektóre skróty (284 znaki)
Kilka wyjaśnień
Wynik
tekst alternatywny http://i49.tinypic.com/2n8mrer.jpg
Mathematica nie nadaje się dobrze do gry w golfa, a to tylko z powodu długich, opisowych nazw funkcji. Funkcje takie jak „RegularExpression []” lub „StringSplit []” sprawiają, że szlocham :(.
Testowanie prawa firmy Zipf
Prawo Zipfa przewiduje, że w przypadku tekstu w języku naturalnym wykres log (ranga) vs log (liczba wystąpień) zachowuje zależność liniową .
Prawo to jest wykorzystywane przy opracowywaniu algorytmów kryptografii i kompresji danych. (Ale to NIE jest "Z" w algorytmie LZW).
W naszym tekście możemy to przetestować w następujący sposób
Wynik jest (dość dobrze liniowy)
tekst alternatywny http://i46.tinypic.com/33fcmdk.jpg
Edytuj 6> (242 znaki)
Refaktoryzacja wyrażenia regularnego (nie ma już funkcji Select)
Porzucenie 1 słów znakowych
Bardziej wydajna definicja funkcji „f”
Edytuj 7 → 199 znaków
f
zTranspose
iSlot
(#1
/#2
) argumentów.f@x
zamiast,f[x]
jeśli to możliwe)źródło
|i|
jest zbędny w Twoim wyrażeniu regularnym, ponieważ już go masz.|
.C # -
510451436446434426422 znaków (minified)Nie tak krótko, ale teraz prawdopodobnie poprawne! Uwaga, poprzednia wersja nie pokazywała pierwszego wiersza słupków, nie skalowała słupków poprawnie, pobierała plik zamiast pobierać go ze standardowego wejścia i nie zawierała całej wymaganej oznajmialności C #. Możesz łatwo zgolić wiele pociągnięć, gdyby C # nie potrzebował tak wielu dodatkowych bzdur. Może Powershell mógłby zrobić lepiej.
422 znaki z wbudowanym lendivisorem (co sprawia, że jest 22 razy wolniejsze) w poniższej formie ( znaki nowej linii używane dla wybranych spacji):
źródło
Perl,
237229209 znaków(Zaktualizowany ponownie, aby pokonać wersję Ruby, wprowadzając więcej brudnych sztuczek golfowych, zastępując
split/[^a-z/,lc
jelc=~/[a-z]+/g
i eliminując sprawdzanie pustego ciągu w innym miejscu. Zostały one zainspirowane wersją Ruby, więc kredyt jest należny.)Aktualizacja: teraz z Perlem 5.10! Wymień
print
sięsay
i używać~~
, aby uniknąćmap
. To musi być wywołane w linii poleceń jakoperl -E '<one-liner>' alice.txt
. Ponieważ cały skrypt znajduje się w jednej linii, napisanie go jako jednowierszowego nie powinno sprawiać trudności :).Zauważ, że ta wersja normalizuje wielkość liter. Nie skraca to żadnego rozwiązania, ponieważ usunięcie
,lc
(dla małych liter) wymaga dodaniaA-Z
do podzielonego wyrażenia regularnego, więc jest to mycie.Jeśli jesteś w systemie, w którym znak nowej linii to jeden znak, a nie dwa, możesz skrócić ten znak o kolejne dwa znaki, używając dosłownego znaku nowej linii zamiast
\n
. Jednak nie napisałem powyższej próbki w ten sposób, ponieważ jest ona „jaśniejsza” (ha!) W ten sposób.Oto w większości poprawne, ale nie dość krótkie, rozwiązanie w Perlu:
Poniższe informacje są tak krótkie, jak to tylko możliwe, zachowując jednocześnie względną czytelność. (392 znaków).
źródło
foreach
s można zapisać jakofor
s. To 8 znaków w dół. Następnie maszgrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, który, jak sądzę, można zapisać jakogrep{!(/$_/i~~@s)}<>=~/[a-z]+/g
zejście o 4 więcej w dół. Wymień" "
się$"
i jesteś w dół 1 więcej ...sort{$c{$b}-$c{$a}}...
zaoszczędzić jeszcze dwa. Możesz też po prostu przejść%c
zamiastkeys %c
dosort
funkcji i zapisać cztery kolejne.Windows PowerShell, 199 znaków
(Ostatni podział wiersza nie jest konieczny, ale został zawarty tutaj w celu zwiększenia czytelności).
(Aktualny kod i moje pliki testowe są dostępne w moim repozytorium SVN . Mam nadzieję, że moje przypadki testowe wychwytują najczęstsze błędy (długość paska, problemy z dopasowywaniem wyrażeń regularnych i kilka innych))
Założenia:
Historia
Wersja zrelaksowana (137), ponieważ jest to teraz liczone osobno, najwyraźniej:
Odchylenia długości słupków jednego znaku w porównaniu z innymi rozwiązaniami wynikają z tego, że program PowerShell używa zaokrąglania zamiast obcinania podczas konwersji liczb zmiennoprzecinkowych na liczby całkowite. Ponieważ zadanie wymagało tylko proporcjonalnej długości pręta, powinno to być w porządku.
W porównaniu do innych rozwiązań przyjąłem nieco inne podejście do określania najdłuższego paska, po prostu wypróbowując i przyjmując najwyższą taką długość, gdy żadna linia nie ma więcej niż 80 znaków.
Starszą wersję wyjaśnioną można znaleźć tutaj .
źródło
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Mi to pasuje."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(lub wyeliminuj ostatnią spację, ponieważ jest to w pewnym sensie automatyczne). Możesz użyć,-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
aby zaoszczędzić kilka więcej, nie uwzględniając spacji (lub użyj[-2..-23]
).Ruby, 215,
216,218,221,224,236,237znakówaktualizacja 1: Hurra ! Jest to wiązać z JS Bangs " rozwiązania . Nie mogę wymyślić sposobu, aby już ciąć :)
aktualizacja 2: zagrał brudną sztuczkę golfową. Zmieniono
each
na,map
aby zapisać 1 postać :)aktualizacja 3: zmieniona
File.read
naIO.read
+2.Array.group_by
nie był zbyt owocny, zmieniono nareduce
+6. Sprawdzanie bez rozróżniania wielkości liter nie jest potrzebne po małej wielkości literdowncase
w wyrażeniu regularnym +1. Sortowanie malejąco można łatwo przeprowadzić, negując wartość +6. Całkowite oszczędności +15aktualizacja 4:
[0]
zamiast.first
+3. (@ Shtééf)Aktualizacja 5: Rozwiń zmienną
l
w miejscu, +1. Rozwiń zmiennąs
w miejscu, +2. (@ Shtééf)Aktualizacja 6: Użyj dodawania ciągów zamiast interpolacji dla pierwszej linii, +2. (@ Shtééf)
aktualizacja 7: Przeszedłem przez wiele rzeczy, aby wykryć pierwszą iterację wewnątrz pętli, używając zmiennych instancji. Mam tylko +1, chociaż być może jest potencjał. Zachowanie poprzedniej wersji, bo uważam, że ta to czarna magia. (@ Shtééf)
Czytelna wersja
Używać:
Wynik:
źródło
scan
dało mi jednak lepszy pomysł, więc znowu uzyskałem przewagę :).Python 2.x, podejście równoleżnikowe =
227183 znakówPozwalając na swobodę w implementacji, skonstruowałem konkatenację ciągów, która zawiera wszystkie wyrazy wymagane do wykluczenia (
the, and, of, to, a, i, it, in, or, is
) - a także wyklucza te dwa niesławne „słowa”s
orazt
z przykładu - i dodałem za darmo wykluczenie dlaan, for, he
. Wypróbowałem wszystkie konkatenacje tych słów z korpusem słów z Alicji, Biblii Króla Jakuba i pliku żargonu, aby sprawdzić, czy są jakieś słowa, które zostaną błędnie wykluczone przez ciąg. I tak zakończyłem z dwoma ciągami wykluczającymi:itheandtoforinis
iandithetoforinis
.PS. zapożyczone z innych rozwiązań, aby skrócić kod.
Tyrada
Jeśli chodzi o słowa, które należy zignorować, można by pomyśleć, że zostaną one wzięte z listy najczęściej używanych słów w języku angielskim. Ta lista zależy od użytego korpusu tekstu . Według jednej z najpopularniejszych list ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequently-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), 10 najpopularniejszych słów to:
the be(am/are/is/was/were) to of and a in that have I
10 najpopularniejszych słów z tekstu Alicji w Krainie Czarów to
the and to a of it she i you said
10 najpopularniejszych słów z pliku żargonu (wersja 4.4.7)
the a of to and in is that or for
Pytanie brzmi więc, dlaczego
or
został uwzględniony na liście ignorowanych problemu, gdzie jest ~ 30 pod względem popularności, podczas gdy słowothat
(8. najczęściej używane) nie jest. itd., itd. Dlatego uważam, że lista ignorowanych powinna być dostarczana dynamicznie (lub można ją pominąć).Alternatywnym pomysłem byłoby po prostu pominięcie pierwszych 10 słów z wyniku - co w rzeczywistości skróciłoby rozwiązanie (elementarne - wystarczyłoby pokazać tylko wpisy od 11. do 32.).
Python 2.x, punktowe podejście =
277243 znakówWykres narysowany w powyższym kodzie jest uproszczony (przy użyciu tylko jednego znaku na słupkach). Jeśli ktoś chce odtworzyć dokładnie wykres z opisu problemu (który nie był wymagany), ten kod to zrobi:
Mam problem z nieco przypadkowym wyborem 10 słów do wykluczenia,
the, and, of, to, a, i, it, in, or, is
więc należy je przekazać jako parametry wiersza poleceń, na przykład:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
To jest 213 znaków + 30, jeśli weźmiemy pod uwagę "oryginalną" listę ignorowanych przekazaną w linii poleceń = 243
PS. Drugi kod również "dopasowuje" długości wszystkich górnych słów, więc żadne z nich nie przepełni się w zdegenerowanych przypadkach.
źródło
\W
lub używają\b
w wyrażeniu regularnym, ponieważ najprawdopodobniej nie są one zgodne ze specyfikacją, co oznacza, że nie będą dzielone na cyfry lub_
mogą również nie usuwać słów pomijanych z ciągów takie jakthe_foo_or123bar
. Mogą nie pojawić się w tekście testu, ale specyfikacja jest dość jasna w tym przypadku.sys.argv
re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 znaków(
main
Dodano jeden podział wiersza w celu zwiększenia czytelności i brak konieczności podziału wiersza na końcu ostatniej linii).Jak to działa, najlepiej widać, czytając argument od
interact
tyłu:map f
małe litery alfabetu, wszystko inne zastępuje spacjami.words
tworzy listę słów, porzucając oddzielające białe znaki.filter (
notElemwords "the and of to a i it in or is")
odrzuca wszystkie wpisy zawierające niedozwolone słowa.group . sort
sortuje słowa i grupuje identyczne w listy.map h
odwzorowuje każdą listę identycznych słów na krotkę formularza(-frequency, word)
.take 22 . sort
sortuje krotki według malejącej częstotliwości (pierwszy wpis krotki) i zachowuje tylko pierwsze 22 krotki.b
odwzorowuje krotki na słupki (patrz poniżej).a
poprzedza pierwszą linię podkreślenia, aby zakończyć najwyższy pasek.unlines
łączy wszystkie te linie razem z nowymi liniami.Najtrudniejsze jest ustawienie odpowiedniej długości paska. Założyłem, że tylko podkreślenia liczą się do długości paska, więc
||
będzie to słupek o zerowej długości. Funkcjab
odwzorowujec x
nadx
, gdziex
lista histogramy. Cała lista jest przekazywana doc
, więc każde wywołaniec
może obliczyć dla siebie współczynnik skalowania przez wywołanieu
. W ten sposób unikam używania matematyki zmiennoprzecinkowej lub wymiernych, których funkcje konwersji i importy pochłaniałyby wiele znaków.Zwróć uwagę na sztuczkę używania
-frequency
. Eliminuje to potrzebę ponieważ sortowania (rosnąco) będzie miejsca pierwsze słowa z największą częstotliwością. Później w funkcji mnożone są dwie wartości, co anuluje negację.reverse
sort
-frequency
u
-frequency
źródło
div
Właściwie nie można go ruszyć ! Spróbuj - wynik jest nieprawidłowy. Powodem jest to, że wykonanie czynnościdiv
przed*
utratą precyzji.JavaScript 1.8 (SpiderMonkey) - 354
Niestety,
for([k,v]in z)
wersja z Rhino nie wydaje się działać w SpiderMonkey ireadFile()
jest trochę łatwiejsza niż używanie,readline()
ale przejście do 1.8 pozwala nam użyć zamknięć funkcji, aby wyciąć kilka dodatkowych linii ...Dodanie spacji dla czytelności:
Stosowanie:
js golf.js < input.txt
Wynik:
(wersja podstawowa - nieprawidłowo obsługuje szerokości prętów)
JavaScript (Rhino) -
405395387377368343304 znakiMyślę, że moja logika sortowania nie działa, ale… nie wiem.Naprawiono Brainfart.Zminimalizowane (nadużycie
\n
jest interpretowane jako;
czasami):źródło
i[tns]?
kawałek. Bardzo podstępnie..replace(/[^\w ]/g, e).split(/\s+/).map(
można je zastąpić.replace(/\w+/g,
i użyć tej samej funkcji, co.map
... Nie jestem również pewien, czy Rhino obsługujefunction(a,b)b.c-a.c
funkcję sortowania zamiast funkcji sortowania (spidermonkey), ale to będzie shave{return }
...b.c-a.c
jest lepszym sortowaniem niż przya.c<b.c
okazji ... Edycja wersji Spidermonkey na dole z tymi zmianami?:
doskonałą bazą do pracy!Wersja PHP CLI (450 znaków)
To rozwiązanie uwzględnia ostatni wymóg, który większość purystów z przekonaniem zdecydowała się zignorować. To kosztowało 170 znaków!
Stosowanie:
php.exe <this.php> <file.txt>
Minifikowane:
Czytelny dla człowieka:
Wynik:
W przypadku długiego słowa słupki są odpowiednio dopasowane:
źródło
Python 3.1 -
245229 znakówMyślę, że używanie Counter to rodzaj oszustwa :) Właśnie o tym przeczytałem około tydzień temu, więc była to doskonała okazja, aby zobaczyć, jak to działa.
Wydruki:
Część kodu została „pożyczona” z rozwiązania AKX.
źródło
open('!')
czyta ze standardowego wejścia - która wersja / system operacyjny jest włączony? czy musisz nazwać plik „!”?Perl,
205191189 znaków / 205 znaków (w pełni wdrożone)Niektóre części były inspirowane wcześniejszymi zgłoszeniami perl / ruby, kilka podobnych pomysłów zostało opracowanych niezależnie, inne są oryginalne. Krótsza wersja zawiera również pewne rzeczy, które widziałem / nauczyłem się z innych zgłoszeń.
Oryginalny:
Najnowsza wersja do191 znaków:Najnowsza wersja do 189 znaków:
Ta wersja (205 znaków) uwzględnia wiersze ze słowami dłuższymi niż te, które można znaleźć później.
źródło
Perl
203202201198195208203/231 znakówAlternatywna, pełna implementacja ze wskazanym zachowaniem (globalne zgniatanie słupków) dla patologicznego przypadku, w którym słowo wtórne jest zarówno popularne, jak i wystarczająco długie, aby połączyć je do ponad 80 znaków ( ta implementacja to 231 znaków ):
W specyfikacji nigdzie nie było stwierdzenia, że ma to iść do STDOUT, więc zamiast print, użyłem perla warn () - cztery znaki tam zapisane. Użyłem mapy zamiast foreach, ale wydaje mi się, że w podziale może być więcej oszczędności (join ()). Mimo to obniżyłem go do 203 - może na nim spać. Przynajmniej Perl znajduje się teraz pod opcją „shell, grep, tr, grep, sort, uniq, sort, head, perl” na razie liczba znaków;)
PS: Reddit mówi „Cześć”;)
Aktualizacja: Usunięto join () na rzecz przypisania i niejawnego złączenia konwersji skalarnej. Do 202. Zwróć też uwagę, że skorzystałem z opcjonalnej zasady „ignoruj słowa z jednej litery”, aby zgolić 2 znaki, więc pamiętaj, że liczba częstotliwości to odzwierciedli.
Aktualizacja 2: Zamieniono przypisanie i niejawne połączenie za zabicie $ /, aby uzyskać plik jednym haustem, używając w pierwszej kolejności <>. Ten sam rozmiar, ale bardziej paskudny. Zamieniono, jeśli (! $ Y) {} na $ y || {} &&, zapisano 1 dodatkowy znak => 201.
Aktualizacja 3: Przejął kontrolę nad zmniejszaniem wielkości liter wcześnie (lc <>), przenosząc lc z bloku mapy - zamieniono oba wyrażenia regularne, aby nie używać już opcji / i, ponieważ nie jest już potrzebna. Zamieniono jawną warunkową konstrukcję x? Y: z dla tradycyjnego perlgolfa || niejawna konstrukcja warunkowa - /^...$/i?1:$x{$ } ++ dla /^...$/||$x{$ } ++ Zapisano trzy znaki! => 198, przełamał barierę 200. Może wkrótce zasnąć ... może.
Aktualizacja 4: Brak snu doprowadził mnie do szaleństwa. Dobrze. Bardziej szalony. Doszedłem do wniosku, że wystarczy przeanalizować zwykłe szczęśliwe pliki tekstowe, więc poddałem się, jeśli osiągnie wartość null. Uratowano dwie postacie. Zastąpiono „długość” krótszym o 1 znak (i znacznie bardziej golfowym) y /// c - słyszysz, GolfScript? Idę po ciebie!!! szloch
Aktualizacja 5: Brak snu sprawił, że zapomniałem o limicie 22 rzędów i ograniczeniu kolejnej linii. Z powrotem do 208 z tymi obsługiwanymi. Nieźle, 13 postaci, które sobie z tym poradzą, to nie koniec świata. Bawiłem się regex inline eval perla, ale masz problemy z uruchomieniem go i zapisaniem znaków ... lol. Zaktualizowano przykład, aby pasował do bieżącego wyjścia.
Aktualizacja 6: Usunięto niepotrzebne szelki chroniące (...) dla, ponieważ syntaktyczny cukierek ++ pozwala na szczęśliwe wpychanie go w kierunku. Dzięki wkładowi Chasa. Owens (przypominając mój zmęczony mózg), znalazł tam rozwiązanie klasy postaci i [tns]. Powrót do 203.
Aktualizacja 7: Dodano drugą pracę, pełną implementację specyfikacji (w tym zachowanie pełnego ściskania kresek dla drugorzędnych długich słów, zamiast obcinania, które robi większość ludzi, w oparciu o oryginalną specyfikację bez patologicznego przypadku)
Przykłady:
Alternatywne wdrożenie na przykładzie przypadku patologicznego:
źródło
is|in|it|i
sięi[snt]?
- i wtedy nie ma różnicy z opcjonalnym reguły więcej. (Hm, nigdy bym nie pomyślał, żeby powiedzieć kolesiowi z Perla, jak zrobić Regex: D) - jedyny problem: muszę spojrzeć, jak mogę zgolić trzy bajty z mojego własnego rozwiązania, aby być znowu lepszym niż Perl: - |F #, 452 znaków
Strightforward: pobierz sekwencję
a
par liczba słów, znajdź najlepszy mnożnik liczba słów na kolumnęk
, a następnie wydrukuj wyniki.Przykład (mam inną liczbę częstotliwości niż Ty, nie wiem dlaczego):
źródło
float
s.|>
?Python 2.6, 347 znaków
Wynik:
źródło
bm=(76.-len(W[0][0]))/W[0][1]
ponieważ używasz bm tylko raz (stwórz następną linięU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, goli 5 znaków. Ponadto: dlaczego miałbyś używać 2-znakowej nazwy zmiennej w kodowaniu golfa? ;-)* sh (+ curl), częściowe rozwiązanie
To jest niekompletne, ale do diabła, oto częstotliwość słów licząca połowę problemu w 192 bajtach:
źródło
Gawk - 336 (pierwotnie 507) znaków
(po naprawieniu formatowania wyjściowego; naprawieniu skurczów; poprawieniu; poprawieniu ponownie; usunięciu całkowicie niepotrzebnego kroku sortowania; poprawieniu jeszcze raz; i jeszcze raz (ojej, ten zepsuł formatowanie); popraw jeszcze trochę; podejmując wyzwanie Matta, które desperacko poprawiam więc więcej; znalazłem inne miejsce, aby zaoszczędzić kilka, ale oddałem dwa, aby naprawić błąd długości pręta)
Heh heh! Na chwilę wyprzedzam wyzwanie związane z rozwiązaniem [Matt's JavaScript] [1] ! ;) i [python AKX] [2].
Wydaje się, że problem dotyczy języka, który implementuje natywne tablice asocjacyjne, więc oczywiście wybrałem taki, który ma okropnie wadliwy zestaw operatorów. W szczególności nie można kontrolować kolejności, w jakiej awk oferuje elementy mapy mieszającej, dlatego wielokrotnie skanuję całą mapę, aby znaleźć aktualnie najliczniejszą pozycję, drukuję ją i usuwam z tablicy.
To wszystko jest okropnie nieefektywne, przy wszystkich golfifccjach, które zrobiłem, stało się też dość okropne.
Minifikowane:
podziały wierszy służą wyłącznie celom przejrzystości: nie są konieczne i nie powinny być liczone.
Wynik:
Czytelny; 633 znaków (pierwotnie 949):
źródło
Wspólny LISP, 670 znaków
Jestem nowicjuszem LISP-a i jest to próba użycia tablicy mieszającej do liczenia (więc prawdopodobnie nie jest to najbardziej kompaktowa metoda).
można uruchomić na przykład z
cat alice.txt | clisp -C golf.lisp
.W czytelnej formie jest
źródło
C (828)
Wygląda bardzo jak zaciemniony kod i używa glib dla stringów, list i hashów. Ilość Char ze
wc -m
mówi 828 . Nie uwzględnia słów jednoznakowych. Aby obliczyć maksymalną długość paska, bierze się pod uwagę najdłuższe możliwe słowo spośród wszystkich, a nie tylko pierwsze 22. Czy to odchylenie od specyfikacji?Nie obsługuje awarii i nie zwalnia zajętej pamięci.
źródło
*v=*v*(77-lw)/m
da 929. .. ale myślę, że może być dobrze, chyba że znajdę sposób, aby to zrobić dużo krócej)int c
domain
deklaracji imain
jest niejawnieint
(bez typu jak są jakieś argumenty, AFAIK)main(c){...}
. Prawdopodobnie mógłbyś też po prostu napisać0
zamiastNULL
.-Wall
lub z-std=c99
włączoną flagą ... ale przypuszczam, że jest to bezcelowe dla golfa kodowego, prawda?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
na coś innego, aby nie myśleć ludziom, że różnica w stosunku do wersji wolnej pamięci polega na tym: teraz wersja bez wolnej pamięci ma dużo więcej „ulepszeń”.Perl, 185 znaków
200 (lekko złamane)199197195193187185 znaków. Ostatnie dwie nowe linie są znaczące. Zgodny ze specyfikacją.Pierwsza linia wczytuje liczbę ważnych słów do
%X
.Drugi wiersz oblicza minimalny współczynnik skalowania, tak aby wszystkie wiersze wyjściowe miały <= 80 znaków.
Trzecia linia (zawiera dwa znaki nowej linii) generuje wynik.
źródło
Java -
886865756744742744752742714680 znakówAktualizacje przed pierwszym 742 : poprawione wyrażenie regularne, usunięte zbędne sparametryzowane typy, usunięte zbędne białe znaki.
Aktualizacja 742> 744 znaków : naprawiono hack o stałej długości. To zależy tylko od pierwszego słowa, a nie innych słów (jeszcze). Znalazłem kilka miejsc do skrócenia kodu (
i
\\s
w wyrażeniu regularnym zastąpioneArrayList
zastąpione przezVector
). Szukam teraz krótkiego sposobu na usunięcie zależności Commons IO i czytania ze standardowego wejścia.Aktualizacja 744> 752 znaki : Usunąłem zależność commons. Teraz czyta ze standardowego wejścia. Wklej tekst w stdin i naciśnij,
Ctrl+Z
aby uzyskać wynik.Aktualizacja 752> 742 znaki : Usunąłem
public
i spację, nadałem nazwie klasy 1 znak zamiast 2, a teraz ignorowane są jednoliterowe słowa.Aktualizacja 742> 714 znaków : Zaktualizowano zgodnie z uwagami Carl: usuwa zbędne przypisania (742> 730), zastąpionego
m.containsKey(k)
przezm.get(k)!=null
(730> 728), wprowadzono substringing linii (728> 714).Aktualizacja 714> 680 znaków : Zaktualizowano zgodnie z komentarzem Rotsora: poprawiono obliczanie rozmiaru paska, aby usunąć niepotrzebne rzucanie i poprawiono,
split()
aby usunąć niepotrzebnereplaceAll()
.Bardziej czytelna wersja:
Wynik:
To do bani, że Java nie ma
String#join()
i zamyka (jeszcze).Edycja autorstwa Rotsor:
Wprowadziłem kilka zmian w Twoim rozwiązaniu:
Kod jest skondensowane
688711684 długo znaków:Wersja szybka (
720693 znaków)Bardziej czytelna wersja:
Wersja bez ulepszeń zachowania ma 615 znaków:
źródło
IOUtils
zamiast importować ją? O ile wiem, i tak używasz go tylko raz.b
String zamiast StringBuffer. Nie chcę jednak myśleć o tym, jaki byłby występ (zwłaszcza, że dodajesz jedną postać na raz).Scala 2,8 311
314320330332336341375znakóww tym dostosowanie długich słów. Pomysły zapożyczone z innych rozwiązań.
Teraz jako skrypt (
a.scala
):Biegnij z
BTW, edycja od 314 do 311 znaków w rzeczywistości usuwa tylko 1 znak. Ktoś wcześniej pomylił się w liczeniu (CR systemu Windows?).
źródło
Clojure 282 ścisłe
Nieco bardziej czytelnie:
źródło
Scala, 368 znaków
Po pierwsze, czytelna wersja w 592 znakach:
Wynik konsoli wygląda następująco:
Możemy wykonać agresywną minifikację i zmniejszyć ją do 415 znaków:
Sesja konsoli wygląda następująco:
Jestem pewien, że ekspert firmy Scala mógłby zrobić jeszcze lepiej.
Aktualizacja: W komentarzach Thomas podał jeszcze krótszą wersję, składającą się z 368 znaków:
Czytelnie, przy 375 znakach:
źródło
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Java - 896 znaków
931 znaków1233 znaki stały się nieczytelne1977 znaków „nieskompresowanych”Aktualizacja: agresywnie zmniejszyłem liczbę postaci. Pomija jednoliterowe słowa zgodnie ze zaktualizowaną specyfikacją.
Tak bardzo zazdroszczę C # i LINQ.
"Czytelny":
Wyjście Alice:
Produkcja Don Kichota (także od Gutenberga):
źródło