Напишите программу, которая выводит список количества вхождений каждого уникального символа в его исходный код.
Например, эта гипотетическая программа {Source_Print_1};
должна выдавать следующие выходные данные:
; 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
Форматирование должно соответствовать этому примеру. Никакие посторонние пробелы не допускаются, за исключением необязательного финального перевода строки.
Ваша программа не может прочитать свой собственный исходный код из исходного файла.
Перечисленные символы должны быть в одном из двух порядков. Либо порядок значений символов в кодировке символов, используемый вашим языком (возможно, ASCII), либо порядок отображения символов в вашем источнике.
Этот вопрос вдохновил этот комментарий по Jan Dvorak .
Ответы:
CJam, 14 байтов
Попробуй это здесь .
Вывод в порядке их появления:
Он просто добавляется
<SP>2<NL>
к каждому символу в{S2N`/}
.источник
/// , 12 байт
Большое спасибо @ user23013, который предложил это улучшение по сравнению с моим CJam-кодом, превзойдя его собственный, получивший наибольшее количество ответов в процессе.
Персонажи отсортированы по внешнему виду. Этот код работает на любом языке, который просто печатает свой собственный исходный код при данных обстоятельствах (PHP, ASP и т. Д.).
CJam, 20 байтов
Этот подход не использует встроенный подсчет символов.
Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
CJam, 20 байтов
Как это устроено
Сначала мы начнем с одного из стандартных Quine в CJam
который помещает первый блок в стек, копирует его и запускает копию, что приводит к окончательной печати самого исходного кода.
Затем мы добавляем логику для вычисления количества символов из исходного кода:
Попробуйте онлайн здесь
источник
Python 3.5.0b1 ,
10773 байтаВместо обычного quine для замены строки, который требует записи всего дважды, вот
exec
quine.источник
Mathematica, 101 байт
К сожалению, я не могу использовать любого из обычных трюков в гольфе , как удаление пробелов,
<>
дляStringJoin
,#
вместо того#1
,@
для вызовов функций префикса или@@@
вместоApply[...,{1}]
, потому чтоToString[...,InputForm]
думает , что он должен довольно распечатать все ...Это печатает символы в порядке их появления в коде. Если я могу предположить, что это не выполняется в среде REPL (что довольно необычно для Mathematica), я могу сохранить два байта, пропустив два
;
.источник
InputForm
раздражает ...OutputForm
лучше, но он не цитирует строки.Haskell, 178 байт
Ничего фантастического. Все символы программы находятся в буквальном списке (String). Как и частоты. Застегните оба списка и распечатайте. Выход:
источник
Дротик -
214127Прямая версия:
«4» - это просто бесполезный фактор, который заставляет цифры складываться. Посмотреть / запустить на DartPad .
Оригинал: стандартная тактика Куайн, и названия функций Дарт слишком длинны для хорошего игры в гольф.
Посмотреть / запустить его на DartPad .
источник
Haskell , 146 байт
Попробуйте онлайн!
Выход:
(Плюс дополнительный перевод строки)
Объяснение:
Код
где
"<code>"
строка кода программы без"
.a
проходит через символы ASCII, начиная с пробела.sum[2|b<-show"<code>",a==b]
подсчитывает, как часто символ появляется в строке, причем каждое вхождение учитывается дважды.a:" "++show s
строит строку текущего символа, пробел и количество символов. НаконецmapM putStrLn
печатает каждую строку в списке с завершающей новой строкой.Самым сложным было получить счет
"
правильно. Использование простоb<-"<code>"
будет считать нулевые кавычки, потому что в строке нет ни одного. Использованиеshow"<code>"
добавляет"
перед и конец строки, в результате чего счет четыре. Поэтому мне пришлось добавить в код две дополнительные кавычки, поэтому вместо (короче)a:' ':show s
я использовалa:" "++show s
.источник