Invertir e invertir una cadena


27

Invertir e invertir una cadena

Reto

En este desafío. Escribirá un programa que generará o devolverá la entrada, invertida e invertida.

Primero, cada carácter debe convertirse a su código de carácter. Entonces, eso debería convertirse a base-2. A continuación, esa cadena debe invertirse. Después, la cadena debe invertirse (1 -> 0 y 0 -> 1). Finalmente, eso debe convertirse de nuevo a la base 2 y luego volver a convertirse en un personaje. Si un carácter resulta ser no imprimible, opcionalmente puede generarlo pero no es necesario eliminarlo.

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)

Tanteo

El código más corto en bytes gana.

-15% de bonificación: si su programa elimina no imprimibles de la salida. Esto debe ser al menos todos los caracteres por debajo de 32, excepto las nuevas líneas (char 10)


Necesito que mi intérprete Simplex vuelva a funcionar XDGBktnkZs
Conor O'Brien

Entonces, ¿los caracteres en la cadena no se invierten, pero los bits en cada carácter sí?
xnor

Solo para estar seguro: ¿para 0010000 es el bit inverso 0000100 o 00001?
Trauma digital el

@DigitalTrauma Si el código binario es 0010000, debe tratarse como 10000tal, lo contrario sería00001
Downgoat

2
¿Podemos asumir solo ASCII (como sus ejemplos), o esto debería funcionar para lo que sea un personaje en mi idioma? (Además, si un idioma usa un código de caracteres diferente, ¿debería usar esto en lugar de ASCII / Unicode)?
Paŭlo Ebermann el

Respuestas:


4

CJam, 14

q{i2bW%:!2bc}%

Pruébalo en línea

Explicación:

Muy claro:

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

Versión "imprimible", 20 - 15% = 17

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

Dangit, tu. Estaba a punto de publicar una respuesta D de
CJam

@anOKsquirrel lo siento ^^ ¿fue similar?
aditsu

Hubiera sido si lo hubiera terminado.
anOKsquirrel

¿Cómo funciona W%? W es -1, entonces ...
anOKsquirrel

1
@anOKsquirrel vea la documentación aquí
aditsu

9

Pyth, 14 bytes

smCi!M_jCd2 2z

Pruébalo en línea.

Cómo funciona

 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
Soluciones alternativas (todos los 14 bytes):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis

¿Qué tal una versión que elimina los no imprimibles, solo por interés / para comparación? Probablemente como una respuesta separada.
hyde

8

Perl, 57 51 caracteres

(Código de 50 caracteres + opción de línea de comando de 1 carácter).

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

Ejecución de muestra:

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 Bytes: -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&es más corto que sprintf'%b',ord$&, y además decodifica en orden inverso. Desafortunadamente, también produce ceros finales, que deben eliminarse.
primo

Gracias @primo. unpackTodavía es un terreno inexplorado para mí.
manatwork

42 Bytes: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Invierta el personaje, no es necesario transliterar;)
primo

7

JavaScript ( ES6 ES7), 119 114 108 bytes

Esto resultó mucho más de lo esperado :(

¡Gracias a @vihan por 5 bytes guardados! ¡Gracias a @ETHProductions por otros 6 bytes guardados!

Para probar:  Ejecute el fragmento a continuación, ingrese la entrada como "Hello, World!"y haga clic en Probar.

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>


Creo que se podría ahorrar unos 4 bytes en sustitución del parseIntcon +('0b'+<code>)como se describe aquí y otro utilizando w^1en lugar de+!+w
Downgoat

2
Nunca hubiera pensado que esto fuera posible, pero acabo de jugar .05 bytes : 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) Sin embargo, quizás esto no sea legal; solo maneja 10 == \n, no 13 == \r. @ Vɪʜᴀɴ ¿Cuál es tu opinión?
ETHproductions

1
Me sale Unexpected token '>'cuando trato de ejecutar el fragmento.
Paul R

1
@ETHproductions: gracias, solo tengo Safari y Chrome a mano y supongo que ninguno de estos es "compatible con ES6".
Paul R

1
@PaulR ES6, o ECMAScript 6, es uno de los últimos conjuntos de nuevas funciones para JavaScript. Vea este sitio para más información. También hay una tabla de compatibilidad que muestra qué funciones son compatibles con qué navegadores (y otros programas). Esta respuesta en particular requiere "funciones de flecha", el "operador de propagación" y las "comprensiones de matriz" de ES7.
ETHproductions

5

JavaScript (ES7), 126 bytes - 15% = 107.1

Estaba jugando con esta respuesta para ver si valía la pena. Aparentemente lo es. El conjunto de pruebas fue robado de la misma respuesta, pero agregué mi propio giro: ¡soporte completo del bono del 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>


