Ваша компания недавно наняла новую группу чрезвычайно преданных сисадминов. Они считают, что просто смотреть на компьютерные экраны довольно ограниченно (я имею в виду, частота обновления 60 Гц просто НЕ достаточна), поэтому они подключили шину данных ЦП к ЦАП и воспроизводят ее на динамике через серверную комнату, чтобы они могли слышать до 20 кГц. Одна проблема: это системные администраторы, а не инженеры-электрики, и их настройки динамиков постоянно ломаются. Они полагали, что это вызвано слишком резкими изменениями значений байтов в коде, который программисты компилируют на мэйнфрейме. Теперь системные администраторы проводят небольшую конкуренцию, чтобы выяснить, кто может создавать код, наиболее удобный для настройки их динамиков.
Вызов
Ваша миссия состоит в том, чтобы создать программу или функцию на выбранном языке, который имеет как можно меньше различий между последовательными байтами (см. Раздел «Расчет»). Эта программа будет иметь задачу расчета собственного балла.
вход
Строка ASCII stdin
или ближайший эквивалент вашего языка, или как ввод функции, если вы создаете функцию. Поскольку ваша программа должна сама принимать данные для подсчета очков, ваша программа должна поддерживать Unicode, если она содержит Unicode. В противном случае ASCII достаточно. Предполагается, что входные данные имеют длину не менее 2 байтов.
расчет
Каждый символ строки будет преобразован в его числовой эквивалент, используя стандарт ASCII. Затем разница между всеми персонажами будет сначала возведена в квадрат, а затем суммирована . Например, строка abd
получит оценку 1²+2²=5
.
Выход
Результатом будет заголовок вашей записи. Это означает, что к нему следует добавить #
или добавить новую строку и -
(тире). Затем он должен вывести имя вашего языка программирования, затем запятую, пробел, а затем целое число, представляющее результат вычисления. Например
#C++, 98
будет действительным выводом. Вывод должен быть дан stdout
либо на вашем языке, ближайшем к нему, либо в качестве возвращаемого значения для вашей функции.
счет
Ваша оценка будет рассчитанным значением вашей программы, с самой программой в качестве входных данных.
Изменить: должны обрабатывать переводы строки, извините за раньше, ребята
Вот скрипт Pyth для проверки подсчета очков.
источник
Ответы:
CJam,
1051827643569545407327279235233229Вышеуказанная программа генерирует фактический исходный код длиной 1 179 112 байт.
тестирование
Используя интерпретатор Java , исходный код может быть сгенерирован и протестирован следующим образом:
Альтернативная версия
При стоимости 36 баллов - для итоговой оценки 265 - мы можем сократить исходный код на 99,92%:
Вы можете попробовать эту версию онлайн в интерпретаторе CJam .
идея
Мы хотим выполнить код
сохраняя счет как можно ниже. Чтобы достичь этого, мы собираемся строить эту строку символ за символом (с несколькими операциями без и до и после) и оценивать результат.
К счастью,
'
(буквенный символ вставки),(
(уменьшение) и)
(приращение) являются последовательными символами ASCII, поэтому добавление произвольных символов является относительно недорогим.Символы ASCII после
'
могут быть переданы как'()…)(
, где число)
зависит от кодовой точки.Например,
+
можно нажать как'())))(
. Расстояние между'
и(
, и(
и)
составляет 1. Трейлинг)(
отменяет друг друга; их единственная функция - проложить путь для следующего'
(соответствующего следующему символу) последовательными символами.Персонажи, толкаемые таким образом, повысят счет на 4 балла.
ASCII-символы перед
'
могут быть переданы как''(…(
, где число(
зависит от кодовой точки.Например,
#
можно нажать как''((((
. Расстояние между'
и(
1.Персонажи, толкаемые таким образом, повысят счет на 2 балла.
''(…(
на самом деле работает для всех символов ASCII, так как Character имеет ширину 16 бит и обтекание. Например,+
можно нажать как''
, а затем 65 532(
с.Этот метод используется в 1,2-мегабайтной версии кода.
Персонаж
'
может быть выдвинут как''
, оставляя счет неизменным.Код
источник
Haskell,
1528279574291196839217744771742Использование (примечание:
"
должно быть экранировано):Я добавляю пустую строку
""
к входной строке, чтобы помочь интерпретатору Haskell выяснить типы. Без этого вывод типа завершается неудачно, код слишком полиморфен. В остальном все как обычно: сопоставьте каждый символ с ascii, составьте список различий между соседями, квадрат, сумму и название языка препинта.источник
> <>, 30227
Гах, название удвоило мой счет; в словах моей собственной программы n & oooooo! Я возьму некоторое время спустя, чтобы сделать это лучше. Я также знаю, что эта оценка может быть отключена, поскольку я не могу ввести новые строки в онлайн-переводчике, и я не уверен, что есть способ заполнить входной стек официальным.
Ни в коем случае не полностью оптимизирован, но в
полной мере используетнекоторые преимущества относительной близости (по крайней мере, с точки зрения символов ASCII) команд в> <>. Я не мог легко представить новую строку в качестве входных данных, поэтому я использовал проверку оценки Pyth, но она подходит для нескольких случайных тестовых случаев, которые я использовал, поэтому с этим все должно быть в порядке.Вот один с результатом 30353 (который должен быть правильным, так как это одна строка):
источник
Ява,
664656550662434Удивительно коротко. Принимает массив символов вместо строки.
Я использовал программу для генерации лучших имен переменных.
источник
((Function<char[],String>) ABCD->{…}).apply(…)
, спасибо. Эти лямбды кажутся довольно неполными без контекста типа.К5, 25478
Довольно простое решение. Это функция, которая получает свой ввод через строку.
источник
Windows PowerShell ISE Host, 62978
638946796077050Редактировать - сохранить некоторые точки, избавившись от
$A
переменной и вместо этого посчитав обратно через строку, а также преобразовав некоторые ключевые слова в CAPSEdit2 - сохранил еще несколько точек, используя
$($HOST.NAME)
вместоPowerShell
Edit3 - сохранил еще несколько точек, поменяв имена переменных и изменив, как генерируется вывод.
Использует переменные, названные числами, так как они «ближе»,
$
поэтому наш штраф меньше.Интересно не использовать обычные техники игры в гольф. Например,
|%{$
22534, а|foreach{$
только 8718.Это, вероятно, близко к оптимальному без изменения методов.
источник
МАТЛАБ,1921439748394443878537593Спасибо Луису Мендо за дальнейшее уменьшение разницы!
Спасибо NumberOne за уменьшение количества шумов путем изменения имени входной переменной!
Как это работает
ans
переменной по умолчанию в MATLABA9876543210
и выводит сумму квадратов соседних разностей строки.diff
находит попарно соседние различия в массиве и создает массивlength(A9876543210)-1
. Используяdiff
строковый массив, он преобразуется вdouble
массив, где генерируются коды ASCII каждого символа, а различия последовательных пар приводят к другому массиву.diff(A9876543210)'
самом деле производило больше шума, чем сA9876543210.'
(спасибо Луис Мендо!)источник
A=
norm(diff(B))^2
короче%d
.B
в качестве имени переменной?A=@(A)...
действует MATLAB, такA
как область видимости.QBasic, 38140
YAY ДЛЯ СИНТАКСА ШОУ
(Протестировано с QB64 .)
Это полная программа, которая вводит строку и выводит ответ. Единственным ограничением здесь является то, что программа не может принимать многострочный ввод (
LINE INPUT
может обрабатывать что угодно, если это только одна строка).Deobfuscated:
Удобно, передавая многосимвольную строку, чтобы получить
ASC
значение ASCII первого символа. Также удобно, чтобы числовые переменные автоматически инициализировались в ноль.источник
Python 2, 91026
Определяет анонимную функцию, которая принимает строку и возвращает счет. Попробуйте онлайн .
Большинство это довольно просто функциональная реализация: застежка - молния
A
с ,A[1:]
чтобы получить список пар букв, а затем вычесть ихord
с, квадрат и просуммировать с выражением генератора.Заметим , что две переменные внутри выражения генератора только когда - либо следуют следующие символы:
)
,,
и пространство. Все три из них имеют очень низкие значения ASCII, поэтому мы должны заканчивать каждую переменную как можно более низким значением ASCII. Самый низкий символ, который может заканчиваться переменной в Python - это0
. Кроме того, каждая возможность, которую мы должны разделить один большой прыжок на два меньших прыжка, приведет к снижению балла:A0
стоит 289, ноA90
составляет всего 145 иA9876543210
ничтожно 73.(Этот подход не помог лямбда-переменной
A
, возможно потому, что за ней следуют[
в одном случае.)источник
JSFuck, 144420642
Постройте это из:
Вставьте это в JSFuck.com небольшого поле ввода «s , чтобы собрать его JSFuck. В результате получается скрипт длиной 112701 символ, поэтому я не могу его здесь разместить. Последние два символа этого скрипта являются круглыми скобками, поместите ввод между ними.
Программа занимает около 20 секунд на моем компьютере, чтобы оценить себя.
объяснение
У меня было больше времени для работы над этим, поэтому я сел и попытался оптимизировать имена переменных. Вот имена переменных, которые стоит использовать, в порядке их оценки.
Вот JavaScript, который я перевел на JSFuck:
Я внимательно посмотрел на переводчик JSFuck.com и выяснил, как работает его функция оценки. С проверкой «Eval source» код станет самовыполняющейся функцией JSFuck. Однако для получения ввода нам нужно получить доступ к аргументам [0] из функции. Это приводит наш окончательный код JS к ...
(Если вам интересно, почему моя предыдущая версия имела более низкий балл, чем этот, это потому, что это была программа JSFuck, которая возвратила строку, которую нужно было оценить как JS. Именно поэтому я не оставила ее в посте)
источник
abs
не нужны. Я думаю, что это может иметь значение ... :)JSFuck, 102280181
.CJam,
23 663+1938911547Попробуйте онлайн
Начинает казаться, что это можно продвигать практически бесконечно, добавляя больше персонажей. Но я думаю, что я начинаю достигать точки убывающей отдачи здесь, поэтому я остановлюсь пока. Например, там, где у меня есть
ULC;;;
, я мог бы использовать весь алфавит в обратном порядке, а затем 26;
, но прирост становится все меньше и меньше.Безусловно, самый большой разрыв, который у меня остался, находится между
m
и,
в начальной строке. Я не нашел ничего разумного, чтобы избавиться от этого. Я уверен, что есть способы. Но если я доведу его до предела, он может начать выглядеть как решение Денниса ...источник
JAVASCRIPT, 33911
Это, безусловно, одна из самых глупых оптимизаций, которые я когда-либо делал в кодовом гольфе ...
Рекомендует Нейлу предложение «спам в комментариях» = P
источник
/**/
в соответствующие места.JAVASCRIPT, 31520
Это решение было
значительно более нелепым,сильно отличающимся от моего другого, и поэтому я чувствовал, что заслуживает своего собственного ответа.Это 7306 символов, большая часть из которых является реальной программой, закодированной в эту строку 0/1, а остальные просто для ее декодирования. Он работает, получая индекс каждого '1' минус индекс предыдущего '1', чтобы получить необходимое значение символа. Затем он возвращает полученную строку в реальную функцию, которая, по сути, является стандартной программой для игры в гольф для решения проблемы (которая составляет всего около 105 символов).
источник
R
68911571835381652224Берет строку из STDIN и преобразует ее в целое число через raw. Различает, возводит в квадрат и суммирует полученный вектор. Результат возвращается в виде строки. Спасибо @nimi за подсказку имени переменной.
источник
Mathematica, 33552
Этот код оценивает безымянную функцию, которая вычисляет «шум» входной строки. Он использует тот факт, что представление двоичных данных в ASCII по существу "бесшумно". Двоичные данные, которые вы видите, являются строкой
который был бы правильным ответом сам по себе, набрав 37848.
Все остальное
просто декодирует двоичную строку и интерпретирует ее как код Mathematica. Обратите внимание, что пустой комментарий Mathematica
(**)
очень "малошумный" и фактически удаляет шум из"
s.источник
Java8:
1171701005089906298890С помощью лямбад-выражения и встроенного присваивания переменной можно немного сократить этот код.
источник
Ява,
129300128400110930106581105101Эта задача на самом деле заставила меня задуматься о персонажах и их оптимизации больше, чем о поиске кратчайшего решения. Я буду продолжать работать, чтобы снизить номер.
Это лямбда-функция со
B
строкой, представляющей функцию. Не забывайте избегать кавычек ("
), передавая это как строку.источник
Пиф, 16391
Единственное замечание, используемое здесь, - это кодировка base-256
#Pyth,
, которая стоит намного дешевле, чем сама строка.источник
М, 47033
52798Чтобы использовать это, мы должны экранировать кавычки и «экранировать» пробельные символы (которые важны в MUMPS!) Следующим образом:
Обратите внимание, что «M» - это альтернативное название «MUMPS» - среди практикующих существуют разногласия по поводу того, какой из них является правильным. Естественно, я выбрал более короткий вариант здесь.
источник
NEW
заполнять). Поэтому, когда я начинаю делать арифметику сAAAA
(сейчасAAA9876543210
), меня заставляют0
(может быть, это просто детали реализации Caché? У меня нет установки GT.M для тестирования). Хороший призыв к приоритетам оператора вещь; Мне всегда трудно мыслить в терминах чисто слева направо операций. (Я также забыл, что у M есть оператор возведения в степень - это не часто встречается, когда вы пишете CRUD-приложения.)Руби, 118402
Он читает в файл через командную строку, например
ruby diff.rb /path/to/file
. Есть место для улучшения, и я сейчас над этим работаю.источник
C ++ 166345
источник
Perl, 93556
Я постараюсь сократить это еще немного.
Оказывается, что фигурные скобки (
{
и}
ASCII 123 и 125) и знак подчеркивания (_
, ASCII 95) очень дороги, поскольку все остальные символы находятся в диапазоне 30–70, поэтому я отформатировалif
их так, как сделал, и почему я использую$AAAAA
вместо любимого Perl$_
.К сожалению, все переменные с символами в них доступны только для чтения, поэтому я не могу использовать такие комбинации, как
$#
и$$
.источник
F #,
136718130303Где есть
\n
после;
.источник
POSIX Shell, 172026
Жаль, что я не могу получить тот же результат, что и проверка Pyth (178386) ...
источник
Луа,
171078117896Golfed:
Ungolfed:
источник
С ++, 49031
макрос C ++, который принимает строку c и записывает результат в стандартный вывод
Попробуйте онлайн!
источник
C ++, 5
источник