Balikkan dan Balikkan String


27

Balikkan dan Balikkan String

Tantangan

Dalam tantangan ini. Anda akan menulis sebuah program yang akan menampilkan atau mengembalikan input, terbalik dan terbalik.

Pertama, setiap karakter harus dikonversi ke kode karakternya. Kemudian, itu harus dikonversi ke basis-2. Mengikuti, string itu harus dibalik. Setelah itu, string harus dibalik (1 -> 0 dan 0 -> 1). Akhirnya, itu harus dikonversi kembali ke basis 2 dan kemudian dikonversi kembali ke karakter. Jika sebuah karakter menghasilkan sesuatu yang tidak dapat dicetak, Anda dapat membuatnya secara opsional tetapi mereka tidak harus dihapus.

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)

Mencetak gol

Kode terpendek dalam byte menang.

-15% Bonus: jika program Anda menghapus yang tidak dapat dicetak dari output. Ini harus setidaknya semua karakter di bawah 32 kecuali baris baru (karakter 10)


Saya perlu agar juru bahasa Simplex saya bekerja lagi XDGBktnkZs
Conor O'Brien

Jadi karakter dalam string tidak terbalik, tetapi bit pada setiap karakter adalah?
xnor

Hanya untuk memastikan: untuk 0010000 adalah bit balik 0000100 atau 00001?
Digital Trauma

@DigitalTrauma Jika kode binernya 0010000, harus diperlakukan sebagai 10000kebalikannya00001
Downgoat

2
Bisakah kita menganggap hanya ASCII (sebagai contoh Anda), atau haruskah ini bekerja untuk apa pun karakter dalam bahasa saya? (Juga, jika suatu bahasa menggunakan kode karakter yang berbeda, haruskah saya menggunakan ini alih-alih ASCII / Unicode)?
Paŭlo Ebermann

Jawaban:


4

CJam, 14

q{i2bW%:!2bc}%

Cobalah online

Penjelasan:

Cukup mudah:

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 "Cetak", 20 - 15% = 17

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

Dangit, kamu. Saya baru saja akan memposting jawaban CJam D:
anOKsquirrel

@anOKsquirrel maaf ^^ apakah mirip?
aditsu

Itu akan terjadi jika saya menyelesaikannya.
anOKsquirrel

Bagaimana cara kerja W%? W adalah -1, jadi ...
anOKsquirrel

1
@anOKsquirrel lihat dokumentasi di sini
aditsu

9

Pyth, 14 byte

smCi!M_jCd2 2z

Cobalah online.

Bagaimana itu bekerja

 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
Solusi alternatif (semua 14 byte):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis

Bagaimana dengan versi yang menghapus yang tidak diinginkan, hanya karena tidak menarik / untuk perbandingan? Mungkin sebagai jawaban terpisah.
hyde

8

Perl, 57 51 karakter

(50 karakter kode + 1 opsi baris perintah karakter.)

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

Contoh dijalankan:

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,$&lebih pendek dari sprintf'%b',ord$&, dan juga menerjemahkan dalam urutan terbalik. Sayangnya itu juga menghasilkan trailing 0s, yang perlu dihapus.
Primo

@Primo terima kasih. unpackmasih merupakan daerah yang belum dijelajahi untuk saya.
manatwork

42 byte: -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Balikkan karakter, tidak perlu transliterasi;)
primo

7

JavaScript ( ES6 ES7), 119 114 108 byte

Ini ternyata jauh lebih lama dari yang diharapkan :(

Berkat @ vihan untuk 5 byte yang disimpan! Terima kasih kepada @ETHProductions untuk 6 byte lainnya yang disimpan!

Untuk menguji:  Jalankan cuplikan di bawah ini, masukkan input like "Hello, World!", dan klik 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>


Saya pikir Anda bisa menyimpan 4 byte menggantikan parseIntdengan +('0b'+<code>)seperti yang dijelaskan di sini dan yang lain dengan menggunakan w^1bukannya+!+w
Downgoat

2
Saya tidak akan pernah berpikir ini mungkin, tapi saya hanya bermain golf 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) Mungkin ini tidak legal, meskipun; itu hanya menangani 10 == \n, bukan 13 == \r. @ V, apa pendapat Anda?
ETHproduk

1
Saya dapatkan Unexpected token '>'ketika saya mencoba menjalankan cuplikan.
Paul R

1
@ ETHproductions: terima kasih - Saya hanya punya Safari dan Chrome di tangan dan saya kira tidak satu pun dari ini "ES6-compliant".
Paul R

1
@PaulR ES6, atau ECMAScript 6, adalah salah satu set fitur terbaru untuk JavaScript. Lihat situs ini untuk info lebih lanjut. Ada juga tabel kompatibilitas yang menunjukkan fitur mana yang didukung oleh browser mana (dan program lain). Jawaban ini khususnya memerlukan "fungsi panah", "operator penyebaran", dan "pemahaman array" ES7.
ETHproduk