¡Impresionante modificación del fragmento de prueba! Parece que el fragmento ahora comprueba automáticamente la bonificación, ¿puedo preguntar cómo lo hizo? (ps si desea la fuente original (no en una línea), no dude en preguntar, podría ser más fácil de modificar de esa manera)
jrich

@UndefinedFunction ¡Oh, perdón por no responder de inmediato! Agregué una getScore()función que verifica el Hello, World!cumplimiento del caso de prueba (contiene convenientemente una nueva línea y caracteres no imprimibles), y devuelve el puntaje multiplicado por .85 o 1, dependiendo del resultado. Y sí, el acceso al fragmento no minimizado sería excelente. :)
ETHproductions

He hecho el código de fragmento original disponible aquí . ¡Que te diviertas!
jrich

4

PHP - 187 182 163 bytes

<?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))))))));?>

Pase el valor como GET["s"].

array_map devuelve una matriz con todos los elementos del segundo parámetro (una matriz) después de aplicar la función de devolución de llamada (primer parámetro) a todos ellos.

No estoy seguro de si debería tomar el 15% de descuento, ya echoque no genera caracteres no imprimibles, pero no los eliminé.

Me alegro de haber terminado, ya que este es el primer desafío en el que participo.


1
Es más corto si no se declara esas funciones: $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 se olvidó por completo de eso. Gracias.
indefinido el

No puede simplemente poner la entrada en una variable. Debe crear una función o leer la entrada de STDIN. Por cierto, no es necesario usar comillas alrededor de la cadena ( "chr", "bindec", ...) ya que no se preocupan por las advertencias. Eso debería ahorrarte 12 bytes.
Blackhole

@Blackhole gracias por la información, lo tendré en cuenta la próxima vez.
indefinido el

Será mejor que modifique esta respuesta, que de lo contrario no es válida :). Casi no le costará bytes, solo reemplácelos str_split($s)con, str_split(fgets(STDIN))por ejemplo.
Blackhole

3

K5, 28 bytes

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

Esto es un poco incómodo porque el decodeoperador de K5 realiza una conversión de base de ancho fijo, por lo que para cumplir con la declaración del problema tengo que recortar los ceros a la izquierda. La lambda {x@&|\x}logra este paso.

Frotis:

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

Reunir:

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

Seleccionar:

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

Todo el programa en acción:

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

Creo que el comportamiento natural de OK con los no imprimibles lo hace elegible para -15%, lo que le da un puntaje de 28 * 0.85 = 23.8 .


¡+1 porque lo intenté pero no pude encontrar una forma corta de deshacerme de los ceros iniciales!
kirbyfan64sos

Algunas construcciones relacionadas se pueden encontrar aquí .
JohnE

3

Julia, 77 bytes - 15% = 65.45

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

Esto crea una función sin nombre que acepta una cadena y devuelve una cadena. Se eliminan los caracteres no imprimibles, lo que califica esto para la bonificación.

Sin golf:

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

Si bien ciertamente lo califica para la bonificación, también cuesta más que las bonificaciones guardadas. 16 bytes filter(isprint,)y solo 11.55 bytes guardados a través del bono.
Glen O

Y si abandonas el paso del filtro, puedes evitar la comprensión y unirte usando el mapa directamente en la cadena. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(para 56 bytes)
Glen O

@GlenO Gracias por las sugerencias, pero ese enfoque deja en imprimibles como códigos hexadecimales, que el OP dijo que no está permitido. El uso de filter(isprint,)ambos lo califica para el bono y lo hace cumplir con las reglas.
Alex A.

"Si un carácter resulta ser no imprimible, opcionalmente puede generarlo pero no es necesario eliminarlo".
Glen O

Y si la preocupación está del otro lado (que se muestra como \x04y similares), entonces print()cuesta siete, lo que generaría 56 hasta 63.
Glen O

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''

Utiliza una cantidad desafortunada de algunas llamadas / incorporaciones de .NET, lo que aumenta significativamente el código.

Explicado:

Toma la entrada param(..)y la convierte como una char[]para que podamos trabajarla adecuadamente.

El siguiente bit (..)-join''recopila y une nuestra salida.

Dentro de esos parens, iteramos $a|%{..}como un bucle foreach.

