Invertire e invertire una stringa


27

Invertire e invertire una stringa

Sfida

In questa sfida. Scriverai un programma che emetterà o restituirà l'input, invertito e invertito.

Innanzitutto, ogni carattere dovrebbe essere convertito nel suo codice carattere. Quindi, dovrebbe essere convertito in base-2. Di seguito, quella stringa dovrebbe essere invertita. Successivamente, la stringa deve essere invertita (1 -> 0 e 0 -> 1). Infine, questo dovrebbe essere riconvertito in base 2 e quindi riconvertito in un personaggio. Se un personaggio risulta non stampabile, puoi eventualmente produrlo ma non è necessario rimuoverlo.

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)

punteggio

Vince il codice più breve in byte.

-15% di bonus: se il tuo programma rimuove i non stampabili dall'output. Questo deve contenere almeno tutti i caratteri al di sotto di 32 tranne le nuove righe (carattere 10)


Devo far funzionare di nuovo il mio interprete Simplex XDGBktnkZs
Conor O'Brien il

Quindi i caratteri nella stringa non sono invertiti, ma i bit in ogni carattere lo sono?
xnor

Giusto per essere sicuri: per 0010000 è il bit reverse 0000100 o 00001?
Trauma digitale,

@DigitalTrauma Se il codice binario lo è 0010000, dovrebbe essere trattato come 10000il contrario00001
Downgoat

2
Possiamo assumere solo ASCII (come i tuoi esempi), o dovrebbe funzionare per qualunque personaggio nella mia lingua? (Inoltre, se una lingua utilizza un codice carattere diverso, dovrei usare questo invece di ASCII / Unicode)?
Paŭlo Ebermann,

Risposte:


4

CJam, 14

q{i2bW%:!2bc}%

Provalo online

Spiegazione:

Abbastanza diretto:

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

Versione "stampabile", 20-15% = 17

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

Dangit, tu. Stavo per pubblicare una risposta CJam D:
anOKsquirrel il

@anOKsquirrel scusa ^^ era simile?
aditsu,

Sarebbe stato se l'avessi finito.
anOKsquirrel,

Come funziona W%? W è -1, quindi ...
anOKsquirrel

1
@anOKsquirrel vedere la documentazione qui
aditsu

9

Pyth, 14 byte

smCi!M_jCd2 2z

Provalo online.

Come funziona

 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
Soluzioni alternative (tutti i 14 byte):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis

Che ne dici di una versione che rimuove gli stampabili, solo per interesse / per confronto? Probabilmente come risposta separata.
hyde,

8

Perl, 57 51 caratteri

(Codice di 50 caratteri + opzione della riga di comando di 1 carattere.)

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

Esecuzione di esempio:

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 byte: -p s/./$_=unpack b8,$&;s|0+$||;"chr 0b".y|10|01|r/gee. unpack b8,$&è più breve di sprintf'%b',ord$&e inoltre decodifica in ordine inverso. Sfortunatamente produce anche 0 finali, che devono essere rimossi.
primo

Grazie @primo. unpackè ancora un terreno inesplorato per me.
arte

42 byte: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Invertire il personaggio, non è necessario traslitterare;)
primo

7

JavaScript ( ES6 ES7), 119 114 108 byte

Questo si è rivelato molto più lungo del previsto :(

Grazie a @vihan per 5 byte salvati! Grazie a @ETHProductions per altri 6 byte salvati!

Per testare:  esegui il frammento di seguito, inserisci input come "Hello, World!"e fai clic su 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>


Penso che si potrebbe risparmiare 4 byte che sostituiscono la parseIntcon +('0b'+<code>)come descritto qui e un altro usando w^1al posto di+!+w
Downgoat

2
Non avrei mai pensato che fosse possibile, ma mi sono appena liberato di 0,05 byte : 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) Forse non è legale, comunque; gestisce solo 10 == \n, non 13 == \r. @ Vɪʜᴀɴ qual è la tua opinione?
ETHproductions

1
Ottengo Unexpected token '>'quando provo a eseguire lo snippet.
Paolo R,

1
@ETHproductions: grazie - Ho solo Safari e Chrome a portata di mano e immagino che nessuno di questi sia "conforme ES6".
Paul R,

1
@PaulR ES6, o ECMAScript 6, è una delle ultime serie di nuove funzionalità per JavaScript. Vedi questo sito per maggiori informazioni. C'è anche una tabella di compatibilità che mostra quali funzionalità sono supportate da quali browser (e altri programmi). Questa risposta in particolare richiede "funzioni freccia", "operatore di diffusione" e "comprensione dell'array" di ES7.
ETHproductions

