Вы только что были наняты немецкой автомобильной компанией. Ваша первая задача как инженера - написать программу, которая вычисляет экологический след строк ASCII.
Экологический след персонажа рассчитывается следующим образом:
Запишите ASCII-код символа в двоичном виде и сосчитайте количество единиц.
Например, A
имеет размер 2, но O
более грязный с размером 5.
Глобальный след строки представляет собой сумму следов ее символов. Пустая строка имеет нулевой след.
Ваша программа должна принять строку ASCII в качестве параметра (через командную строку или ввод), вычислить ее экологический след и вывести ее. Сама программа должна быть в кодировке ASCII.
Есть сбой, хотя. Поскольку ваша компания желает выйти на новый рынок с более строгими экологическими правилами, вам необходимо настроить свою программу так, чтобы она работала по-другому в «тестовом режиме». Таким образом:
Программа должна вывести 0, когда получит строку в
test
качестве параметра.
счет
Исходный код с наименьшим экологическим следом выигрывает (и да, ответ test
запрещен!)
источник
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Ответы:
CJam,
3331Есть 113000000009500000000340000000116000000010100000001150000000116000000000000160000610000000000006100000000000000000000000000000000000105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049000000000049000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Код эквивалентен
который может быть проверен онлайн .
Как это работает
Как это работает
Этот исходный код имеет экологический след 75.
источник
Ленгуаг , 0
Вывод унарный , так как Lenguage / Brainfuck не имеет нормального способа печати целых чисел в базе 10.
Фактический исходный код содержит
нулевые байты и эквивалентны следующей программе Brainfuck:
Попробуйте это онлайн на brainfuck.tk .
Длина кода Brainfuck весьма неоптимальна - для начала я жестко закодировал следы всех символов ASCII - но счет 0 равен 0 ...
источник
PowerShell,
337344304 баллаЯ кричу на тебя, потому что это дешевле!
Принимает input как
$A
, затем[convert]::ToString()
преобразуется в массив char, затем перебирает цикл for для каждого символа, использует смехотворно многословный для преобразования символа в этой позиции в двоичный, заменяет все 0 на ноль, затем подсчитывает длину и добавляет это к$B
. В конце использует эквивалентность для индексации в динамический массив (т. Е. Если$A
естьtest
, то-CEQ
есть$TRUE
, поэтому он индексирует второй элемент,0
).Edit1 - исправленный тестовый пример.
"TEST"
Edit2 - отыграл пару моментов, перебирая сами символы, а не их индексы, и помня, что
-replace
второй параметр не требуется, если вы заменяете его ничем.источник
" 00100010
более экологична, чем одинарная' 00100111
."TEST"
"
. Также с поправкой-CEQ
на чувствительность к регистру. Это немного повысило баллы, потому что я неправильно оценивал, так' '
как не правильно разграничил его в своих тестах.Пиф -
5249Три очка сэкономить благодаря @orlp.
Принимает ввод в кавычках, чтобы сохранить площадь.
Тестовый пакет .
источник
@,0
с ,*
чтобы сохранить 3 :)@,0
, вы просто забыли изменить?Обыкновенный Лисп,
294281235Чтобы уменьшить оценку, я использовал
@
(стоимость 1) и!
(стоимость 2) в качестве имен переменных (правка: и даже лучше, если я использую@
переменную, встречающуюся чаще всего в функции). Я кричу TOO , потому что это дешевле.Довольно отпечатанных
источник
;)
JavaScript, 279
Исправлена ошибка редактирования (не учитывался бит 1 каждого символа)
Полная программа, с вводом и выводом через всплывающее окно. Протестировано в Firefox, должно работать в любом современном браузере.
Некоторые инструменты (протестировано с Firefox)
источник
test
вместо 0prompt
функцией. В Firefoxprompt
переводит переводы строки (2 бита) в пробелы (1 бит), поэтому мы получаем 277 вместо 279Юлия,
254246232count_ones
Функция подсчитывает количество единиц в двоичном представлении его ввода.Снижение моего экологического следа благодаря FryAmTheEggman!
источник
Питон 3, 271
источник
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman сглаз?Perl,
13611873Заменить все
@
на\0
Пример использования:
источник
MATLAB,
198194 байтаСначала строка считывается из STDIN через
input
функцию. Как только это происходит, мы сравниваем входную строку со строкойtest
. Если результата нетtest
, мы конвертируем каждый символ в его код ASCII, а затем через его двоичное представлениеdec2bin
. Прекрасным следствием этой функции является то, что если вы отправляете строку, двоичное представление ее кода ASCII ограничивается одним символом в строке.В качестве примера:
dec2bin
выводит массив символов. Как только это произойдет, вычтите на 48, что является кодом ASCII для 0, так что матрица преобразуется вdouble
состоящий из 0 и 1. Как только это произойдет, вызовnnz
подсчитывает общее количество ненулевых элементов в этой матрице. Обратите внимание, что этот результат умножается на значение, противоположное строке сравненияtest
. Если строка не будетtest
, мы получаем расчет след. Если он равен, то умножение приводит к 0.Некоторые примеры:
источник
de2bi
вместо него и избегать-48
приведения его к числовому типу (а также к 2 дополнительным символам в имени функции).удар
440430412405403Довольно просто. Зацикливает символы на входе, преобразуя сначала в ascii (с
printf %d
и ведущим'
на числе, затем в двоичный (сbc
), удаляет нули и подсчитывает количество символов.Не очень хороший ответ, но еще не видел попытки bash.
Изменено, поскольку мой первый ответ позволял вводить строку ввода просто в командной строке (т. Е. Она превращалась в несколько входных параметров при многократных словах), но после прочтения некоторых других ответов я думаю, что могу предположить, что она заключена в кавычки, поэтому вся строка выглядит как
$1
источник
do
на{
иdone
с}
. 2. Вам также не нужны места вокруг<<<
. 3. Вы можете заменить\n
буквальный перевод строки.=
и||
стоит 15, тогда как использование!=
и&&
только 13! Дополнительный персонаж, но экономит два очка ...Цейлон,
1431,764,697,571,547,538,501,493,467, 451Это был оригинал, без гольфа
Это берет аргумент из параметра командной строки ... process.arguments является (возможно, пустой) последовательностью строк, поэтому перед использованием одной из них нам нужно проверить, существует ли она на самом деле. В другом случае мы выводим сообщение об ошибке (это не требуется вопросом и будет выброшено в следующих версиях).
sum
Функция Цейлона принимает непустую Iterable элементов некоторого типа, который должен удовлетворятьSummable
, т.е. имеетplus
метод, такой как Integer. (Он не работает с пустыми последовательностями, потому что у каждого типа Summable будет свой ноль, и у среды выполнения нет шансов узнать, какой из них имеется в виду.)Элементы строки или один бит целого числа не являются непустыми итерациями. Поэтому мы используем эту возможность для создания итерируемого, указав некоторые элементы, а затем «понимание» (которое будет оценено как ноль или более элементов). Таким образом, в случае символов мы добавляем их (но только когда установлен соответствующий бит), в случае строк мы добавляем результат символов. (Понимание будет оцениваться только тогда, когда принимающая функция фактически итерирует по нему, а не при построении Iterable.)
Давайте посмотрим, как мы можем уменьшить это. Во-первых, каждая из функций вызывается только в одном месте, поэтому мы можем встроить их. Также, как уже упоминалось выше, избавьтесь от сообщения об ошибке. (764 следа.)
Нам на самом деле не нужно внутреннее вложенное
sum
, мы можем сделать это одно большое понимание. (Это экономит нам 37 балловsum({0,})
и еще несколько пробелов, которые в конце концов будут устранены.) Это 697:Мы можем применить аналогичный принцип к специальной
"test"
строковой строке: так как в этом случае результат равен 0 (т.е. ничего не вносится в сумму), мы можем просто сделать это как часть суммирования (но мы должны инвертировать условие) , Это, в основном, спасает насprint(0);
, некоторые скобки и кучу отступов, которые сводятся к 571:Мы делаем то же самое для первого
if
, с побочным эффектом, который теперь не дает аргументов и выводит0
вместо того, чтобы ничего не делать. (По крайней мере, я думал, что это произойдет здесь, вместо этого, кажется, висит с вечной петлей? Странно.)Мы можем на самом деле опустить
()
дляsum
функции здесь, используя альтернативный синтаксис вызова функции , которая использует{...}
вместо()
, и заполним постижения в Iterable аргументов. Это имеет след 538:Замена имени функции
footprint
(40) наp
(3) экономит еще 37 баллов, в результате чего мы получаем 501. (Имена функций Цейлона должны начинаться с символов нижнего регистра, поэтому мы не можем получить здесь менее 3 баллов.)Имена переменных
s
(5) иc
(4),i
(4) также не оптимальны. Давайте заменим их наa
(аргумент),d
(цифра?) Иb
(бит-индекс). След 493:Я не вижу оставшейся оптимизации без пробелов, поэтому давайте удалим ненужные пробелы (1 точка для каждого пробела, две для каждого из двух разрывов строк):
Просматривая API, я обнаружил, что Character.hash фактически возвращает то же значение, что и его
integer
атрибут. Но у него всего 14 очков вместо 30, поэтому мы опустились до 451!источник
PowerShell,
273336328324293288295редактировать - забыл «тестовый» случай ... так дорого.
editedit - упустил возможность UPPERCASE.
editeditedit - включены комментарии предложения (спасибо TimmyD).
редактировать 4 - D дешевле, чем C (2 против 3)
изменить 5 - Вернуться к 295 из-за проверки чувствительности к регистру.
Зацикливает строку и считает 1, которые сдвигаются со значения ASCII символов.
Подсказка к TimmyD за то, что дал мне возможность использовать заглавные буквы И использовать индекс массива в конце.
источник
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Матлаб, 320
источник
С, 374
Новые строки (не включены в счет) добавлены для ясности. Можно улучшить до 360, просто изменив имена переменных в верхний регистр, но я постараюсь придумать что-нибудь получше.
Ввод осуществляется через командную строку, что означает, что при отсутствии ввода происходит сбой. Я ожидаю худшего результата для ввода через стандартный ввод.
источник
PHP,
377337299 Экологический след (все еще много) ,10291 байтКажется, что PHP безопасен для окружающей среды только в тестовом режиме. ;)
Запускается из командной строки, как:
while
является более дружественным к окружающей среде, чем,for
хотя они имеют одинаковое количество символов. Также имена переменных в верхнем регистре имеют лучшую площадь, чем их аналоги в нижнем регистре.редактировать
decbin
вместоbase_convert
источник
VBA,
475418Спасибо Джейкобу за 57 очков
Преобразует строку в массив байтов (128 - это ярлык vba для «Преобразование строки из Unicode в кодовую страницу системы по умолчанию», поэтому не будет работать на Mac ....)
Циклы, хотя байтовый массив преобразовывает в двоичный и объединяет все вместе.
VBA, почему ты так плохо играешь в гольф ... :(
источник
"test"
конечно)JavaScript,
418410источник
" 00100010
более экологична, чем одинарная' 00100111
.Пиф, 64
Проверяет, является ли ввод тестовым, а если нет, подсчитывает количество единиц в двоичном представлении ввода.
источник
Хаскелл, 292
Здесь особо нечего сказать: превратите каждый символ в значение ascii (
fromEnum
) и вычислите1
s (черезa
). Подведите все результаты.источник
JavaScript (ES6),
521478458449473465Это моя первая попытка в JavaScript-гольфе, так что это, вероятно, очень нелегко.
источник
Рубин,
316313Очень просто, ища еще несколько возможностей для игры в гольф:
b
вместоx
сохранения 3 балла.источник
$*[0]
вместоgets.chomp
(принимает ввод как аргумент командной строки)" 00100010
более экологична, чем одинарная' 00100111
.H
лучше, чемI
по той же причине.Python 2,
294281269266Порт моего Pyth ответа, выше.
Ввод получен в виде строки (с кавычками):
источник
" 00100010
более экологична, чем одинарная' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
со счетом 243.CJam, 123
источник
Пиф, 96
Порт моего ответа CJam, выше / ниже.
источник
I
чтобы пытаться использовать троичный?
, но в этом случае, поскольку это bool, вы можете просто использовать*
(после переключенияn
вместоq
),k
автоматически""
иs
на строках то же самое ajk
. Надеюсь, вам весело изучать Pyth! :)CJam,
83817977Лучше всего, если вы попробуете несколько вариантов:
Попробуйте онлайн
Объяснение:
источник
Руби, 247
Простой подход, циклически проходящий через все байты ввода и все биты в каждом байте, суммируя с переменной
d
.d
инициализируется до -2, потому чтоh
содержит завершающий символ новой строки из ввода (стоит 2 бита), и мы не хотим это считать.Точно так же
h
будет содержатьсяtest
с завершающей новой строкой, поэтому новая строка должна быть включена в значение сравнения.источник
R 279
Довольно понятно.
тесты:
источник
C, 378 следов, 98 байт
Другое решение C:
Это работает так, что s обычно инициализируется в 0, но становится -17, если аргумент командной строки равен «test» (strcmp возвращает 0 в одинаковых строках и ненулевое значение в разных строках, поэтому инвертирование дает 1, если строка это "тест"). Число -17 было выбрано, чтобы компенсировать след 17, который будет рассчитан для «теста». Вычисление занимаемой площади легко с побитовыми операторами.
Щелчок! Первоначально я пропустил «кратчайшие выигрыши», поэтому я стремился к самому короткому коду ... Я посмотрю, смогу ли я уменьшить «след».
источник
Ява, 594
Ява не очень зеленая.
Безголовая версия:
D
объявлен какInteger
так, чтобы мы могли получить доступInteger
к статическомуbitCount
методу экологически сознательным образом.bitCount
Метод рассматриваетchar
S как целые числа и возвращает число установленных бит.источник