Đảo ngược và đảo ngược một chuỗi


27

Đảo ngược và đảo ngược một chuỗi

Thử thách

Trong thử thách này. Bạn sẽ viết một chương trình sẽ xuất hoặc trả lại đầu vào, đảo ngược và đảo ngược.

Đầu tiên, mỗi ký tự nên được chuyển đổi thành mã ký tự của nó. Sau đó, nên được chuyển đổi thành cơ sở 2. Theo sau, chuỗi đó nên được đảo ngược. Sau đó, chuỗi phải được đảo ngược (1 -> 0 và 0 -> 1). Cuối cùng, điều đó nên được chuyển đổi trở lại cơ sở 2 và sau đó chuyển đổi trở lại thành một ký tự. Nếu một ký tự có kết quả là không thể in được, bạn có thể tùy ý xuất nó nhưng chúng không phải bị xóa.

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)

Chấm điểm

Mã ngắn nhất trong byte thắng.

-15% Tiền thưởng: nếu chương trình của bạn loại bỏ các bản in không thể in ra khỏi đầu ra. Điều này phải có ít nhất tất cả các ký tự dưới 32 ngoại trừ dòng mới (char 10)


Tôi cần làm cho trình thông dịch Simplex của tôi hoạt động trở lại XDGBktnkZs
Conor O'Brien

Vì vậy, các ký tự trong chuỗi không đảo ngược, nhưng các bit trong mỗi ký tự là?
xnor

Chỉ cần chắc chắn: đối với 0010000 là bit ngược 0000100 hoặc 00001?
Chấn thương kỹ thuật số

@DigitalTrauma Nếu mã nhị phân là 0010000, mã này phải được xử lý theo 10000chiều ngược lại00001
Downgoat

2
Chúng ta có thể giả sử chỉ là ASCII (như ví dụ của bạn) hay điều này có hiệu quả với bất kỳ ký tự nào trong ngôn ngữ của tôi không? (Ngoài ra, nếu một ngôn ngữ sử dụng mã ký tự khác, tôi có nên sử dụng ngôn ngữ này thay vì ASCII / Unicode) không?
Paŭlo Ebermann 6/11/2015

Câu trả lời:


4

CJam, 14

q{i2bW%:!2bc}%

Dùng thử trực tuyến

Giải trình:

Khá đơn giản:

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

Phiên bản "có thể in", 20 - 15% = 17

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

Thôi nào, bạn. Tôi vừa định đăng một câu trả lời của CJam D:
anOKsquirrel

@anOKsquirrel xin lỗi ^^ có giống như vậy không?
aditsu

Nó sẽ là nếu tôi đã hoàn thành nó.
anOKsquirrel

W% hoạt động như thế nào? W là -1, vì vậy ...
anOKsquirrel

1
@anOKsquirrel xem tài liệu ở đây
aditsu 6/11/2015

9

Bình thường, 14 byte

smCi!M_jCd2 2z

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

 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