5

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

Stavo giocando con questa risposta per vedere se ne valesse la pena. Apparentemente lo è. La suite di test è stata rubata dalla stessa risposta, ma ho aggiunto la mia personale svolta: pieno supporto del bonus 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>


Impressionante modifica dello snippet di test! Sembra che lo snippet ora controlli automaticamente il bonus, posso chiederti come hai fatto? (ps se vuoi la fonte originale (non su una riga), sentiti libero di chiedere, potrebbe essere più semplice modificare in quel modo)
jrich

@UndefinedFunction Oh, scusa per non aver risposto subito! Ho aggiunto una getScore()funzione che controlla la Hello, World!conformità del test case (contiene comodamente sia una nuova riga che caratteri non stampabili) e restituisce il punteggio moltiplicato per 0,85 o 1, a seconda del risultato. E sì, l'accesso allo snippet non minimizzato sarebbe fantastico. :)
ETHproductions

Ho reso disponibile il codice dello snippet originale qui . Divertiti!
jrich

4

PHP - 187 182 163 byte

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

Passa il valore come GET["s"].

array_map restituisce un array con tutti gli elementi del secondo parametro (un array) dopo aver applicato la funzione di callback (primo parametro) a tutti loro.

Non sono sicuro se dovrei prendere il 15% di sconto, dal momento echoche non genera caratteri non stampabili, ma non li ho rimossi.

Sono contento di aver finito, poiché questa è la prima sfida a cui prendo parte.


1
È più breve se non si dichiara quelle funzioni: $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))))))));.
arte

@manatwork se ne è completamente dimenticato. Grazie.
indefinito il

Non puoi semplicemente inserire l'input in una variabile. È necessario creare una funzione o leggere l'input da STDIN. Tra l'altro, non è necessario utilizzare le virgolette attorno stringa ( "chr", "bindec", ...) dal momento che non si preoccupano gli avvertimenti. Ciò dovrebbe farti risparmiare 12 byte.
Blackhole,

@Blackhole grazie per le informazioni, lo saprò la prossima volta.
indefinito il

Faresti meglio a fare la modifica su questa risposta, che altrimenti non è valida :). Non ti costerà quasi nessun byte, basta sostituirlo str_split($s)con str_split(fgets(STDIN))per esempio.
Blackhole,

3

K5, 28 byte

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

Questo è un po 'scomodo perché l' decodeoperatore di K5 esegue una conversione di base a larghezza fissa, quindi per rispettare l'istruzione del problema devo tagliare gli zero iniziali. La lambda {x@&|\x}compie questo passaggio.

Smear:

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

Raccogliere:

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

Selezionare:

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

L'intero programma in azione:

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

Credo che il comportamento naturale di oK con gli stampabili lo renda idoneo per il -15%, ottenendo un punteggio di 28 * 0,85 = 23,8 .


+1 perché ci ho provato ma non sono riuscito a capire un modo breve per sbarazzarmi degli zeri iniziali!
kirbyfan64sos

Alcune costruzioni correlate possono essere trovate qui .
Giovanni

3

Julia, 77 byte - 15% = 65,45

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

Questo crea una funzione senza nome che accetta una stringa e restituisce una stringa. I caratteri non stampabili vengono rimossi, il che qualifica questo per il bonus.

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

Anche se sicuramente lo qualifica per il bonus, costa anche più di quanto risparmi il bonus. 16 byte filter(isprint,)e solo 11,55 byte salvati attraverso il bonus.
Glen O

E se abbandoni il passaggio del filtro, puoi evitare la comprensione e unirti usando la mappa direttamente sulla stringa. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(per 56 byte)
Glen O

@GlenO Grazie per i suggerimenti, ma quell'approccio lascia in stampabili come codici esadecimali, che l'OP ha detto non è permesso. L'uso di filter(isprint,)entrambi lo qualifica per il bonus e lo rende conforme alle regole.
Alex A.

"Se un personaggio risulta non stampabile, puoi opzionalmente produrlo ma non è necessario rimuoverlo."
Glen O

E se la preoccupazione è dall'altra parte (che mostra come \x04e simili), allora print()costa sette, il che porterebbe 56 a 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''

Utilizza una quantità sfortunata di alcune chiamate / built-in .NET, che gonfia significativamente il codice.

Ha spiegato:

Prende l'input param(..)e lo proietta in char[]modo che possiamo elaborarlo in modo appropriato.

