Перевернуть и инвертировать строку


27

Перевернуть и инвертировать строку

Вызов

В этом вызове. Вы будете писать программу, которая будет выводить или возвращать ввод, обращенный и инвертированный.

Во-первых, каждый символ должен быть преобразован в его код символа. Затем это должно быть преобразовано в базу-2. После этого эта строка должна быть обратной. После этого строка должна быть инвертирована (1 -> 0 и 0 -> 1). Наконец, это должно быть преобразовано обратно в базу 2, а затем преобразовано обратно в символ. Если персонаж окажется непечатным, вы можете при желании вывести его, но его не нужно удалять.

H -> 72  -> 1001000 -> 0001001 -> 1110110 -> 118 -> v
e -> 101 -> 1100101 -> 1010011 -> 0101100 -> 44  -> ,
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
o -> 111 -> 1101111 -> 1111011 -> 0000100 -> 4   -> (unprintable)
, -> 44  -> 101100  -> 001101  -> 110010  -> 50  -> 2
  -> 32  -> 100000  -> 000001  -> 111110  -> 62  -> >
W -> 87  -> 1010111 -> 1110101 -> 0001010 -> 10  -> (newline)
o -> 111 -> 1101111 -> 1111011 -> 0000100 -> 4   -> (unprintable)
r -> 114 -> 1110010 -> 0100111 -> 1011000 -> 88  -> X
l -> 108 -> 1101100 -> 0011011 -> 1100100 -> 100 -> d
d -> 100 -> 1100100 -> 0010011 -> 1101100 -> 108 -> l
! -> 33  -> 100001  -> 100001  -> 011110  -> 30  -> (unprintable)

счет

Самый короткий код в байтах побеждает.

Бонус -15%: если ваша программа удаляет непечатаемые с вывода. Это должно быть как минимум все символы ниже 32, кроме новых строк (символ 10)


Мне нужно, чтобы мой переводчик Simplex снова работал XDGBktnkZs
Конор О'Брайен,

То есть символы в строке не меняются местами, но биты в каждом символе равны?
xnor

Просто чтобы быть уверенным: для 0010000 бит обратный 0000100 или 00001?
Цифровая травма

@DigitalTrauma Если бинарный код есть 0010000, его следует рассматривать как 10000обратное00001
Downgoat

2
Можем ли мы принять только ASCII (как ваши примеры), или это должно работать для любого символа в моем языке? (Кроме того, если язык использует другой код символа, я должен использовать это вместо ASCII / Unicode)?
Пауло Эберманн

Ответы:


4

CJam, 14

q{i2bW%:!2bc}%

Попробуйте онлайн

Объяснение:

Довольно просто:

q       read input
{…}%    convert each character
  i     convert to number
  2b    convert to base 2 (digit array)
  W%    reverse
  :!    invert each digit
  2b    convert from base 2
  c     convert to character

«Версия для печати», 20 - 15% = 17

q{i2bW%:!2bc' ,N--}%

Дангит, ты. Я как раз собирался опубликовать ответ CJam D:
anOKsquirrel

@anOKsquirrel извините ^^ это было похоже?
aditsu

Это было бы, если бы я закончил.
anOKsquirrel

Как работает W%? W = -1, так что ...
anOKsquirrel

1
@anOKsquirrel смотрите документацию здесь
aditsu

9

Pyth, 14 байт

smCi!M_jCd2 2z

Попробуйте онлайн.

Как это работает

 m           z  Map over the input with lambda d:
        Cd        Cast d to character.
       j  2       Convert to base 2.
      _           Reverse the resulting array.
    !M            Mapped logical NOT.
   i        2     Convert back to integer.
  C               Cast to character.
s               Concatenate the resulting characters.

2
Альтернативные решения (все 14 байтов):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Деннис

Как насчет версии, которая удаляет непечатные, просто из интереса / для сравнения? Вероятно, как отдельный ответ.
Hyde

8

Perl, 57 51 символов

(50 символов кода + 1 символ командной строки.)

s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee

Образец прогона:

bash-4.3$ perl -pe 's/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee' <<< 'Hello, World!'
v,dd2>
Xdl

bash-4.3$ perl -pe 's/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee' <<< 'Hello, World!' | od -tad1
0000000    v    ,    d    d  eot    2    >   nl  eot    X    d    l   rs   nl
         118   44  100  100    4   50   62   10    4   88  100  108   30   10
0000016

1
51 байт: -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&короче sprintf'%b',ord$&, и дополнительно декодирует в обратном порядке. К сожалению, он также выдает конечные 0, которые необходимо удалить.
Примо

Спасибо @Primo. unpackдля меня все еще неизведанная местность.
manatwork

42 байт: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Инвертировать персонажа, не нужно транслитерировать;)
прим

