Napisz najkrótszy program, który generuje histogram (graficzna reprezentacja rozkładu danych).
Zasady:
- Musi wygenerować histogram na podstawie długości znaków słów (łącznie z interpunkcją) wprowadzanych do programu. (Jeśli słowo ma 4 litery, pasek reprezentujący cyfrę 4 zwiększa się o 1)
- Musi wyświetlać etykiety pasków, które korelują z długością znaków reprezentowanych przez paski.
- Wszystkie znaki muszą zostać zaakceptowane.
- Jeśli paski muszą być skalowane, musi istnieć jakiś sposób pokazany na histogramie.
Przykłady:
$ ./histogram This is a hole in one!
1 |#
2 |##
3 |
4 |###
$./histogram Extensive word length should not be very problematic.
1 |
2 |#
3 |#
4 |##
5 |
6 |##
7 |
8 |
9 |#
10|
11|
12|#
./histogram Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1 |##
2 |#######
3 |#
4 |#######
5 |###
6 |#
7 |##
8 |##
9 |##
Odpowiedzi:
K, 35
.
.
Dłuższy przykład
źródło
R,
5547 znakówNa szczęście R jest wyposażony w funkcję wykresu
hist
dla histogramów, tutaj dostarczaną zbreaks
argumentem, w którym przerwy wynoszą 0,5, 1,5, ... aż do maksimum (wejście) +0,5.sapply(scan(,""),nchar)
przyjmuje dane wejściowe (jako standardowe), oddziela je po spacjach i zlicza liczbę znaków każdego elementu.Przykłady:
Edytować:
Wariacja na 71 znaków z etykietą osi dla każdej możliwej wartości:źródło
Python - 83 znaki
Wydaje się, że możemy pobierać dane wejściowe z dowolnego miejsca, więc pobiera dane wejściowe podczas wykonywania, a nie z wiersza poleceń, i korzysta z sugestii Ejrba, aby skrócić go o 8.
Python - 91 znaków
To się przewróci z cytatami.
Wejście:
Wynik:
źródło
exec
ic=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
Haskell - 126 znaków
To pobiera dane wejściowe
stdin
, a nie wiersz poleceń:źródło
Python 3.3 (93)
Dane wyjściowe:
(pierwszy wiersz to ciąg wejściowy)
Nie usprawiedliwia liczb jako rozwiązania Pythona Lego Stormtroopr (które jest również krótsze od mojego), ale to mój pierwszy udział w zawodach golfowych, więc równie dobrze mogę zostawić to tutaj :)
źródło
Perl, 56
Dodano przepisanie @ manatwork i dosłowną sugestię nowej linii, dziękuję bardzo! Dodano aktualizacje @ chinese_perl_goth.
Sposób użycia: zapisz jako hist.pl i uruchom
perl hist.pl This is a test
Przykładowe dane wyjściowe:
źródło
printf
? Możesz oszczędzić trochę znaków na temat formatowania. A niektóre z bardziej zmieniając hash do tablicy:$d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d
.printf
nie przyszło mi do głowy i z jakiegoś powodu nie sądziłem, że mogę uzyskać pożądany efekt za pomocą tablicy, niesamowite! @ syb0rg dodaje teraz$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
\n
zaoszczędzić 1 dodatkową postać. Mam na myśli tak: pastebin.com/496z2a0nJ,
4847464543 znakówStosowanie:
źródło
[:((](;#&'#')"0[:+/=/)1+[:i.>./)#@>@;:
: Wypróbuj online!Ruby,
9885Niewiele golfa. Będzie grał w golfa później.
źródło
b ?(?#*b[1].size):''
pomocąb&&?#*b[1].size
.PowerShell,
9793Przykład:
źródło
$a=@{};-split$args|%{$a[$_.length]++};1..($a.Keys|sort)[-1]|%{"{0,-2}|"-f$_+"#"*$a[$_]}
APL (42)
Mógłbym być krótszy, gdybym mógł pominąć wiersze o wartości 0.
Wyjaśnienie:
⎕ML←3
: ustaw poziom migracji na 3 (dzięki temu⊂
(partycja) będzie bardziej przydatna).I⊂⍨' '≠I←⍞
: odczyt danych wejściowych, podział na spacjeM←↑∘⍴¨
: uzyskaj rozmiar pierwszego wymiaru każdego elementu (długości słów) i zapiszM
K←⍳⌈/M
: uzyskaj liczby od 1 do najwyższej wartości wM
, zapisz wK
+⌿K∘.=M
: dla każdej wartości wM
zobacz, ile razy jest zawarta wK
.⊃⍴∘'▓'¨
: dla każdej z tych wartości uzyskaj listę tylu▓
s i sformatuj ją jako macierz.K,
: wstaw każdą wartośćK
do każdego wiersza w matrycy, podając etykiety.Wynik:
źródło
Mathematica 97
Kiedy wprowadzam tekst Deklaracji Niepodległości jako pojedynczy ciąg (oczywiście poprzez wycinanie i wklejanie), generowane dane wyjściowe to:
źródło
Dalej, 201
To było zabawne, ale moje zgłoszenie w Ruby jest bardziej konkurencyjne. ;-)
Przykładowy przebieg:
Maksymalna długość słowa wynosi 99.
źródło
Ruby, 79
Przykładowy przebieg:
Proszę zobaczyć moje zgłoszenie Czwarty dla śmiechu.
źródło
Ruby 1.8.7, 74
Nieco inne podejście niż inne rozwiązania rubinowe:
wynik:
źródło
JavaScript (
159133)Zdecydowanie nie konkurencyjny, ale jak dotąd jedyne rozwiązanie JavaScript. Dzięki @manatwork za wskazówkę dotyczącą używania
String.replace
.Wejście
Wynik
źródło
replace()
zamiastsplit()
+for
iArray
zamiastObject
+ oddzielne zmiennej długości można zmniejszyć za pomocą kilku znaków:prompt(o=[]).replace(/\S+/g,function(p){o[l=p.length]=(o[l]||"")+"#"});for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||""))
. (I jeszcze krócej w Harmonyprompt(o=[]).replace(/\S+/g,p=>o[l=p.length]=(o[l]||"")+"#");for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||""))
.length
tam.Pure Bash 120
Próba:
Zaoszczędź 8 znaków, używając jednego widelca do
tr
: 112Daj ten sam wynik:
render (na moim hoście :)
źródło
PHP, 162
Stosowanie:
źródło
8 , 162 bajty
Kod
Stosowanie
Wynik
Nieskluczony kod ( SED to diagram efektu stosu)
źródło