Napisz program, który wyświetli listę liczby wystąpień każdego unikalnego znaku w kodzie źródłowym.
Na przykład ten hipotetyczny program {Source_Print_1};
powinien generować takie dane wyjściowe:
; 1
P 1
S 1
_ 2
c 1
e 1
i 1
n 1
o 1
p 1
r 2
t 1
u 1
{ 1
} 1
Formatowanie powinno pasować do tego przykładu. Żadne obce białe znaki nie są dozwolone, z wyjątkiem opcjonalnego końcowego nowego wiersza.
Twój program może nie odczytać własnego kodu źródłowego z pliku źródłowego.
Wymienione postacie muszą być w jednym z dwóch rzędów. Albo kolejność wartości znaków w kodowaniu znaków używanych przez Twój język (prawdopodobnie ASCII), albo kolejność znaków w twoim źródle.
To pytanie zainspirowany tym komentarzem przez Jana Dvoraka .
Odpowiedzi:
CJam, 14 bajtów
Wypróbuj tutaj .
Dane wyjściowe są w kolejności, w jakiej się najpierw pojawiają:
Po prostu dołącza się
<SP>2<NL>
do każdej postaci w{S2N`/}
.źródło
/// , 12 bajtów
Ogromne podziękowania należą się @ @ user23013, który zasugerował to ulepszenie w stosunku do mojego kodu CJam, przechytrzając swoją własną, najlepiej ocenianą odpowiedź.
Postacie są sortowane według wyglądu. Ten kod działa w dowolnym języku, który po prostu drukuje własny kod źródłowy w danych okolicznościach (PHP, ASP itp.).
CJam, 20 bajtów
W tym podejściu nie ma wbudowanego liczenia znaków.
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
CJam, 20 bajtów
Jak to działa
Najpierw zaczynamy od jednego ze standardowych quine w CJam
który wypycha pierwszy blok na stos, kopiuje go i uruchamia kopię, co powoduje, że w końcu drukuje sam kod źródłowy.
Następnie dodajemy logikę do obliczenia liczby znaków z kodu źródłowego:
Wypróbuj online tutaj
źródło
Python 3.5.0b1 ,
10773 bajtówZamiast zwykłego quinu zastępującego ciąg znaków, który wymaga napisania wszystkiego dwa razy, oto
exec
quine.źródło
Mathematica, 101 bajtów
Niestety, nie mogę użyć dowolnego z normalnych sztuczek golfowych jak usuwanie białych znaków,
<>
dlaStringJoin
,#
zamiast#1
,@
dla wywołań funkcji przedrostek lub@@@
zamiastApply[...,{1}]
, ponieważToString[...,InputForm]
uważa, że ma ładnego drukowania wszystkiego ...Spowoduje to wydrukowanie znaków w kolejności, w jakiej występują po raz pierwszy w kodzie. Jeśli mogę założyć, że nie działa to w środowisku REPL (co jest dość niezwykłe w przypadku Mathematica), mogę zapisać dwa bajty, pomijając dwa
;
.źródło
InputForm
jest denerwujący ...OutputForm
jest lepszy, ale nie cytuje ciągów znaków.Haskell, 178 bajtów
Nic fajnego. Wszystkie znaki programu znajdują się na liście dosłownej (String). Podobnie jak częstotliwości. Spakuj obie listy i wydrukuj. Wynik:
źródło
Dart -
214127Wersja bezpośrednia:
„4” jest po prostu błahostką, by sumować liczby. Zobacz / uruchom DartPad .
Oryginał: Standardowa taktyka quine, a nazwy funkcji Dart są trochę za długie, by grać w golfa dobrze.
Zobacz / uruchom go na DartPad .
źródło
Haskell , 146 bajtów
Wypróbuj online!
Wynik:
(Plus dodatkowa nowa linia)
Wyjaśnienie:
Kod jest
gdzie
"<code>"
jest ciąg kodu programu bez"
.a
przechodzi przez znaki ascii zaczynając od spacji.sum[2|b<-show"<code>",a==b]
liczy, jak często znak pojawia się w ciągu, a każde wystąpienie jest liczone dwukrotnie.a:" "++show s
buduje ciąg bieżącego znaku, spację i liczbę znaków. WreszciemapM putStrLn
drukuje każdy ciąg na liście z końcowym znakiem nowej linii.Najtrudniejszą częścią było zliczenie
"
trafności. Użycie justb<-"<code>"
spowoduje zliczenie zerowych cudzysłowów, ponieważ nie ma żadnych w ciągu. Użycieshow"<code>"
dodaje a"
do przodu i końca łańcucha, co daje liczbę czterech. Musiałem więc wstawić dwa dodatkowe znaki cudzysłowu w kodzie, więc zamiast (krótszego)a:' ':show s
użyłema:" "++show s
.źródło