Il prossimo bit (..)-join''raccoglie e unisce il nostro output insieme.

All'interno di quelle parentesi, ripetiamo $a|%{..}come un ciclo foreach.

All'interno del ciclo:

  • Creiamo una nuova stringa $b, che è la nostra lettera di input cast come int +$_e [convert]ed alla base2
  • La prossima parte, l'impostazione $c, è complicata, quindi iniziamo dentro e usciamo
  • Invertire la stringa $bcon(-join$b[$b.length..0])
  • Sfruttiamo il mio codice precedente per invertire una stringa binaria e rifondere il risultato come stringa con"$(..)"
  • Alimentiamo che stringa in una diversa chiamata NET che [convert]s ToInt32dalla base 2, che viene infine memorizzato che in$c
  • Se $cè maggiore 31o uguale a 10, lo lanciamo come carattere e quel valore viene lasciato sulla pipeline per l'output (che è ciò che viene raccolto ed -join''editato insieme, sopra), altrimenti nulla viene lasciato su questa particolare iterazione

Uff.

Si qualifica anche per il bonus del -15%.

Esempio

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



1

Minkolang 0,11 , 26 byte

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

Provalo qui.

Spiegazione

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 byte

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

Fondamentalmente ogni carattere a sua volta viene convertito in una stringa binaria (senza zeri iniziali). L'array viene invertito e sottratto da 97 ('0' + '1') che inverte il carattere. Questo viene riconvertito in decimale. Dopo che tutti i caratteri sono stati elaborati, l'intera matrice viene quindi riconvertita in caratteri prima di essere restituita.


1

Python 3, 95 91

Implementazione semplice.

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

Rubino, 62 caratteri

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

Corsa campionaria:

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

Rientro e nuove linee per chiarezza:

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 byte

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

1

Retina , 1107 629 byte - 15% = 534,65 (non concorrenti)

Utilizza le funzionalità aggiunte dopo la data della sfida. (Comportamento implicito di $*, , Sorting)

Retina non ha un built-in per convertire un personaggio nel suo ordinale ASCII o posteriore ... quindi ecco la sua brillante lunghezza. Gestisce ASCII stampabile e rimuove non stampabili e newline. Il conteggio dei byte presuppone la codifica ISO 8859-1.

Il codice contiene caratteri non stampabili.


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

Provalo online

Se dai un'occhiata al tutorial Retina per l'aritmetica unaria , riconoscerai diversi pezzi del mio codice come provenienti da lì.

Grazie a Martin per il golf al largo di centinaia di byte


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

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

Penso che questa soluzione sia un po 'interessante nel suo uso dei Integermetodi Integer.reversee Integer.numberOfLeadingZerosche fanno quello che sembrano, e lo spostamento di -1 >>> sdove sè il numero di zero iniziali, per ottenere la maschera per mascherare i bit alti che non vogliamo. Mi dispiace solo che il nome di quest'ultimo metodo sia così dannatamente dettagliato, ma è quello che ottengo per giocare a golf in Java.

Produzione:

v,dd2>
Xdl

1

Japt, 25 byte

Vuoi creare un programma JavaScript da golf, ma il metodo più breve prevede molti nomi di funzioni lunghe? Questo è ciò per cui è stato creato Japt. :)

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

Provalo nell'interprete online !

Come funziona

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

Utilizzando la versione corrente di Japt (dalla v1.4.4), il conteggio dei byte può essere ridotto a 14:

®c ¤w m^1 n2 d

Provalo online!


0

Haskell, 167 byte

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

Sfortunatamente Haskell diventa piuttosto prolisso quando ha bisogno di leggere / stampare in un'altra base ...


0

Perl 6, 66 byte

Andare tutto fuori rimuovendo i caratteri di controllo non stampabili mi porta a (83 + 1) -15% = 71.4

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

Se rimuovo il codice che rimuove i caratteri di controllo, risparmio un po 'di 65 + 1 = 66

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

(Ho usato »invece che >>per chiarezza)


0

Gelatina , 6 byte (non competitiva)

OBU¬ḄỌ

Provalo online!

Spiegazione:

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

Racchetta 250 bonus del 15% = 212 byte

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

test:

(f "Hello, World!")

Produzione:

"v,dd2>\nXdl"

0

PHP, 80 byte

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

accetta input da STDIN; corri con -R.

versione bonus, 97 110 byte -> 93,5 punti

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

stampa ASCII 10 e da 32 a 126 (newline e stampabili)


guasto, TiO e, se possibile, seguiranno alcuni golf; Sono stanco adesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.