5

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

Saya bermain-main dengan jawaban ini untuk melihat apakah bonus itu sepadan. Rupanya begitu. Test suite dicuri dari jawaban yang sama, tetapi saya menambahkan twist saya sendiri: dukungan penuh dari bonus 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>


Modifikasi potongan uji yang mengagumkan! Tampaknya potongan sekarang secara otomatis memeriksa bonus, boleh saya bertanya bagaimana Anda melakukannya? (ps jika Anda menginginkan sumber asli (bukan pada satu baris), jangan ragu untuk bertanya, mungkin lebih mudah untuk memodifikasi seperti itu)
jrich

@UndefinedFungsi Oh, maaf karena tidak segera membalas! Saya menambahkan getScore()fungsi yang memeriksa Hello, World!kepatuhan uji kasus (dengan mudah berisi baris baru dan karakter yang tidak diinginkan), dan mengembalikan skor dikalikan dengan 0,85 atau 1, tergantung pada hasilnya. Dan ya, akses ke cuplikan yang tidak ditambang akan sangat bagus. :)
ETHproduk

Saya telah membuat kode cuplikan asli tersedia di sini . Selamat bersenang-senang!
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))))))));?>

Berikan nilai sebagai GET["s"].

array_map mengembalikan array dengan semua elemen dari parameter kedua (sebuah array) setelah menerapkan fungsi callback (parameter pertama) untuk semuanya.

Tidak yakin apakah saya harus mengambil 15% off, karena echotidak menghasilkan karakter yang tidak patut, tetapi saya tidak menghapusnya.

Senangnya saya selesai, karena ini adalah tantangan pertama saya ambil bagian.


1
Lebih pendek jika Anda tidak mendeklarasikan fungsi-fungsi: $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 benar-benar lupa tentang itu. Terima kasih.
undefined

Anda tidak bisa hanya memasukkan input ke dalam variabel. Anda harus membuat fungsi atau membaca input dari STDIN. By the way, Anda tidak perlu menggunakan tanda kutip tali ( "chr", "bindec", ...) karena kita tidak peduli tentang peringatan. Itu akan menghemat 12 byte.
Blackhole

@ Terima kasih Lubang Hitam untuk info, saya akan menyadari bahwa waktu berikutnya.
undefined

Anda sebaiknya melakukan modifikasi pada jawaban ini, yang dinyatakan tidak valid :). Akan dikenakan biaya hampir tanpa byte, cukup ganti str_split($s)dengan str_split(fgets(STDIN))misalnya.
Blackhole

3

K5, 28 byte

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

Ini agak tidak nyaman karena decodeoperator K5 melakukan konversi basis lebar-tetap, jadi untuk mematuhi pernyataan masalah saya harus memotong nol terkemuka. Lambda {x@&|\x}menyelesaikan langkah ini.

Mengolesi:

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

Mengumpulkan:

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

Memilih:

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

Seluruh program dalam aksi:

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

Saya percaya perilaku alami oK dengan unsintables membuat ini memenuhi syarat untuk -15%, memberikan skor 28 * 0,85 = 23,8 .


+1 karena saya mencoba tetapi tidak dapat menemukan cara singkat untuk menyingkirkan nol terkemuka!
kirbyfan64sos

Beberapa konstruksi terkait dapat ditemukan di sini .
JohnE

3

Julia, 77 byte - 15% = 65,45

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

Ini menciptakan fungsi tak bernama yang menerima string dan mengembalikan string. Karakter yang tidak dapat dicetak dihapus, yang memenuhi syarat ini untuk bonus.

Tidak Disatukan:

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

Meskipun tentu memenuhi syarat untuk bonus, itu juga biaya lebih dari menghemat bonus. 16 byte ke filter(isprint,)dan hanya 11,55 byte yang disimpan melalui bonus.
Glen O

Dan jika Anda menyerah pada langkah filter, Anda dapat menghindari pemahaman dan bergabung dengan menggunakan peta langsung pada string. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(for 56 bytes)
Glen O

@ GlenO Terima kasih atas sarannya, tetapi pendekatan itu meninggalkan kode-kode hex yang tidak dapat dicetak, yang menurut OP tidak diperbolehkan. Menggunakan filter(isprint,)keduanya memenuhi syarat untuk bonus dan membuatnya sesuai dengan aturan.
Alex A.

"Jika sebuah karakter menghasilkan sesuatu yang tidak dapat dicetak, Anda dapat memproduksinya secara opsional tetapi mereka tidak harus dihapus."
Glen O

Dan jika kekhawatiran ada di sisi lain (yang ditampilkan sebagai \x04dan sejenisnya), maka print()harganya tujuh, yang akan membawa 56 hingga 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''

Penggunaan jumlah yang tidak menguntungkan dari beberapa panggilan .NET / built-in, yang secara signifikan menggembungkan kode.