Các giải pháp thay thế (tất cả 14 byte):smCi!MvM_.Bd2z smCi.r_.Bd`T2z smCiqR\0_.Bd2z
Dennis

Làm thế nào về một phiên bản loại bỏ không thể in, chỉ quan tâm / để so sánh? Có lẽ là một câu trả lời riêng biệt.
hyde

8

Perl, 57 51 ký tự

(Mã 50 ký tự + 1 ký tự tùy chọn dòng lệnh.)

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

Chạy mẫu:

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,$&ngắn hơn sprintf'%b',ord$&và giải mã thêm theo thứ tự ngược lại. Thật không may, nó cũng tạo ra 0 0, cần phải được loại bỏ.
Primo

Cảm ơn bạn @primo. unpackvẫn là địa hình chưa được khám phá cho tôi.
manatwork 7/11/2015

42 byte : -p s/./"chr 0b".unpack(b8,~$&)=~s|1+$||r/gee. Đảo ngược ký tự, không cần phiên âm;)
primo

7

JavaScript ( ES6 ES7), 119 114 108 byte

Điều này hóa ra cách lâu hơn dự kiến ​​:(

Cảm ơn @vihan đã lưu 5 byte! Cảm ơn @ETH Productstions đã lưu 6 byte khác!

Để kiểm tra:  Chạy đoạn trích bên dưới, nhập dữ liệu thích "Hello, World!"và nhấp vào Kiểm tra!

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>


Tôi nghĩ rằng bạn có thể lưu 4 byte thay thế parseIntbằng +('0b'+<code>)như được mô tả ở đây và một byte khác bằng cách sử dụng w^1thay vì+!+w
Downgoat

2
Tôi chưa bao giờ nghĩ điều này là có thể, nhưng tôi chỉ đánh gôn 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) Tuy nhiên, có lẽ điều này không hợp pháp; Nó chỉ xử lý 10 == \n, không 13 == \r. @ Vɪʜᴀɴ ý kiến ​​của bạn là gì?
Sản xuất ETH

1
Tôi nhận được Unexpected token '>'khi tôi cố chạy đoạn trích.
Paul R

1
@ETHproductions: cảm ơn - Tôi chỉ có Safari và Chrome trên tay và tôi đoán cả hai thứ này đều không "tuân thủ ES6".
Paul R

1
@PaulR ES6, hoặc ECMAScript 6, là một trong những bộ tính năng mới nhất cho JavaScript. Xem trang web này để biết thêm. Ngoài ra còn có bảng tương thích cho biết các tính năng nào được hỗ trợ bởi trình duyệt nào (và các chương trình khác). Câu trả lời này đặc biệt yêu cầu "các hàm mũi tên", "toán tử trải rộng" và "hiểu mảng" của ES7.
Sản phẩm ETH

5

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

Tôi đã chơi xung quanh với câu trả lời này để xem phần thưởng có xứng đáng không. Rõ ràng, nó là. Bộ kiểm tra đã bị đánh cắp từ cùng một câu trả lời, nhưng tôi đã thêm thắt cho riêng mình: hỗ trợ đầy đủ tiền thưởng 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>


Sửa đổi tuyệt vời của đoạn kiểm tra! Có vẻ như đoạn trích bây giờ sẽ tự động kiểm tra phần thưởng, tôi có thể hỏi bạn đã làm điều đó như thế nào không? (ps nếu bạn muốn nguồn gốc (không phải trên một dòng), vui lòng hỏi, có thể dễ dàng sửa đổi theo cách đó hơn)
jrich

@Und xác định chức năng Oh, xin lỗi vì đã không trả lời ngay lập tức! Tôi đã thêm một getScore()chức năng kiểm tra trường hợp kiểm tra xem có Hello, World!tuân thủ không (nó thuận tiện chứa cả dòng mới và ký tự không thể in được) và trả về số điểm nhân với 0,85 hoặc 1, tùy thuộc vào kết quả. Và vâng, truy cập vào đoạn trích chưa được rút gọn sẽ rất tuyệt. :)
Sản phẩm ETH

Tôi đã tạo mã đoạn gốc có sẵn ở đây . Chúc vui vẻ!
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))))))));?>

Truyền giá trị như GET["s"].

mảng_map trả về một mảng với tất cả các phần tử của tham số thứ hai (một mảng) sau khi áp dụng hàm gọi lại (tham số đầu tiên) cho tất cả chúng.

Không chắc chắn tôi có nên giảm 15% không, vì echokhông xuất ra các ký tự không thể in được, nhưng tôi đã không xóa chúng.

Chỉ vui vì tôi đã hoàn thành, vì đây là thử thách đầu tiên tôi tham gia.


1
Là ngắn hơn nếu bạn không khai báo các chức năng đó : $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 hoàn toàn quên mất điều đó. Cảm ơn.
không xác định

Bạn không thể đặt đầu vào trong một biến. Bạn nên tạo một chức năng hoặc đọc đầu vào từ STDIN. Nhân tiện, bạn không cần sử dụng các trích dẫn xung quanh chuỗi ( "chr",, "bindec") vì chúng tôi không quan tâm đến các cảnh báo. Điều đó sẽ giúp bạn tiết kiệm 12 byte.
Hố đen

@Blackhole cảm ơn vì thông tin, tôi sẽ biết điều đó vào lần tới.
không xác định

Tốt hơn hết bạn nên sửa đổi câu trả lời này, nếu không thì không hợp lệ :). Nó sẽ chi phí bạn gần như không có byte, chỉ cần thay thế str_split($s)bằng str_split(fgets(STDIN))ví dụ.
Hố đen

3

K5, 28 byte

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

Điều này hơi bất tiện vì K5 decode toán tử thực hiện chuyển đổi cơ sở có chiều rộng cố định, vì vậy để tuân thủ tuyên bố vấn đề tôi phải cắt các số 0 đứng đầu. Lambda {x@&|\x}hoàn thành bước này

Xì trét

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

Tụ họp:

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

Lựa chọn:

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

Toàn bộ chương trình đang hoạt động:

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

tôi tin Ok hành vi tự nhiên 's với unprintables làm đủ điều kiện này cho -15%, cho đây là một số điểm là 28 * 0,85 = 23,8 .


+1 vì tôi đã cố gắng nhưng không thể tìm ra một cách ngắn để thoát khỏi những con số không hàng đầu!
kirbyfan64sos

Một vài công trình liên quan có thể được tìm thấy ở đây .
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]))

Điều này tạo ra một functon không tên chấp nhận một chuỗi và trả về một chuỗi. Các ký tự không thể in được xóa, đủ điều kiện nhận phần thưởng này.

Ung dung:

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

Mặc dù nó chắc chắn đủ điều kiện nhận phần thưởng, nhưng nó cũng có giá cao hơn phần thưởng tiết kiệm. 16 byte đến filter(isprint,)và chỉ 11,55 byte được lưu thông qua phần thưởng.
Glen O

Và nếu bạn từ bỏ bước lọc, bạn có thể tránh việc hiểu và tham gia bằng cách sử dụng bản đồ trực tiếp trên chuỗi. s->map(c->Char(parse(Int,join(1-digits(Int(c),2)),2)),s)(cho 56 byte)
Glen O

@GlenO Cảm ơn những lời đề nghị, nhưng cách tiếp cận đó không thể in thành mã hex, điều mà OP cho biết là không được phép. Sử dụng filter(isprint,)cả hai đủ điều kiện cho phần thưởng và làm cho nó tuân thủ các quy tắc.
Alex A.

"Nếu một ký tự có kết quả là không thể in được, bạn có thể tùy ý xuất nó nhưng chúng không phải bị xóa."
Glen O

Và nếu mối quan tâm nằm ở phía bên kia của nó (nó hiển thị như \x04và tương tự), thì print()chi phí là bảy, sẽ mang lại 56 lên đến 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''

Sử dụng một số lượng đáng tiếc của một số cuộc gọi / tích hợp .NET, làm tăng đáng kể mã.

Giải thích:

Lấy đầu vào param(..)và ép nó như một cách char[]để chúng ta có thể xử lý nó một cách thích hợp.

Bit tiếp theo (..)-join'' thu thập và tham gia đầu ra của chúng tôi với nhau.

Bên trong các parens đó, chúng tôi lặp đi lặp lại $a|%{..}như một vòng lặp foreach.

Bên trong vòng lặp:

  • Chúng tôi tạo một chuỗi mới $b, đó là chữ cái đầu vào của chúng tôi được đúc dưới dạng int +$_[convert]ed thành cơ sở2
  • Bit tiếp theo này, thiết lập $c , là khó khăn, vì vậy hãy bắt đầu bên trong và tìm cách thoát ra
  • Chúng tôi đảo ngược chuỗi $bvới(-join$b[$b.length..0])
  • Chúng tôi tận dụng mã trước đây của tôi để đảo ngược chuỗi nhị phân và lấy lại kết quả dưới dạng chuỗi với"$(..)"
  • Chúng tôi ăn chuỗi thành một cuộc gọi .NET khác nhau mà [convert]ToInt32từ cơ sở 2, mà là cuối cùng lưu trữ đó vào$c
  • Nếu $clớn hơn 31hoặc bằng 10, chúng ta đặt nó dưới dạng char và giá trị đó được để lại trên đường ống cho đầu ra (là những gì được thu thập và chỉnh sửa -join''cùng nhau, ở trên), không có gì còn lại trong lần lặp cụ thể này

Phù.

Đủ điều kiện nhận thưởng -15%.

Thí dụ

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



1

Chồn 0,11 , 26 byte

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

Hãy thử nó ở đây.

Giải trình

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

Về cơ bản, mỗi ký tự lần lượt được chuyển đổi thành một chuỗi nhị phân (không có số 0 đứng đầu). Mảng được lật và được trừ từ 97 ('0' + '1') để đảo ngược ký tự. Điều này được chuyển đổi trở lại thập phân. Sau khi tất cả các ký tự đã được xử lý, toàn bộ mảng sẽ được chuyển đổi trở lại thành các ký tự trước khi được trả về.


1

Trăn 3, 95 91

Thực hiện đơn giản.

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

Ung dung:

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 ký tự

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

Chạy nhanh:

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

Sự thụt lề và dòng mới cho rõ ràng:

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 (không cạnh tranh)

Sử dụng các tính năng được thêm vào sau ngày thử thách. (Hành vi ngầm của $*, , phân loại)

Retina không được tích hợp sẵn để chuyển đổi một ký tự thành thứ tự ASCII hoặc trở lại ... vì vậy hãy xem chiều dài của nó. Điều này xử lý ASCII có thể in và loại bỏ các bản in không thể in cũng như các dòng mới. Số lượng byte giả định mã hóa ISO 8859-1.

Mã chứa các ký tự không thể in được.


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

Dùng thử trực tuyến

Nếu bạn xem hướng dẫn Retina về số học đơn nguyên , bạn sẽ nhận ra một số đoạn mã khác nhau của tôi đến từ đó.

Cảm ơn Martin vì đã chơi golf hàng trăm 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);}}}

Ung dung:

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

Tôi nghĩ rằng giải pháp này là một chút thú vị trong việc sử dụng các Integerphương pháp của nóInteger.reverseInteger.numberOfLeadingZerosthực hiện những gì chúng nghe giống như, và sự thay đổi của -1 >>> snơis là số zero hàng đầu, để có được những mặt nạ để che tắt bit cao mà chúng ta không muốn. Tôi chỉ tiếc rằng tên của phương thức thứ hai quá dài dòng, nhưng đó là những gì tôi có được khi chơi golf ở Java.

Đầu ra:

v,dd2>
Xdl

1

Japt, 25 byte

Bạn muốn tạo một chương trình JavaScript golf, nhưng phương pháp ngắn nhất liên quan đến rất nhiều tên hàm dài? Đó là những gì Japt được tạo ra. :)

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

Hãy thử nó trong phiên dịch trực tuyến !

Làm thế nào nó hoạt động

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

Sử dụng phiên bản hiện tại của Japt (kể từ v1.4.4), số byte có thể được cắt thành 14:

®c ¤w m^1 n2 d

Kiểm tra nó trực tuyến!


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

Thật không may, Haskell khá dài dòng khi cần đọc / in trong một cơ sở khác


0

Perl 6, 66 byte

Làm hết tất cả bằng cách xóa các ký tự điều khiển không in sẽ đưa tôi đến (83 + 1) -15% = 71,4

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

Nếu tôi loại bỏ mã loại bỏ các ký tự điều khiển, tôi sẽ tiết kiệm được một chút 65 + 1 = 66

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

(Tôi đã sử dụng »thay vì >>cho rõ ràng)



0

Vợt 250 15% tiền thưởng = 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))))))))))))

Ung dung:

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

Kiểm tra:

(f "Hello, World!")

Đầu ra:

"v,dd2>\nXdl"

0

PHP, 80 byte

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

lấy đầu vào từ STDIN; chạy với -R.

phiên bản thưởng, 97 110 byte -> 93,5 điểm

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

in ASCII 10 và 32 đến 126 (dòng mới và bản in)


sự cố, TiO và nếu có thể, một số môn đánh gôn sẽ theo sau; Tôi mệt mỏi ngay bây giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.