7

JavaScript ( ES6 ES7), 119 114 108 байт

Это оказалось намного дольше, чем ожидалось :(

Спасибо @vihan за 5 сохраненных байтов! Спасибо @ETHProductions за сохранение еще 6 байтов!

Чтобы проверить:  Запустите фрагмент ниже, введите ввод, как "Hello, World!", и нажмите Test!

x=>String.fromCharCode(...[for(y of x)+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``)])
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>


Я думаю , что вы могли бы сэкономить 4 байта Замена parseIntс , +('0b'+<code>)как описано здесь , и еще один, используя w^1вместо+!+w
Downgoat

2
Я никогда бы не подумал, что это возможно, но я просто проиграл 0,05 байта : x=>String.fromCharCode(...[for(y of x)if((c=+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``)) >31||c==10)c])(127 - 15% = 107,95) Возможно, это не законно; это только обрабатывает 10 == \n, не 13 == \r. @ Vɪʜᴀɴ что ты думаешь?
ETHproductions

1
Я получаю, Unexpected token '>'когда пытаюсь запустить фрагмент.
Пол Р

1
@ETHproductions: спасибо - у меня есть только Safari и Chrome, и я думаю, что ни один из них не является "ES6-совместимым".
Пол Р

1
@PaulR ES6, или ECMAScript 6, является одним из последних наборов новых функций для JavaScript. Смотрите этот сайт для получения дополнительной информации. Также есть таблица совместимости, которая показывает, какие функции поддерживаются какими браузерами (и другими программами). Этот ответ, в частности, требует «функций стрелок», «оператора распространения» и «понимания массивов» в ES7.
ETHproductions

5

JavaScript (ES7), 126 байт - 15% = 107,1

Я играл с этим ответом, чтобы посмотреть, стоил ли бонус. Видимо, так и есть. Набор тестов был украден из того же ответа, но я добавил свой собственный поворот: полная поддержка 15% бонуса! :)

x=>String.fromCharCode(...[for(y of x)if((c=+('0b'+[...y.charCodeAt().toString(2)].reverse().map(z=>z^1).join``))>31|c==10)c])
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><strong id="score" style="display:inline; font-size:32px; font-family:Helvetica">Score:</strong><strong id="scorediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px">"Hello, World!"</textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var score=document.getElementById("score");var scorediff=document.getElementById("scorediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function getScore(s){var a=1;try{b=eval('('+s+')("Hello, World!")');if(b=="v,dd2>\nXdl")a=.85}catch(e){};return getByteCount(s)*a}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}newLength=getScore(getNewCode());var oldLength=getScore(getOriginalCode());score.innerHTML="Score: "+newLength;var diff=Math.round((newLength-oldLength)*100)/100;if(diff>0){scorediff.innerHTML="(+"+diff+")";scorediff.style.color="lightcoral"}else if(diff<0){scorediff.innerHTML="("+diff+")";scorediff.style.color="lightgreen"}else{scorediff.innerHTML="("+diff+")";scorediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>


Отличная модификация тестового фрагмента! Кажется, фрагмент теперь автоматически проверяет бонус, могу я спросить, как ты это сделал? (ps если вы хотите исходный (не в одной строке) источник, не стесняйтесь спрашивать, может быть проще изменить таким образом)
jrich

@ UndefinedFunction Ой, простите, что не ответил сразу! Я добавил getScore()функцию, которая проверяет контрольный пример Hello, World!на соответствие (он удобно содержит как новую строку, так и непечатаемые символы) и возвращает результат, умноженный на 0,85 или 1, в зависимости от результата. И да, доступ к не минимизированному фрагменту был бы отличным. :)
ETHproductions