Dijelaskan:

Mengambil input param(..) dan melemparkannya sebagai char[]sehingga kita dapat mengerjakannya dengan tepat.

Bit selanjutnya (..)-join'' mengumpulkan dan menggabungkan output kami bersama.

Di dalam parens itu, kami beralih ke $a|%{..} loop foreach.

Di dalam lingkaran:

  • Kami membuat string baru $b, yang merupakan surat masukan kami yang dilemparkan sebagai int+$_ dan [convert]ed ke basis2
  • Ini selanjutnya, pengaturan $c , rumit, jadi mari kita mulai di dalam dan mencari jalan keluar
  • Kami membalikkan string $b dengan(-join$b[$b.length..0])
  • Kami memanfaatkan kode saya sebelumnya untuk membalikkan string biner dan menyusun kembali hasilnya sebagai string dengan"$(..)"
  • Kami mengumpankan string itu ke panggilan .NET yang berbeda [convert]denganToInt32 dari dasar 2, yang akhirnya tersimpan yang menjadi$c
  • Jika $clebih besar dari 31, atau sama dengan 10, kita melemparkannya sebagai char dan nilainya tertinggal di pipeline untuk output (yang dikumpulkan dan -join''diedit bersama di atas), kalau tidak, tidak ada yang tersisa pada iterasi khusus ini.

Fiuh.

Memenuhi syarat untuk bonus -15%, juga.

Contoh

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

Coba di sini.

Penjelasan

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

Pada dasarnya setiap karakter pada gilirannya dikonversi menjadi string biner (tanpa nol di depan). Array dibalik dan dikurangi dari 97 ('0' + '1') yang membalik karakter. Ini dikonversi kembali ke desimal. Setelah semua karakter diproses, seluruh array kemudian dikonversi kembali ke karakter sebelum dikembalikan.


1

Python 3, 95 91

Implementasi langsung.

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

Tidak Disatukan:

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 karakter

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

Jalankan sampel:

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

Lekukan dan baris baru untuk kejelasan:

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

Menggunakan fitur yang ditambahkan setelah tanggal tantangan. (Perilaku implisit dari $*, , Sorting)

Retina tidak memiliki built-in untuk mengubah karakter menjadi ASCII atau belakangnya ... jadi lihatlah panjangnya yang berkilau. Ini menangani ASCII yang dapat dicetak, dan menghapus yang tidak diinginkan serta baris baru. Hitungan byte mengasumsikan penyandian ISO 8859-1.

Kode berisi karakter yang tidak patut dicetak.


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

Cobalah online

Jika Anda melihat tutorial Retina untuk aritmatika unary , Anda akan mengenali beberapa bagian kode saya yang berasal dari sana.

Terima kasih kepada Martin untuk bermain golf ratusan 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);}}}

Tidak Disatukan:

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

Saya pikir solusi ini sedikit menarik dalam penggunaan Integermetode Integer.reversedan Integer.numberOfLeadingZerosapa yang mereka lakukan, dan perubahan di -1 >>> smanas adalah angka nol terkemuka, untuk mendapatkan topeng untuk menutupi bit tinggi yang tidak kita inginkan. Saya hanya menyesal bahwa nama metode yang terakhir ini sangat bertele-tele, tapi itulah yang saya dapatkan untuk bermain golf di Jawa.

Keluaran:

v,dd2>
Xdl

1

Japt, 25 byte

Ingin membuat program JavaScript golf, tetapi metode terpendek melibatkan banyak nama fungsi yang panjang? Untuk itulah Japt dibuat. :)

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

Cobalah di penerjemah online !

Bagaimana itu bekerja

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

Menggunakan versi Japt saat ini (pada v1.4.4), jumlah byte dapat dipotong menjadi 14:

®c ¤w m^1 n2 d

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

Sayangnya Haskell menjadi sangat verbose ketika perlu membaca / mencetak di basis lain ...


0

Perl 6, 66 byte

Keluar habis-habisan dengan menghapus karakter kontrol non-cetak membuat saya (83 + 1) -15% = 71,4

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

Jika saya menghapus kode yang menghapus karakter kontrol saya menyimpan sedikit 65 + 1 = 66

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

(Saya menggunakan »bukan >>untuk kejelasan)


0

Jelly , 6 byte (tidak bersaing)

OBU¬ḄỌ

Cobalah online!

Penjelasan:

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

Racket 250 15% bonus = 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))))))))))))

Tidak Disatukan:

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

Pengujian:

(f "Hello, World!")

Keluaran:

"v,dd2>\nXdl"

0

PHP, 80 byte

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

menerima input dari STDIN; jalankan bersama -R.

versi bonus, 97 110 byte -> skor 93,5

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

mencetak ASCII 10 dan 32 hingga 126 (baris baru dan barang cetakan)


kerusakan, TiO dan jika mungkin golf akan mengikuti; Saya lelah sekarang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.