Возьмите строку, s
содержащую печатные символы ASCII в качестве входных данных, и выведите ее «двоичную сумму деления». Нужно объяснение?
Как вы получаете двоичную сумму?
Мы будем использовать строку A4
в качестве примера в следующем объяснении.
Преобразуйте символы в двоичные, обрабатывая каждую букву как 7-битный символ ASCII
A -> ASCII 65 -> 1000001 4 -> ASCII 52 -> 0110100
Объединить двоичные числа в новое двоичное число
A4 -> 1000001 & 0110100 -> 10000010110100
Разбейте новое двоичное число на куски, где ни один не
1
может иметь0
слева от себя. Вы не должны разделять последовательные1
строки.10000010110100 -> 100000, 10, 110, 100
Преобразовать эти двоичные числа в десятичные
100000, 10, 110, 100 -> 32, 2, 6, 4
Возьмите сумму этих чисел:
32 + 2 + 6 + 4 = 44
Итак, вывод для строки A4
должен быть 44
.
Тестовые случаи:
a
49
A4
44
codegolf
570
Hello, World!
795
code-golf
string
base-conversion
binary
Стьюи Гриффин
источник
источник
8372
вообще-то.Ответы:
Python 2 ,
868176 байт-5 байт, спасибо Аднан
-5 байт, спасибо xnor
Попробуйте онлайн!
for c in input():s=s*128+ord(c)
выполнить числовое преобразование ASCII, где*128
используется сдвиг влевоs
7 раз (шаги 1 и 2)eval(('0'+new_bin).replace('01','0+0b1'))
для разделения и суммирования (шаги 3, 4 и 5)источник
eval
! Выполнение преобразования ASCII численно экономит несколько байтов.Желе , 13 байт
Попробуйте онлайн!
Как это работает
источник
MATL , 14 байтов
Попробуйте онлайн!
объяснение
Рассмотрим ввод
'A4'
в качестве примера.источник
05AB1E , 18 байт
Код:
Объяснение:
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
05AB1E , 14 байтов
Порт моего Jelly ответа , используя смещение 128 от ответа Adnan 05ab1e (а не 256 в ответе Jelly, который я написал).
Попробуйте онлайн!
Как?
источник
JavaScript (ES6),
9792 байтаИзменить: 5 байтов с некоторой помощью @ ConorO'Brien.
источник
s=>eval([...s].map(e=>(e.charCodeAt()+128).toString(2).slice(1)).join``.replace(/1+0*/g,'+0b$&'))
я думаю, вы можете использовать мой метод замены для сохранения байтаJapt ,
1812 байтПринимает ввод в виде одной строки.
Я также опробовал сложение 128 или 256, используемое в других ответах, но заполнение нулями было короче.
Благодаря ETHproductions и Оливеру удалось избавиться от целых 6 байт .
Попробуйте это здесь.
источник
òÈ<YÃ
может бытьò<
(с завершающим пробелом) иËn2Ãx
может бытьxn2
. Вы также можете использоватьT
вместо,0
чтобы сэкономить на запятой. (Кроме того, не стесняйтесь присоединиться к нам в чате Japt, если у вас когда-нибудь возникнут вопросы или вы захотите помочь с игрой в гольф :-))T
трюк, не знал, что вы можете (ab) использовать переменные для этого, это очень удобно. Авто-функцияxn2
выглядит немного странно при компиляции,x("n", 2)
поэтому я думаю, что пройдет еще немного времени, прежде чем я полностью пойму логику, стоящую за ними. С вашей помощью решение Japt теперь связано с ответом Jelly на первое место .n2
:Í
. Он еще не попал в TIO, но вы можете использовать его здесь: ethproductions.github.io/japt/?v=1.4.5&code=Y1+k+VQ3w/…Желе ,
1615 байт-1 байт благодаря Деннису (нет необходимости выравнивать на 1, когда полное выравнивание в порядке - заменить
;/
наF
)Попробуйте онлайн!
Как?
источник
;/
можно заменить наF
.PHP, 116 байт
Онлайн версия
PHP, 117 байт
Попробуйте онлайн!
PHP, 120 байт
Попробуйте онлайн!
или
источник
Pyth , 21 байт
Слишком длинное...
Тестирование.
источник
[F #],
249245 байтПопробуйте онлайн!
Примечание: версия в tio.run имеет «открытую систему» в заголовке, я добавил ее количество в код выше. Я не уверен, каковы правила импорта.
Ungolfed
источник
open System
это то же самое, что и C #,using System;
то да, вам нужно включить его в счетчик. Если вы можете сделать это в F #, вы можете полностью квалифицироваться, для чегоSystem
он предназначен. Например, в C #System.Console...
вместоusing System;Console...
Perl 6 , 62 байта
источник
.ords
вместо.comb».ord
. Префикс[~]
часто может использоваться вместо.join
.comb
существует, что делаетm:g/…
вещь./11*0*/
можно сократить до/1+0*/
. Я придумал{sum map {:2($_)},comb /1+0*/,[~] .ords».fmt('%07b')}
J , 34 байта
Попробуйте онлайн!
объяснение
источник
Mathematica 193 байта
источник
f=FromDigits;l=Flatten;
в начале, а затем заменив все экземпляры этих двух функций наf
иl
.J , 40 байт
использование:
возвращает 44
источник
Clojure, 150 байт
Ну, я надеялся, что преобразование из ASCII в байты было короче, чем это. Фактическое тело цикла довольно короткое, используется
r
для накопления текущего результата иR
накопления общего результата. Если предыдущий битp
равен0
текущему битуc
,1
то мы разделяем новый фрагмент и накапливаем егоR
, в противном случае мы обновляемr
и сохраняем,R
как было.источник
Python 123 байта
Обновлено, благодаря Мартину Эндеру.
источник
lambda w:
ее правильного ответа будет достаточно включить символ.lambda w:
.f=
, потому что мы разрешаем безымянные функции (если вы не ссылаетесь на имя функции для рекурсивных вызовов).K (ок) , 31 байт
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Преобразование в значения ASCII, преобразование в 7-разрядный двоичный код, выравнивание, поиск
1
различий и сравнение с исходным списком для поиска различий s. Вырежьте по этим показателям, переведите обратно в десятичную и суммируйте:бонус
Управлял 31-байтовой версией в K4 , но поскольку TIO для нее нет, я публикую свое решение ОК.
источник
APL (Dyalog) , 30 байтов
Попробуйте онлайн!
Как?
⎕UCS⍵
- Unicodify2⊥⍣¯1¨
- закодировать каждый в двоичном¯7↑¨
- и дополняем налево нулями до 7 мест∊
- расплющить1∘+⊆⊢
- разделение самостоятельно увеличилось на один2⊥¨
- декодировать каждый из двоичного+/
- суммаисточник