Я сделал оригинальный фрагмент кода доступным здесь . Повеселись!
jrich

4

PHP - 187 182 163 байта

<?php $s=$_GET["s"];$m="array_map";echo join($m("chr",$m("bindec",$m(function($v){return strtr($v,[1,0]);},$m("strrev",$m("decbin",$m("ord",str_split($s))))))));?>

Передайте значение как GET["s"].

array_map возвращает массив со всеми элементами второго параметра (массив) после применения ко всем из них функции обратного вызова (первый параметр).

Не уверен, стоит ли мне снимать 15%, так echoкак не выводит непечатные символы, но я их не удалял.

Просто рад, что я закончил, так как это первый вызов, в котором я принимаю участие.


1
Короче , если вы не объявите эти функции: $m='array_map';echo join($m("chr",$m("bindec",$m(function($v){return strtr($v,[1,0]);},$m("strrev",$m("decbin",$m("ord",str_split($s))))))));.
manatwork

@manatwork полностью забыл об этом. Спасибо.
не определено

Вы не можете просто поместить вход в переменную. Вы должны создать функцию или прочитать ввод STDIN. Кстати, вы не должны использовать кавычки строки ( "chr", "bindec", ...) , так как мы не заботимся о предупреждениях. Это должно сэкономить вам 12 байтов.
Blackhole

@ Blackhole спасибо за информацию, я буду знать об этом в следующий раз.
не определено

Вам лучше внести изменения в этот ответ, который в противном случае недействителен :). Это будет стоить вам почти нет байтов, просто заменить str_split($s)с str_split(fgets(STDIN)), например.
Blackhole

3

К5, 28 байт

