Biorąc pod uwagę zdanie wejściowe składające się z jednego lub więcej słów [a-z]+
i zero lub więcej spacji , wypisz histogram ASCII-art (wykres słupkowy) rozkładu liter zdania wejściowego.
Histogram musi być ułożony poziomo, tzn. Z klawiszem litery u dołu w kolejności alfabetycznej od lewej do prawej, z etykietą na osi Y 1-
i co 5 jednostek. Oś Y musi być najmniejszą wielokrotnością pięciu, która jest co najmniej tak wysoka jak najwyższy pasek i musi być wyrównana do prawej. Oś X jest oznaczona literami wejściowymi, bez przerw między nimi. Na przykład dane wejściowe a bb dd
powinny mieć etykietę, abd
a nie ab d
pomijanie c
. Same słupki mogą być wykonane z dowolnego spójnego znaku ASCII - użyję X
tutaj w moich przykładach.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Ponieważ są trzy e
, dwa t
i jeden z nich almsx
.
Więcej przykładów:
the quick brown fox jumped over the lazy dogs
5-
X X
X X
XX X X X XX
1-XXXXXXXXXXXXXXXXXXXXXXXXXX
abcdefghijklmnopqrstuvwxyz
now is the time for all good men to come to the aid of their country
10-
X
X
X X
X X X
5- X X X
X X X X
X XX XXXX X
XXXXX XXXXXXX X
1-XXXXXXXXXXXXXXXXXX
acdefghilmnorstuwy
a bb ccc dddddddddddd
15-
X
X
10- X
X
X
X
X
5- X
X
XX
XXX
1-XXXX
abcd
a bb ccccc
5- X
X
X
XX
1-XXX
abc
I / O i reguły
- Dane wejściowe można przyjmować w dowolnym rozsądnym formacie i dowolną dogodną metodą . Oznacza to również, że możesz pobierać dane wielkimi literami, jeśli ma to większy sens dla twojego kodu.
- Wiodące / końcowe znaki nowej linii lub inne białe znaki są opcjonalne, pod warunkiem, że znaki są odpowiednio ustawione.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Dane wyjściowe mogą być wysyłane do konsoli, zwracane jako lista ciągów, zwracane jako pojedynczy ciąg itp.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Odpowiedzi:
Stax , 37 bajtów
Uruchom i debuguj
źródło
R ,
239230 bajtówWypróbuj online!
table
wykonuje tu ciężkie podnoszenie, jednocząc postacie, sortując je i zwracając ich liczbę.Wszystko inne zapewnia po prostu, że offset jest odpowiedni do drukowania, co jest „prawdziwym” dziełem ascii-artowego wyzwania.
Dzięki @dylnan za wskazanie błędu.
Dzięki @rturnbull za
scan
podejście, upuszczenie 2 bajtów.źródło
gnu sed -r,
516490278249 + 1 bajtówWypróbuj online!
Jestem pewien, że można to poprawić
, ale na razie powinno to być dobre, biorąc pod uwagę, że jest wykonane w wersji sed, w której nie masz natywnej arytmetyki ani sortowania.Więc skłamałem, to nie było wystarczająco dobre, więc poprawiłem (przepisałem) o kolejne 212 bajtów, z wskazówką dotyczącą algorytmu sortowania z szarlatanu krów , co dało mi pomysł, aby skrócić również konwersję jednostkową do dziesiętnej.Opis działania wewnętrznego:
To sortuje dane wejściowe i oddziela grupy spacjami. Działa to najpierw poprzez dodanie na końcu wielkiej litery i spacji oddzielonych dwukropkiem. Następnie przesuwa każdy znak przed dwukropkiem do pasującego znaku za dwukropkiem, używając rozróżniania wielkości liter w pętli. Wielkie litery są następnie zastępowane spacjami, a ciąg jest kopiowany do spacji.
Ta pętla działa poprzez zmniejszenie wielkości każdej grupy znaków o jeden, dodanie posortowanej oryginalnej linii i zwiększenie jednostkowych liczników po dwukropku, który pozostał z sortowania. Zapętla się, dopóki nie zostanie osiągnięta pusta linia o liczbie 5 * n + 1 (ponieważ ostatnia linia ostatecznie powoduje spację). Przestrzeń wzorców wygląda mniej więcej tak po pętli:
Następnie formatowanie wygląda następująco:
I na koniec, konwerter od jednych do dziesiętnych pozostaje:
Zasadniczo dołącza ciąg znaków, w którym jest wiedza o konwersji. Możesz to interpretować jako: spacja: -> 1 i 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. Wyrażenie podstawienia
s/(.)I(.*\1(I?.))|;.*/\3\2/
działa podobnie do sortującego, zastępując znaki przed I [(.)I
] znakiem, który jest obok tego z I przed ciągiem konwersji [(.*\1(I?.))
], a jeśli nie ma I, usuwa dołączony ciąg [|;.*
]. W/\nI/s/^/ /Mg
razie potrzeby podstawienie [ ] dodaje dopełnienie.Dzięki kwakowi krowy za zmniejszenie rozmiaru o 26 bajtów i za krótszy algorytm sortowania.
źródło
\w
(dopasowuje znaki słów) w wielu miejscach, aby zapisać niektóre bajty.:b ... tb
Może też po prostu stać sięs/\B\w/X/g
. Możesz usunąć linię, która następuje po nim,s/:/:,/g
modyfikując wcześniejsze podstawienia. Możesz spojrzeć na goo.gl/JvD7Rs (skrócony link TIO do programu sed), aby zobaczyć, co mam na myśli.zyx...cba
do danych wejściowych.Dyalog APL ,
1099796959388 bajtówWypróbuj online!
Wymaga
⎕IO←0
Sposób zbyt wiele bajtów zapisywane dzięki Adam i Krowy kwak !
źródło
⍵[⍋⍵]~' '
(sortuje i usuwa spacje przed przejściem⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
dwa razy05AB1E ,
5847 bajtówWypróbuj online!
-11 bajtów dzięki @Emigna
źródło
Python 2 , 192 bajty
Wypróbuj online!
Wyjaśnienie
Wiersz 2 oblicza wartości histogramu w dość prosty sposób, odrzucając
' '
.Wiersz 3 wykorzystuje sztuczkę obliczeniową,
ceil(x/5)
ponieważ-(-x/5)
: zaokrąglamy maksymalną częstotliwość do następnej wielokrotności 5 za pomocą wzoru-x/5*-5
. Jesth
.Linia 4 to pętla odliczająca
h
do0
włączającej, drukująca każdy wiersz:Jeśli
y%5==2>>y
wydrukujemy etykietę. To wtedyy
∈ {1, 5, 10, 15, 20,…}(Ta formuła może być krótsza. Potrzebujemy tylko wartości 1 lub True dla {1, 5, 10,…} i 0 lub False lub nawet ujemnej liczby całkowitej dla wszystkich innych wartości
y
.)Prawidłowo uzasadniamy etykietę (lub puste miejsce)
len(`-h`)
spacjami: jest to oszczędny, jednobajtowy oszczędnośćlen(`h`)+1
!Następnie wypisujemy albo
X
wiersze i spacje dla tego wiersza (jeśliy
≥ 1) lub liter (jeśliy
= 0), przeglądając pary klucz-wartośćd
w porządku rosnącym.źródło
'%d-'%y*(y%5==2>>y)
. Czy masz coś przeciwko, jeśli użyję tego w mojej odpowiedzi?-~-(y%5*~-y)
też działa, ale niestety jest to o jeden bajt dłużej.Węgiel , 62 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Utwórz listę 27 list.
Wciśnij każdy znak wejściowy do listy odpowiadający jego pozycji małymi literami. Znaki inne niż małe są wypychane na 27. listę.
Odrzuć 27 element listy.
Weź długości wszystkich elementów listy.
Wydrukuj małe litery odpowiadające niezerowym elementom listy.
Wydrukuj niezerowe elementy listy w górę. Ponieważ jest to tablica liczb całkowitych, każda liczba całkowita jest drukowana jako (teraz pionowa) linia, każda w osobnej kolumnie.
Oblicz liczbę znaczników na osi Y i zapętl nad nimi.
Oblicz pozycję następnego znaku podziałki.
Przejdź do następnego znacznika.
Wydrukuj znacznik odwrócony i odwrócony do przodu, skutecznie wyrównując go do prawej.
źródło
Galaretka , 48 bajtów
Cóż za pole minowe do przemierzenia!
Pełny program wypisujący wynik (jako monadyczny link zwróciłby listę zawierającą znaki i liczby całkowite
[0,9]
)Wypróbuj online! Lub zobacz zestaw testowy
W jaki sposób?
źródło
APL (Dyalog Classic) , 56 bajtów
Wypróbuj online!
źródło
Rubinowy ,
250248234188173157153 bajtówWypróbuj online!
Dzięki:
-x/5*-5
|[]
źródło
Java (JDK 10) , 296 bajtów
Wypróbuj online!
Kredyty
źródło
--m%5==0
może być--m%5<1
, ponieważ masz również&m>0
czek. Im<=d[a]?"x":" "
może byćm>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
na--m%5<1|m==1&&m>0
Pyth, 65 bajtów
Wypróbuj tutaj
Wyjaśnienie
źródło
JavaScript (Node.js) ,
262256 bajtów* Dzięki @Shaggy za zmniejszenie o 2 bajty
Wypróbuj online!
źródło
1.
Weź wejście jako tablica pojedynczych znaków,2.
wymienićx!=" "
zx>" "
.3.
Wymieńm=0
sięi=m=0
imap((x,i)=>
zmap(x=>
.Python 2 ,
249224219215205197187188182176 bajtówWypróbuj online!
Zwraca listę list znaków reprezentujących linie.
map(list,yticks)
.y==1
zastąpiony przezy<2
.'%d-'%y*(y%5==2>>y)
zamiast(`y`+'-')*(not y%5or y<2)
.Nieznacznie nie golfista:
źródło
C # (.NET Core) ,
344340338 + 18 bajtówObejmuje 18 bajtów dla
using System.Linq;
Zaoszczędź 6 bajtów dzięki @KevinCruijssen.
Wypróbuj online!
źródło
j< m;
które można usunąć. Iint i=0,j
może być umieszczony tak jak,i=0,j
po innych liczbach całkowitych dla -4 bajtów. Będziesz jednak musiał uwzględnić 18 bajtów,using System.Linq;
jednak ...for(;i<t;){string p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(o);for(j=o;j<m;){...}a[i++]=q;}
nafor(string p,q;i<t;)for(p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(j=o);j<m;a[i++]=q){...}
. Wypróbuj online.Bash + coreutils,
332324323318312302298296293291 bajtówWypróbuj online!
Adnotacja:
Dzięki @IanM_Matrix za oszczędność 3 bajtów.
źródło
cat b
może<b
zapisywać 3 znakiC, 201 bajtów
Dane wejściowe są pobierane z wiersza poleceń (pierwszy argument). Używa wykrzykników zamiast X, aby dodatkowo zmniejszyć rozmiar kodu. Licznik po lewej stronie ma zawsze trzy znaki.
Testowane z GCC i clang.
źródło
for(p=b[1];*p;p++)
najprawdopodobniej może byćfor(p=b[1]-1;*++p;)
,main(int a,char **b)
prawdopodobnie można grać w golfam(a,b)char**b;
.a!=1
będzie logiczny,a%5&&a!=1?
powinien być równoważny za%5&a!=1?
luba%5&&~-a
.Excel VBA, 316 bajtów
Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z komórki
[A1]
i dane wyjściowe do bezpośredniego okna VBE.Wersja bez golfa
źródło
Perl 5
-n
,198168 bajtówWypróbuj online!
źródło
Python 3 , 177 bajtów
Wypróbuj online!
To może nie być najbardziej wydajne pod względem bajtów podejście w Pythonie, ale naprawdę chciałem rozwiązać to za pomocą lambda „prawdziwie jednowarstwowego”.
Wyświetla listę list znaków. Nadużywa wielu wiodących znaków nowej linii i spacji, tak jak wszyscy inni. Można faktycznie zmniejszyć go do 174 bajtów, jeśli dopuszczalne jest zawinięcie wyniku w inną listę, abyśmy mogli przenieść ostateczne
[0]
indeksowanie do stopki.źródło
JavaScript (ES8), 200 bajtów
Pobiera dane wejściowe jako tablicę znaków. Zwraca ciąg.
Wypróbuj online!
Skomentował
źródło