Создайте программу, которая вычисляет вес Хемминга строки. Победителем является программа с наименьшим весом Хэмминга.
Правила:
- Вес Хэмминга для символа ASCII определяется как общее количество бит, установленных
1
в его двоичном представлении. - Предположим, что кодировка ввода 7-битная ASCII, переданная через любой механизм ввода, нормальный для вашего языка (например, stdin, args и т. Д.)
- Выведите результат в виде числа в стандартный вывод или любой другой механизм вывода по умолчанию / обычный, используемый вашим языком.
- Само собой разумеется, но вы должны иметь возможность реально запустить программу в реальной жизни, чтобы она была правильным решением.
- Победителем является решение, код которого имеет наименьший вес Хэмминга.
Извините, в этом пробеле нет решений !Хорошо, теперь вы можете кодировать в пробелах, я разобрался с правилами :)
Персональные примеры:
char | binary | weight
-----+----------+-------
a | 01100001 | 3
x | 01111000 | 4
? | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7
code-golf
binary
number-theory
многочлен
источник
источник
0x20
/ ASCII 32 в качестве эталона, не будет ли гудениеhello world
10, а не 11?hello world
11? Только 10 символов отличаются от пробела. Кроме того, вес программы Хэмминга, кажется, только его длина, исключая пробелы. Не сильно отличается от нормального кода гольфа.~
ANDo
.Ответы:
J (33)
Один ниже 34!
Сильно вдохновило на этот ответ , но вес Хэмминга одного понизит.
источник
J, вес 34
Использование - поместите строку для измерения в кавычки в конце:
В качестве альтернативы, принимая ввод с клавиатуры (вес 54):
источник
J , 39
Эта функция принимает один аргумент. (Или замените
]
строку напрямую; как отмечает Гарет, это снизит стоимость до 34.)источник
Питон, 189
источник
print(sum(bin(ord(A)).count('1')for A in input()))
, имеет оценку 180.QBasic,
322311286264Вид правильного инструмента для работы, все еще, конечно, отстой.
источник
Унарный 0
Вы все знали, что это будет. Сначала программа BrainFuck:
Я добавил новые строки, чтобы сделать его «читабельным», но его вес Хэмминга составляет 4066. Он работает путем многократного получения отношения / остатков входной строки и суммирования всех остатков. Конечно, если вы запустите его самостоятельно, вы получите: 226 (4066% 256) (технически \ xe2), так что ясно, что он определяет себя победителем.
Теперь мы конвертируем его в унарный и получаем
Мы используем унарную реализацию с символами NULL \ x00 для '0' и boom, вес Хэмминга равен 0.
Дополнительный вопрос : для каких символов ASCII
c
вы можете запустить эту программу в строке, состоящей изN
повторений, и заставить ее вывести этот символ. (Например, строка из 32 пробелов дает пробел). Какие ценностиN
работы (либо бесконечное количество из них будет работать, либо ни один не будет).источник
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
не имеет значения, что вы выбрали в качестве своего унарного символа (если это не EOF).С, вес
322263256Учитывается ли вес Хэмминга для веса Хэмминга?
Используются в основном стандартные техники игры в гольф.
Один цикл вычисляет вес (сдвиг вправо и добавление до нуля) и сканирует строку (продвигает указатель при достижении нуля).
Предполагается,
D
что инициализируется до 2 (один параметр).Оптимизация по весу Хэмминга:
1.
ABDH
, с весом 2 каждый, используется для имен.2.
*++H
предпочтительнееH[1]
.источник
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
@
была ли цифра в унарной системе. Я думал , что он использует только0
..0
. Но если вы хотите пойти этим, кстати,printf("@"+*a%2)
короче.Golfscript
847258(спасибо Говарду и Питеру Тейлору за помощь)
Входные данные: входная строка должна находиться в стеке (передаваться в качестве аргумента командной строки или просто помещаться в стек).
В случае, если вы запустите его из командной строки, убедитесь, что вы используете
echo -n
, в противном случае также будет учитываться завершающий символ новой строки.Вывод: выводит значение веса Хэмминга на консоль
Программу можно протестировать здесь .
источник
BASE
вместоbase
. Обновление: только что проверил,BASE
не работает. Хорошее решение :)TEST
/test
комментария :) Но это не работает.{...}2*
, обратившись2base~
в первую очередь. Получает счет до 72.;
перед строкой, которую вы заменяете на stdin, так что в(;
этом нет необходимости. Затем наблюдение Говарда сводит его к 65.Perl, 80 (22 символа)
Сделано и сделано:
Или вот альтернативный вариант с весом 77 (21 символ):
Однако мне не очень нравится эта версия, потому что ее вывод опускает последний перевод строки.
Чтобы рассчитать вес, я предполагаю, что я считаю символы обычным способом (исключая
perl -e
/-E
, но включая другие символы опции). Если по какой-то причине люди жалуются на это, то лучшее, что я могу сделать без вариантов, это 90 (26 символов):Пример использования:
Boom.
источник
Пиф - 15
Отказ от ответственности: Этот ответ не имеет права на победу, так как Пайт моложе, чем этот вызов.
Используется
.B
для двоичного представления и подсчитывает количество"1"
символов.Принимает ввод в строке для сохранения по
z
сравнению сQ
.Попробуйте это онлайн здесь .
источник
Скала 231
Самотестируемый код:
с самотестирующейся модификацией.
источник
@
пробела, который вы не используете) имеют вес как минимум 2.Ява, вес
931774499454Я думаю, что это единственный ответ на данный момент с весом более 300.
Ожидается ввод в качестве аргумента командной строки.
источник
GNU
sed -r
, 467 + 1(+1 для использования
-r
- или это должно быть +4?)Выходы в виде одинарного значения на строку источника; для преобразования в десятичную сумму, перенаправить вывод в
| tr -d "\n" | wc -c
. Считает все печатные символы ASCII (32-126), а также перевод строки (10).Трудно избежать перечисления всех символов, но мы можем уменьшить это, наблюдая, что строчные буквы имеют вес Хэмминга на единицу больше, чем соответствующие заглавные буквы. Мы предпочитаем новую строку (оценка 2) над точкой с запятой (оценка 5) в качестве разделителя операторов; мы предпочитаем
@
(оценка 1) или!
(оценка 2) над/
(оценка 5) в качестве разделителя шаблонов.Примечание - чтобы получить правильные наборы символов, я создал эту таблицу из таблицы
man ascii
, отсортированной по весу. Просто добавьте баллы справа и снизу, чтобы получить общий вес каждого персонажа:Это может оказаться полезным для других.
источник
Юлия 262
268Модифицированная версия использует удобную функцию count_ones для сохранения 6 (262)
Старая версия без встроенной функции однократного подсчета (268)
Использует аргумент командной строки для ввода.
источник
CJam 52 или 48
Если вход еще не в стеке (52)
Если вход находится в стеке (48)
Например
источник
Юлия, HW 199
С
или непосредственно вставив строку:
Версия без присмотра (HW 411) выглядит следующим образом:
И для удовольствия вот оптимизированная версия (вес Хэмминга 231 ) о том, как Бакерг решает эту проблему:
с
источник
HPPPL (HP Prime Programming Language), 74
Графический калькулятор HP Prime имеет встроенную функцию hamdist (). Вес Хэмминга каждого персонажа равен расстоянию Хэмминга от 0.
ASC (строка) создает массив значений ASCII каждого символа в строке.
Hamdist (значение, 0) вычисляет расстояние Хемминга от 0 для каждого значения ASCII
sum () суммирует все значения.
Вычисление веса Хэмминга из собственного исходного кода:
источник
05AB1E , вес 17 (4 байта )
Попробуйте онлайн или проверьте еще несколько тестов .
Объяснение:
источник
Perl 6 , 102
Попробуйте онлайн!
Хотя это не кодекс гольф, самое короткое решение также имеет наименьший вес Хэмминга ...
источник