`c${b/~|{x@&|\x}@(b:8#2)\x}'

Это немного неудобно, потому что decodeоператор K5 выполняет базовое преобразование с фиксированной шириной, поэтому, чтобы соответствовать формулировке задачи, я должен обрезать ведущие нули. Лямбда {x@&|\x}выполняет этот шаг.

Мазок:

  |\0 0 1 0 1 1 0 1
0 0 1 1 1 1 1 1

Собирают:

  &|\0 0 1 0 1 1 0 1
2 3 4 5 6 7

Выбрать:

  {x@&|\x}0 0 1 0 1 1 0 1
1 0 1 1 0 1

Вся программа в действии:

  `c${b/~|{x@&|\x}@(b:8#2)\x}'"Hello, World"
"v,dd2>\nXdl"

Я полагаю, что естественное поведение ОК с непечатными печатями дает право на -15%, что дает оценку 28 * 0,85 = 23,8 .


+1, потому что я пытался, но не смог придумать, как избавиться от ведущих нулей!
kirbyfan64sos

Несколько связанных конструкций можно найти здесь .
JohnE

3

Юлия, 77 байт - 15% = 65,45

s->join(filter(isprint,[Char(parse(Int,join(1-digits(Int(c),2)),2))for c=s]))

Это создает безымянную функцию, которая принимает строку и возвращает строку. Непечатные символы удаляются, что дает право на бонус.

Ungolfed:

function f(s::AbstractString)
    # digits() returns the digits in reverse order, so no explicit
    # reverse() is needed
    x = [Char(parse(Int, join(1 - digits(Int(c), 2)), 2)) for c = s]

    # Remove unprintables, join into a string
    return join(filter(isprint, x))
end

Хотя он, безусловно, дает право на бонус, он также стоит больше, чем экономит бонус. 16 байтов filter(isprint,)и только 11,55 байтов, сохраненных за счет бонуса.
Глен О

И если вы откажетесь от шага фильтра, вы можете избежать понимания и присоединиться, используя карту непосредственно в строке. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(для 56 байтов)
Глен О

@GlenO Спасибо за предложения, но этот подход оставляет в непечатных текстах шестнадцатеричные коды, которые, по словам ОП, недопустимы. Использование filter(isprint,)обоих квалифицирует его как бонус и делает его соответствующим правилам.
Алекс А.

«Если персонаж окажется непечатным, вы можете при желании вывести его, но его не нужно удалять».
Глен О

И если проблема находится на другой стороне (то, что она показывает как \x04и тому подобное), то print()стоит семь, что приведет от 56 до 63.
Глен О

3

PowerShell, 199 175 (171 - 15%) = 145,35

param([char[]]$a)($a|%{$b=[convert]::ToString(+$_,2);$c=[convert]::ToInt32("$((-join$b[$b.Length..0])-split0-replace1,0-join1)",2);if($c-gt31-or$c-eq10){[char]$c}})-join''

Использует несколько неудачных вызовов / встроенных функций .NET, что значительно увеличивает объем кода.

Разъяснение:

Принимает входные данные param(..)и преобразует их как, char[]чтобы мы могли обрабатывать их соответствующим образом.

Следующий бит (..)-join''собирает и объединяет наш вывод вместе.

Внутри этих символов мы повторяем $a|%{..}цикл foreach.

Внутри цикла:

  • Мы создаем новую строку $b, которая является нашей входной буквой, приведенной к типу int +$_и [convert]ed к базе2
  • Этот следующий бит, настройка $c, это сложно, так что давайте начнем внутри и поработаем
  • Перевернуть строку $bс(-join$b[$b.length..0])
  • Мы использовали мой предыдущий код для инвертирования двоичной строки и преобразовали результат в строку с"$(..)"
  • Мы кормим эту строку в другой .NET вызов, [convert]S ToInt32от основания 2, который , наконец , хранящийся , что в$c
  • Если $cоно больше 31или равно 10, мы приводим его как символ, и это значение остается в конвейере для вывода (что и собирается, и собирается -join''вместе, выше), иначе ничего не останется на этой конкретной итерации

Уф.

Также имеет право на бонус -15%.

пример

PS C:\Tools\Scripts\golfing> .\reverse-and-invert-a-string.ps1 "Hello, World!"
v,dd2>
Xdl




1

MATLAB, 60 байтов

@(y)[arrayfun(@(x)bin2dec([97-fliplr(dec2bin(x)) '']),y) '']

В основном каждый символ по очереди конвертируется в двоичную строку (без начальных нулей). Массив переворачивается и вычитается из 97 ('0' + '1'), который инвертирует символ. Это преобразуется обратно в десятичную. После того, как все символы были обработаны, весь массив преобразуется обратно в символы, а затем возвращается.


1

Питон 3, 95 91

Простая реализация.

print(''.join(chr(int(''.join('10'[j>'0']for j in bin(ord(i))[:1:-1]),2))for i in input()))

Ungolfed:

inp = input()
ints = (ord(i) for i in inp)
bins = (bin(i) for i in ints)
revs = (i[2:][::-1] for i in bins) #without leading '0b'
invs = (''.join('0' if j == '1' else '1' for j in i) for i in revs)
newInts = (int(i, 2) for i in invs)
newChars = (chr(i) for i in newInts)
newStr = ''.join(newChars)
print(newStr)

1

Рубин, 62 персонажа

gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}

Samply run:

bash-4.3$ ruby -e 'gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}' <<< 'Hello, World!'
v,dd2>
Xdl

bash-4.3$ ruby -e 'gets.bytes{|b|$><<b.to_s(2).reverse.tr("01","10").to_i(2).chr}' <<< 'Hello, World!' | od -tad1
0000000    v    ,    d    d  eot    2    >   nl  eot    X    d    l   rs   nl
         118   44  100  100    4   50   62   10    4   88  100  108   30   10
0000016

1

C #, 156 байт - 15% = 132,6

class P{static void Main(string[]a){try{for(int i=0,b,c;;){for(b=a[0][i++],c=0;b>0;b/=2)c=c<<1|1-b%2;if(c==10|c>31)System.Console.Write((char)c);}}catch{}}}

Отступы и новые строки для ясности:

class P{
    static void Main(string[]a){
        try{
            for(int i=0,b,c;;){
                for(b=a[0][i++],c=0;b>0;b/=2)
                    c=c<<1|1-b%2;
                if(c==10|c>31)
                    System.Console.Write((char)c);
            }
        }
        catch{}
    }
}

1

Javascript 123 байта

s=>[].map.call(s,s=>String.fromCharCode("0b"+s.charCodeAt().toString(2).split('').reverse().map(s=>s^1).join(''))).join('')

1

Сетчатка , 1107 629 байт - 15% = 534,65 (не конкурирует)

Использует функции, добавленные после даты вызова. (Неявное поведение $*, , Сортировка)

Retina не имеет встроенной функции для преобразования персонажа в порядковый номер ASCII или обратно ... так что вот его блестящая длина. Это обрабатывает ASCII для печати и удаляет непечатные и новые строки. Количество байтов предполагает кодировку ISO 8859-1.

Код содержит непечатаемые символы.


¶
±
S_`
%(S`±
{2`
$`
}T01`-`_o
)Ms`.
\d+
$*
+`(1+)\1
${1}0
01
1
%O$^`.

T`01`10
1
01
+`10
011
0