Dentro del bucle:

  • Creamos una nueva cadena $b, que es nuestra carta de entrada emitida como int +$_y [convert]ed a base2
  • El siguiente bit, la configuración $c, es complicado, así que comencemos adentro y salgamos
  • Revertimos la cuerda $bcon(-join$b[$b.length..0])
  • Aprovechamos mi código anterior para invertir una cadena binaria y refundir el resultado como una cadena con"$(..)"
  • Alimentamos esa cadena en una llamada .NET diferente que [convert]es ToInt32desde la base 2, que finalmente se almacena en$c
  • Si $ces mayor 31o igual que 10, lo convertimos como un carácter y ese valor se deja en la tubería para la salida (que es lo que se recopila y -join''edita, arriba), de lo contrario no queda nada en esta iteración en particular

Uf.

También califica para el bono de -15%.

Ejemplo

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



1

Minkolang 0.11 , 26 bytes

od?.(d2%,$r2:d)xrI1-[2*+]O

Pruébalo aquí

Explicación

od?.            Takes input as character, halting if empty
(d2%,$r2:d)x    Converts to binary, inverting digits on the way
r               Reverses stack
I1-[2*+]        Converts to decimal
O               Outputs as character (if printable)

1

MATLAB, 60 bytes

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

Básicamente, cada carácter a su vez se convierte en una cadena binaria (sin ceros a la izquierda). La matriz se voltea y se resta de 97 ('0' + '1') que invierte el carácter. Esto se convierte de nuevo a decimal. Después de que se hayan procesado todos los caracteres, toda la matriz se convierte de nuevo en caracteres antes de ser devuelta.


1

Pitón 3, 95 91

Implementación directa.

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

Sin golf:

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

Ruby, 62 caracteres

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

Ejecución de muestra:

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 bytes - 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{}}}

Sangría y nuevas líneas para mayor claridad:

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 bytes

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

1

Retina , 1107 629 bytes - 15% = 534,65 (no competitivo)

Utiliza características agregadas después de la fecha de desafío. (Comportamiento implícito de $*, , clasificación)

La retina no tiene una función incorporada para convertir un personaje a su ordinal ASCII o hacia atrás ... así que contemple su longitud brillante. Esto maneja ASCII imprimible y elimina las no imprimibles y las nuevas líneas. El recuento de bytes asume la codificación ISO 8859-1.

El código contiene caracteres no imprimibles.


¶
±
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
¶

Pruébalo en línea

Si revisa el tutorial de Retina para aritmética unaria , reconocerá varias piezas diferentes de mi código como provenientes de allí.

Gracias a Martin por jugar cientos de bytes


1

Java, 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);}}}

Sin golf:

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);
        }
    }
}

Creo que esta solución es un poco interesante en su uso de los Integermétodos Integer.reversey en Integer.numberOfLeadingZeroslo que suenan, y el cambio de -1 >>> sdónde ses el número de ceros a la izquierda, para que la máscara enmascare los bits altos que no queremos. Solo lamento que el nombre del último método sea tan detallado, pero eso es lo que obtengo por jugar al golf en Java.

Salida:

v,dd2>
Xdl

1

Japt, 25 bytes

¿Desea crear un programa JavaScript de golf, pero el método más corto involucra muchos nombres de funciones largos? Para eso fue hecho Japt. :)

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

¡Pruébelo en el intérprete en línea !

Cómo funciona

         // 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

Usando la versión actual de Japt (a partir de v1.4.4), el recuento de bytes se puede reducir a 14:

®c ¤w m^1 n2 d

¡Pruébalo en línea!


0

Haskell, 167 bytes

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)"")

Desafortunadamente, Haskell se vuelve bastante detallado cuando necesita leer / imprimir en otra base ...


0

Perl 6, 66 bytes

Hacer todo lo posible al eliminar los caracteres de control que no se imprimen me lleva a (83 + 1) -15% = 71.4

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

Si elimino el código que elimina los caracteres de control, guardo bastante 65 + 1 = 66

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

(Solía ​​en »lugar de >>para mayor claridad)


0

Gelatina , 6 bytes (no competitiva)

OBU¬ḄỌ

Pruébalo en línea!

Explicación:

OBU¬ḄỌ Main link: z
O      Convert z to a list of character codes.
 B     Convert the codes to bit lists.
  U    Reverse the bits (not the lists).
   ¬   Invert the bits.
    Ḅ  Convert back to decimal.
     Ọ Convert back to string.

0

Raqueta 250 15% de bonificación = 212 bytes

(λ(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))))))))))))

Sin golf:

(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)
               )))))))))))

Pruebas:

(f "Hello, World!")

Salida:

"v,dd2>\nXdl"

0

PHP, 80 bytes

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

toma entrada de STDIN; corre con-R .

versión de bonificación, 97 110 bytes -> 93.5 puntaje

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

imprime ASCII 10 y 32 a 126 (nueva línea e imprimibles)


desglose, TiO y si es posible algo de golf seguirá; Estoy cansado ahora mismo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.