Похоже на невыполнимую задачу, верно? Ну, на самом деле это не так сложно. Если мы напишем слово Infinity
как 8-битный двоичный код ASCII, мы получим:
01001001 01101110 01100110 01101001 01101110 01101001 01110100 01111001
Это можно объединить и преобразовать в десятичное значение 5291279215216915577
. Теперь с этим номером мы можем работать ...
Способ обратного отсчета:
- Выведите исходную строку в виде десятичного числа (как показано выше)
- Удалить начальные 0 в двоичном представлении (если есть)
- Переключить биты в двоичном представлении (1-> 0, 0-> 1)
- Выведите число в десятичном виде
- Повторите шаги 2-4, пока не достигнете 0.
Вызов:
Создайте программу или функцию, которая принимает строку в качестве входных данных и выводит (в любом подходящем формате) числа, которые вы получите при выполнении описанной выше процедуры.
Прецедент:
Я думаю, что задачу будет довольно легко понять, хотя это всего лишь один контрольный пример. Я буду использовать Inf
вместо того, Infinity
чтобы держать это довольно коротким.
Inf
4812390 (10010010110111001100110)
3576217 ( 1101101001000110011001)
618086 ( 10010110111001100110)
430489 ( 1101001000110011001)
93798 ( 10110111001100110)
37273 ( 1001000110011001)
28262 ( 110111001100110)
4505 ( 1000110011001)
3686 ( 111001100110)
409 ( 110011001)
102 ( 1100110)
25 ( 11001)
6 ( 110)
1 ( 1)
0 ( 0)
Input: Inf
Output:
4812390, 3576217, 618086, 430489, 93798, 37273, 28262, 4505, 3686, 409, 102, 25, 6, 1, 0
Input: Infinity
Output:
5291279215216915577, 3932092821637860230, 679593196789527673, 473328307817319302, 103132444486104185, 40982743589751686, 31074850448176249, 4953946570787718, 4053252683953273, 450346943417222, 112603010004089, 28134478351238, 7049893737593, 1746199284614, 452823970937, 96931842950, 40507110521, 28212366214, 6147372153, 2442562438, 1852404857, 295078790, 241792121, 26643334, 6911097, 1477510, 619641, 428934, 95353, 35718, 29817, 2950, 1145, 902, 121, 6, 1, 0
Ваш код должен поддерживать строки, которые могут быть представлены в виде двоичного числа вплоть до ограничения вашего языка. Все строки будут содержать только печатаемые символы ASCII от 32 до 126 (от пробела до тильды).
Leaderboard
var QUESTION_ID=98274,OVERRIDE_USER=31516;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Inf:-1:0
∞..0
Ответы:
Желе ,
1510 байт-5 байт благодаря @Dennis (конвертируется напрямую из базы 256 после обычного приведения)
TryItOnline!
Как?
источник
Oḅ⁹
.Python 2,
8982777675 байтПроверьте это на Ideone .
Как это устроено
После инициализации от n до 0 вторая строка выполняет преобразование строки в целое число, указанное в запросах следующим образом.
На каждом шаге n сдвигается на 8 единиц влево, а затем по битам ИЛИ с кодовой точкой следующего символа c . Для ввода Inf это происходит следующим образом.
Теперь мы готовы генерировать вывод. Чтобы инвертировать биты n , мы поступим следующим образом.
Сначала мы вычисляем биты в двоичном представлении n без начальных нулей. Давайте назовем результат k . Затем мы вычисляем k k степень 2 , которая имеет k + 1 двоичных цифр: один 1 , за которым следуют k 0 . Мы вычитаем 1 из результата, получая число, состоящее из k единиц, которое затем XOR с n, чтобы инвертировать его биты. Для ввода inf это происходит следующим образом.
Дополнительным препятствием в реализации является то, что мы должны напечатать n перед первым шагом, после последнего шага и на всех промежуточных этапах. В Python нет циклов do-while, и один оператор print стоит 8 байт, поэтому вместо этого мы делаем следующее.
В простой реализации этапа обновления, т. Е.
мы заменим цикл на бесконечный (
while 1
) и вычислим1
цикл какn/n
. Это эквивалентно, пока n> 0 .Как только n = 0 , мы остаемся в цикле, печатаем состояние еще раз, затем пытаемся его обновить. Тем не менее,
0/0
запускает ZeroDivisionError , выход из цикла и выход с ошибкой. Обратите внимание, что это приводит к случайному выводу в STDERR, что разрешено по умолчанию .источник
-n/n
трюк :-)n/n
трюк? Возможно, это было объяснено в другом ответе где-то, но я не нашел его. Что это здесь делает?JavaScript, 82 байта
Сохраненный байт благодаря @Arnuald
Один из очень немногих случаев, когда полная программа превосходит функцию (а ES6 не превосходит ES5) ...
Выше поддерживается до 4-х буквенных слов. Добавьте 4 байта для поддержки до 6 букв:
источник
g=a=>a[0]?a.pop().charCodeAt()+g(a)*256:0
(-1)n<<8|y.charCodeAt()
должен сохранить байт.for(;n;)for(i=!alert(n);i<=n;i*=2)n^=i
сохранит еще один байт, но вы не отобразите0
, что, вероятно, требуется.n<<8
раньше, но решил, что это не сработает, потому что оно сломается для n с более чем 31 битом Полагаю, теперь это не имеет значения, поскольку я уже разделил его между 31-разрядной и 53-разрядной версиями ... И, к сожалению, я не думаю, что смогу что-либо сохранить в предупреждении, предупреждая обе первые итерация и последняя.На самом деле , 14 байтов
Попробуйте онлайн!
Объяснение:
источник
05AB1E , 18 байт
Использует кодировку CP-1252 .
Попробуйте онлайн!
объяснение
источник
MATL , 13 байт
Попробуйте онлайн!
объяснение
источник
Mathematica, 99 байтов
Анонимная функция. Принимает строку в качестве входных данных и возвращает список чисел в качестве выходных данных.
источник
Haskell,
10912311810297 байтСпасибо @nimi за сохранение 5 байтов!
Использование:
(++[0]).fst.span(>0).iterate c.foldl((+).(256*))0.map fromEnum $ "Infinity"
Гарантируется, что язык работает с числами до 29 бит, обычно работает с 64-битными числами в 64-битных системах.
map(fromIntegral.fromEnum)
Вместо этого используйте (+14 байт) для поддержки произвольно больших чисел.Работает для диапазона Юникод
[0..255]
. Рекурсивно переворачивает биты.источник
takeWhile(>0)
наfst.span(>0)
. Если вы идете без очков, вы можете отказаться от имениf
, поэтому ваша основная функция(++[0]) ... map fromEnum
.f
.fromIntegral
? Из задачи: «должен поддерживать ... до 63 бит ... или предел вашего языка», так чтоInt
должно быть хорошо. Если вы хотите сохранить его, переместите его вmap
, т. Е. Свою старую версиюfoldl1
иmap(fromIntegral.fromEnum)
.PHP,
132126123120108107 байтunpack
аstr_split
делаетord()
устаревшими -> -3 байтов_
как разделитель сохраняет 3.bindec
вместо того,ltrim
чтобы удалить ведущие нули: -12echo
в теле цикла экономит 1 байтprint
в заголовке цикла.источник
$n=$n*256+$i;for(print$n;$n;)
быть написано какfor(print$n=$n*256+$i;$n;)
? Поскольку часть задания будет выполнена один раз, это должно сработать. И вместоecho _.$n=[...]
, вы должны использоватьecho _,$n=[...]
вместо. Он не сохранит ни одного байта, но ускорит код крошечным крошечным крошечным кусочком и разделит операторы. Это означает, что, например,echo _,$a?5:6;
можно написать вместоecho _.($a?5:6);
. Это может быть полезно в будущем.print
в этом случае. Один не стоит редактировать; но спасибо.foreach(unpack("C*",$argv[1])as$i)
... Глупая я ... И да, изменение точки с запятой для того же эффекта не стоит проблем.Perl, 65 байт
Код 53 байта + 12 для
-Mbigint -p
.Спасибо @ Dada за спасение мне 13 байтов!
Довольно простой подход, отличающийся только от большинства из них, заключается в том, что число сохраняется в двоичном виде и распечатывается в десятичном виде. Я уверен, что это может быть улучшено, возможно, с сохранением деталей в массиве.
-Mbigint
немного неудобно, но необходимо.использование
источник
perl -Mbigint -lpE'$_=unpack"B*";say(0+"0b$_"),s/^0+//,y/10/01/while$_>0'
(Я понятия не имею, как использовать распаковку обычно, мне просто повезло, когда гуглил, как преобразовать строку в двоичную ;-))unpack
синтаксисе, всегда поражает воображение! Я обновлю, спасибо!echo -n
это единственное другое изменение.Pyth, 12 байт
Программа, которая принимает ввод строки в кавычках и печатает результат в виде списка целых чисел.
Проверьте все контрольные примеры
Как это устроено
источник
Python 3,
9995 байтОсновная идея - преобразовать строку в байты в число. На каждой итерации выводятся выходные данные и XOR со всеми 1, чтобы перейти к нулю.
источник
2**x.bit_length()-1
. Порядок операций по мощности и вычитанию выше, чем xor. Кроме того, этоwhile
может быть в одной строке.P=print
а затем использоватьP()
вместоprint()
Python 2,
117115 байтЭкономия 2 байта благодаря Cyoce.
Предполагается, что ввод заключен в кавычки, например
"Inf"
m
считает до старшего разряда, поэтомуm-1
маска XOR для выполнения желаемой операции. Самая длинная часть - это преобразование ввода в начальную битовую последовательность.Пример:
источник
-i-1
на~i
Рубин,
104101100818065 байт19 байтов сохранено благодаря @WayneConrad!
15 байтов сохранено благодаря @philomory!
1 байт сохранен благодаря @LeeW!
Принимает ввод через аргументы командной строки.
Вдохновленный ответом Python @ JimmyJohnson
источник
i.to_s(2).rjust 8,'0'
на"%08b"%i
inject(:+)
можно заменить наjoin
unpack
последующим[0]
указанием вместо того, чтобы возитьсяgsub
, сэкономит 11 байт. Переключение на$*[0]
вместоgets.chop
(использование аргумента командной строки вместо консольного ввода) сохранит еще 9, первая строка станетp n=$*[0].unpack('B*')[0].to_i(2)
.Лабиринт ,
104103 байтаПопробуйте онлайн!
Объяснение:
Указатель инструкций начинается с верхнего левого наиболее нестеночного символа (стены содержат пробелы и любые буквы, кроме
v
).Оранжевый:
Этот цикл получает вход по одному символу за раз в виде кода ASCII, добавляя его к текущему значению и умножая текущее значение на 256.
'
Нет-оп,
Вставьте код ascii следующего входного символа в верхнюю часть стека или -1, если EOF. В этот момент, если ввод был получен, код повернет направо (двигаясь вниз), потому что вершина стека является положительной. В противном случае он повернет налево, потому что вершина стека отрицательна.|
Извлеките два верхних элемента из стека и вставьте результат побитового ИЛИ._
Толчок ноль256
Каждая увиденная цифра трещитx
и толкаетx*10+digit
. Таким образом, это в сочетании с пуш-ноль предыдущего пуш 256 на вершину стека.*
Попy
, попx
, толчокx*y
. В этот момент, поскольку вершина стека положительна, код повернет вправо, чтобы продолжить цикл.Синий:
)
Увеличьте вершину стека. Когда будет достигнут конец ввода, код повернется влево, чтобы добраться до этой точки с -1 в стеке, который будет увеличиваться до нуля.256
Наличие вершины стека 0 позволяет нам выдвинуть это 256./
Popy
, popx
pushx/y
(целочисленное деление). Поскольку мы умножали входные данные на 256 в каждом цикле, нам нужно вернуть последнее умножение.:
Дублируйте вершину стека, чтобы у нас была копия текущего значения для дальнейшего использования.!
Вставьте вершину стека и выведите целочисленное значение в STDOUT.\
Распечатать новую строку._2
Нажмите два к вершине стека.}
Переместите вершину стека к вершине вспомогательного стека.Красный:
Этот цикл переворачивает биты текущего значения по XOR с определенным значением, вычисленным во внутреннем (зеленом) цикле. Затем он выводит текущее значение и выходит из программы, если текущее значение равно нулю.
_
Нажмите ноль (контроль потока).;
Откажитесь от вершины стека (поток управления).:
Дублируйте текущее значение. Копия будет использована для расчета XOR._
Нажмите ноль (контроль потока).$
Попy
, попx
, толчокx XOR y
.:!
Дублируйте текущее значение и выведите целочисленное представление.@
и заканчиваем.\
Распечатать новую строку._2}
Нажмите 2 и перейдите к вспомогательному стеку._1
Нажмите 1 (контроль потока).Зеленый цвет:
Этот цикл вычисляет значение, на которое нам нужно XOR текущего значения. Это делается путем многократного удвоения вершины вспомогательного стека при одновременном уменьшении вдвое копии текущего значения на остановке основного стека до достижения 0.
_
Нажмите ноль (контроль потока).;
Отменить текущее значение, которое используется только для обеспечения потока управления._2
Нажмите 2, чтобы вдвое сократить текущее значение./
Делить{
Переместите верхнюю часть вспомогательного стека в верхнюю часть основного стека._2*
Двойная вершина стека}
Переместите верхнюю часть основного стека обратно в дополнительный стек._1
Нажмите один для контроля потока.;
Откажитесь от нуля слева от расчета XOR.{
Переместите вычисленный XOR в основной стек.(
Вычтите одно из значения XOR.источник
PowerShell v2 +, 158 байт
Да, так что преобразование баз в PowerShell действительно отстойно . И мы сделаем это дважды здесь.
ОК, так что это просто
for
цикл,$a
т. Е. Мы выполняем цикл , пока$a
существует. В конечном итоге мы достигнем пустой строки (что неверно), и вот как мы закончим.Настройка цикла,
$a=-join([char[]]$args[0]|%{([int][convert]::ToString(+$_,2)).ToString('0'*8)})
принимает входные данные$args[0]
,char
преобразует их как -array и перебирает каждый символ. Мы используем .NET[convert]::ToString(int,base)
для преобразования каждого в двоичную строку. Однако это не включает ведущие нули, поэтому нам нужно повторно привести эту строку в качестве[int]
и вызвать ее.ToString()
метод с8
нулями в качестве маски. Затем эти строки заключаются в скобки и-join
объединяются, а затем сохраняются в$a
.Внутри цикла мы
[convert]::ToInt64(string,base)
должны преобразовать двоичное число в десятичное число. Это остается в конвейере и впоследствии сбрасывается, когда цикл сбрасывается (и, следовательно, неявно печатается). В следующем разделе выполняются вычисления - мы.TrimStart()
удаляем любые начальные нули,-split0
разбиваем на нули и получаемstring
массив-1
s,-replace
те, что с нулями, и, наконец,-join
массив обратно вместе с1
s. Затем цикл начинается снова.источник
CJam ,
171618 байтПопробуйте онлайн!
ПРИМЕЧАНИЕ . Старая 16-байтовая версия некорректно работала с пустыми строками:
Кроме того, спасибо Деннису за предложение,
p
которое экономит 1 байт по сравнению сN\
переносом строк в стек.источник
_p2b:!2b
сохраняет байт. Кроме того, вы должны использоватьl
;r
потерпит неудачу, если вход содержит пробелы.q
будет работать правильно с пустыми строками.J, 24 байта
Объяснение придет позже!
источник
Сетчатка, 116 байт
Число байтов предполагает кодировку ISO 8859-1. Строка 5 содержит непечатаемые байты. Это
T`\x00-\xFF
.Попробуйте онлайн
Не пытайтесь сделать это с вводом длиннее двух символов. (Время ожидания истекает при использовании онлайн-переводчика.) Мы должны преобразовать двоичный код в унарный до десятичного. : D
К сожалению, есть конечный ноль и перевод строки, но я решил предположить, что все в порядке, потому что вывод все еще правильный.
объяснение
источник
Рубин - 70 байт
Программа завершается с исключением после завершения, но, насколько я понимаю, это нормально, если вывод ошибок идет в STDERR, а не в STDOUT (что и происходит).
источник
C,
147135133125122121117115103 байтовСохранено 5 байтов благодаря @Cyoce!
Сохранено 2 байта благодаря @Cyoce и @cleblanc!
Сохранено 12 байтов благодаря @ceilingcat
Ungolfed:
источник
int
декларацииwhile
цикл вfor
циклwhile(1)
наfor(;;)
int
объявления везде и получилgcc -std=89
ошибки. Но спасибо заfor(;;)
совет. Я буду продолжать пытаться удалитьint
объявления :)))i;main(c,v)char**v;{...}
). На мобильном телефоне прямо сейчас, так что я не могу быть уверенC,
129120117110107105 байтПротестировано с
выход
источник
i=0
к объявлениюi
и оставить раздел инициализацииfor
цикла пустымi
вызывается, и, поскольку она является неявным глобальным int, она должна инициализироваться каждый раз, когда вызывается f (...).i
пока снова не станет равной нулю, поэтому она все еще может использоваться повторно.C #,
360359 байтПолная программа:
источник
var t="";var f="";
бытьvar t="",f=""
вместо этого? Сохраняет 5 байтов.