m`^1{1,31}$

M%`1
m`^0¶?

126
~
125
}
124
|
123
{
122
z
121
y
120
x
119
w
118
v
117
u
116
t
115
s
114
r
113
q
112
p
111
o
110
n
109
m
108
l
107
k
106
j
105
i
104
h
103
g
102
f
101
e
100
d
99
c
98
b
97
a
96
`
95
_
94
^
93
]
92
\
91
[
90
Z
89
Y
88
X
87
W
86
V
85
U
84
T
83
S
82
R
81
Q
80
P
79
O
78
N
77
M
76
L
75
K
74
J
73
I
72
H
71
G
70
F
69
E
68
D
67
C
66
B
65
A
64
@
63
?
62
>
61
=
60
<
59
;
58
:
57
9
56
8
55
7
54
6
32

33
!
34
"
35
#
36
$
37
%
38
&
39
'
40
(
41
)
42
*
43
+
44
,
45
-
46
.
47
/
48
0
49
1
50
2
51
3
52
4
53
5
¶

Попробуйте онлайн

Если вы ознакомитесь с руководством Retina по унарной арифметике , вы узнаете несколько разных частей моего кода как исходящие оттуда.

Спасибо Мартину за то, что он сыграл в гольф сто байтов


1

Ява, 205 - 15% = 174,2

interface F{static void main(String[]a){for(int i=0,c,s;i<a[0].length();++i){c=a[0].charAt(i);s=Integer.numberOfLeadingZeros(c);c=~(Integer.reverse(c)>>s)&-1>>>s;if(c==10|c>31)System.out.print((char)c);}}}

Ungolfed:

interface F {
    static void main(String[] a) {
        for (int i = 0, c, s; i < a[0].length(); ++i) {
            c = a[0].charAt(i);
            s = Integer.numberOfLeadingZeros(c);
            c = ~(Integer.reverse(c) >> s) & -1 >>> s;
            if (c == 10 | c > 31) System.out.print((char)c);
        }
    }
}

Я думаю , что это решение немного интересный в использовании Integerметодов Integer.reverseи Integer.numberOfLeadingZerosкоторые делают то , что они звучат , как и сдвиг , -1 >>> sгде sэто число ведущих нулей, чтобы получить маску , чтобы замаскировать старшие биты , которые мы не хотим. Я просто сожалею, что название последнего метода чертовски многословно, но это то, что я получаю за игру в гольф на Java.

Выход:

v,dd2>
Xdl

1

Japt, 25 байт

Хотите создать JavaScript-программу для гольфа, но самый короткий метод включает множество длинных имен функций? Для этого и был сделан Джапт. :)

UmX=>Xc s2 w mY=>Y^1 n2 d

Попробуйте это в онлайн-переводчике !

Как это работает

         // Implicit: U = first item in input
UmX=>    // for each character X in U:
Xc s2 w  //  take the char-code of X, convert to binary, and reverse
mY=>     //  for each character Y in this:
Y^1      //   take Y XOR 1 (converts 1 to 0 and 0 to 1)
n2 d     //  convert the result back to decimal, then to a character
         // Implicit: output last expression

Используя текущую версию Japt (начиная с версии 1.4.4), количество байтов может быть сокращено до 14:

®c ¤w m^1 n2 d

Проверьте это онлайн!


0

Haskell, 167 байт

import Data.Char
import Numeric
r '0'='1'
r '1'='0'
s=map (chr.fst.head.(readInt 2 (`elem` "01") digitToInt).(map r).reverse.flip (showIntAtBase 2 intToDigit . ord)"")

К сожалению, Haskell становится довольно многословным, когда ему нужно читать / печатать в другой базе ...


0

Perl 6, 66 байт

Прибегая к цели, удалив непечатные управляющие символы, я получаю (83 + 1) -15% = 71,4

perl6 -ne 'print grep /<-:C+[\n]>/,.ords».base(2)».flip.map({chr :2([~] $_.comb.map(+!+*))})'

Если я удаляю код, который удаляет управляющие символы, я сохраняю совсем немного 65 + 1 = 66

perl6 -ne 'print .ords».base(2)».flip.map({chr :2([~] $_.comb.map(+!+*))})'

(Я использовал для наглядности »вместо >>)



0

Ракетка 250 Бонус 15% = 212 байт

(λ(s)(list->string(map integer->char(filter(λ(x)(or(> x 31)(= x 10)))(for/list((i(string->list s)))(string->number(string-append
"#b"(list->string(map(λ(i)(if(equal? #\0 i)#\1 #\0))(reverse(string->list(number->string(char->integer i)2))))))))))))

Ungolfed:

(define (f s)
    (list->string 
     (map 
      integer->char
      (filter
       (λ(x)(or(> x 31)(= x 10)))

       (for/list ((i (string->list s)))
         (string->number
          (string-append
           "#b"
           (list->string
            (map
             (λ(i)(if(equal? #\0 i) #\1 #\0))
             (reverse
              (string->list
               (number->string
                (char->integer i) 2)
               )))))))))))

Тестирование:

(f "Hello, World!")

Выход:

"v,dd2>\nXdl"

0

PHP, 80 байт

while(a&$c=$argn[$i++])echo chr(bindec(strtr(strrev(decbin(ord($c))),10,"01")));

принимает данные от STDIN; беги с -R.

бонусная версия, 97 110 байт -> 93,5 балла

while(a&$c=$argn[$i++])ctype_print($c=chr(bindec(strtr(strrev(decbin(ord($c))),10,"01"))))||"
"==$c?print$c:0;

печатает ASCII 10 и 32–126 (перевод строки и печатные формы)


пробой, TiO и, если возможно, последует игра в гольф; Я устала прямо сейчас.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.