Văn bản xáo trộn bằng cách đi xe đạp chữ số ternary


28

Mục tiêu của thử thách này là viết hàm / chương trình ngắn nhất để lấy văn bản đầu vào, mã hóa nó bằng phương thức bên dưới và trả về kết quả.

Ví dụ, tôi sẽ sử dụng chuỗi hello world.

Đầu tiên , có được văn bản đầu vào.

hello world

Thứ hai , chuyển đổi chuỗi thành ternary (cơ sở 3). Sử dụng khóa này:

a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020

...

w = 211
x = 212
y = 220
z = 221
[space] = 222

Với chìa khóa này, hello worldtrở thành 021011102102112222211112122102010, như được thấy dưới đây.

 h   e   l   l   o       w   o   r   l   d
021 011 102 102 112 222 211 112 122 102 010

Thứ ba , di chuyển chữ số đầu tiên đến cuối.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Thứ tư , chuyển đổi số trở lại thành một chuỗi bằng cùng một khóa.

210 111 021 021 122 222 111 121 221 020 100
 v   n   h   h   r       n   q   z   g   j

Cuối cùng , trả lại văn bản được mã hóa.

vnhhr nqzgj

Dưới đây là một số văn bản mẫu và đầu ra của chúng:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Vì đây là mã golf, mục nhập ngắn nhất trong byte sẽ thắng. Lỗi được phép nếu một số ký tự không phải là chữ thường hoặc dấu cách. Đây là thử thách đầu tiên của tôi, vì vậy mọi đề xuất sẽ hữu ích hơn.

Chúc may mắn!

Bảng xếp hạng:

var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:&lt;(?:s&gt;[^&]*&lt;\/s&gt;|[^&]+&gt;)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>


3
Lưu ý rằng về mặt kỹ thuật này là obfuscation, không mã hóa. Không có khóa mã hóa ở đây.
John Dvorak

@JanDvorak "mật mã" có hoạt động không?
Rùa

Để xây dựng dựa trên nhận xét của @ JanDvorak, tôi sẽ mô tả đây là "mã hóa", đây là một cách tiêu chuẩn để thể hiện dữ liệu theo một định dạng khác (ví dụ: bạn có thể biểu thị một chuỗi bit bằng mã hóa thập lục phân hoặc mã hóa base64).
apsillers

1
@JanDvorak Đồng ý - Tôi có nhiều khả năng gọi ROT13 là "obfuscation" hơn là "mã hóa" (mặc dù nó thỏa mãn cả hai định nghĩa). Có lẽ tiêu đề chính xác nhất sẽ là "Obfuscate text by ..."
apsillers 14/08/2015

2
@TheTurtle Ý tưởng là đóng gói các ký tự thành một số nguyên lớn ( uint64) bằng cách tăng sức mạnh của 27. Sự dịch chuyển theo một chữ số sau đó sẽ tương đương với nhân số nguyên lớn này với 3, và việc giới thiệu chữ số đầu tiên ở đầu kia chỉ đơn giản là một phép cộng. Nhưng có những điều phức tạp, chẳng hạn như loại bỏ "lần mang" cuối cùng (có lẽ thông qua một modthao tác) và tôi không thể làm cho nó hoạt động với vài byte
Luis Mendo

Câu trả lời:


16

Bình thường, 23 22 byte

sXc.<sXz=+GdJ^UK3K1KJG

Dùng thử trực tuyến: Bộ kiểm tra đầu vào / kiểm tra thường xuyên

Cảm ơn @isaacg cho một byte.

Giải trình:

sXc.<sXz=+GdJ^UK3K1KJG
        =+Gd             append a space the G (preinitialized with the alphabet)
               K3        assign 3 to K
            J^UK K       assign all 3-digit ternary numbers 
                         [[0,0,0], [0,0,1],...,[2,2,2]] to J
      Xz  G J            translate input from G to J
     s                   sum (join all ternary numbers to one big list)
   .<             1      rotate by 1
  c                K     split into lists of size 3
 X                  JG   translate from J to G
s                        join chars to string and print

1
Chúng tôi đã có cùng một ý tưởng. Tôi đã viết một cổng Pyth của CJam của tôi, sau đó cuộn xuống và thấy câu trả lời của bạn: /
Andrea Biondo

1
Bạn có thể lưu một byte bằng cách thực hiện một phép gán tăng lên Gthay vì sử dụng N, vd =+Gd.
isaacg

@isaacg cảm ơn.
Jakube

14

Bình thường, 26 byte

J+Gds@LJiR3c.<s.DR9xLJz1 2

Dùng thử trực tuyến trong Trình biên dịch / Thực thi Pyth: demo | trường hợp kiểm tra

Ý kiến

Giả sử tất cả các ký tự đầu vào đã được ánh xạ tới các số nguyên mà bước 2 chỉ định.

Với mỗi số thứ tự 3 chữ số, chúng ta có xyz 3 = 9x + 3y + z , do đó, việc chia mô-đun cho 9 mang lại thương số x và dư lượng 3y + z .

Nếu đầu vào là abc 3 def 3 ghi 3 , áp dụng phân chia mô-đun cho mỗi sản lượng a, 3b + c, d, 3e + f, g, 3h + i .

Sau khi xoay danh sách từ phía trên một đơn vị sang trái, chúng ta có thể nhóm các số nguyên thành cặp. Điều này mang lại danh sách (3b + c, d), (3e + f, g), (3h + i, a) .

Bây giờ, nếu chúng ta chuyển đổi (3y + z, w) từ cơ sở 3 sang số nguyên, chúng ta thu được 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Như vậy, áp dụng chuyển đổi cơ sở vào danh sách các cặp cho chúng ta BCD 3 EFG 3 hia 3 , đó chính là kết quả của sự xoay nối ternary chữ số một đơn vị bên trái.

Tất cả những gì còn lại phải làm là ánh xạ các số nguyên kết quả trở lại thành các ký tự.

J+Gd                        Concatenate "a...z" (G) with " " (d) and save in J.
                    L z     For each character in the input(z):
                   x J        Compute its index in J.
                 R          For each index I:
               .D 9           Compute (I / 9, I % 9).
              s             Concatenate the resulting pairs.
            .<         1    Rotate the resulting list one unit to the left.
           c             2  Split it back into pairs.
         R                  For each pair:
        i 3                   Perform conversion from base 3 to integer.
      L                     For each resulting integer:
     @ J                      Select the element of J at that index.
    s                       Concatenate the resulting characters.

Yeesh, trong vài giờ tôi đã bị đánh bại bởi CJam và Pyth. : /
kirbyfan64sos

Ồ Bạn có thể viết một lời giải thích về cách nó hoạt động? Tôi tò mò. :)
Rùa

@TheTurtle Tôi đã chỉnh sửa câu trả lời của mình.
Dennis

10

Con trăn 2, 96

s=input()
r=y=''
for c in s+s[0]:x=(ord(c)-97)%91;r+=y and chr((y%9*3+x/9-26)%91+32);y=x
print r

Chuyển đổi một nhân vật cđến một giá trị xnhư x=(ord(c)-97)%91, với modulo chỉ ảnh hưởng đến không gian để chuyển nó sang 26. Việc quy đổi ngược lại là iđể chr((i-26)%91+32), với modulo chỉ ảnh hưởng i=26để làm cho nó trở thành không gian.

Chúng tôi lặp qua các ký tự, lưu ý giá trị hiện tại xvà giá trị trước đó y. Chúng tôi sử dụng hai chữ số thứ ba cuối cùng của y, được tìm thấy y%9và, chữ số thứ ba đầu tiên của x, được tìm thấy là x/9. Giá trị của phép nối là y%9*3+x/9. Có lẽ có một số tối ưu hóa kết hợp số học này với sự dịch chuyển 97và sửa chữa không gian.

Chúng tôi thực hiện vòng lặp này, chúng tôi trở lại ký tự đầu tiên của chuỗi ở cuối. Chúng tôi cũng thực hiện một vòng lặp chuẩn bị để viết một giá trị trước đó y, loại bỏ ký tự cho vòng lặp đầu tiên khi ychưa được khởi tạo.


8

CJam, 39 29 byte

Điều thú vị về điều này là nó thậm chí không sử dụng chuyển đổi cơ sở.

q'{,97>S+:XZZm*:Yere_(+3/YXer

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

Tôi mới nhận ra mình có chính xác ý tưởng giống như câu trả lời Pyth của Jakube. Tôi thực sự đã chuyển mã CJam này sang Pyth trước khi xem bài đăng của anh ấy, kết thúc với 25 byte. Cho rằng đó là sân gôn Pyth đầu tiên của tôi, tôi đoán nó không quá tệ.

Giải trình

                              e# Z = 3
q                             e# Push input string
 '{,                          e# Push ['\0' ... 'z']
    97>                       e# Keep ['a' ... 'z']
       S+                     e# Append space
         :X                   e# Assign "a...z " to X
           ZZm*               e# Push 3rd cartesian power of [0 1 2]
                              e# i.e. all 3-digit permutations of 0, 1, 2
                              e# (in lexicographical order)
               :Y             e# Assign those permutations to Y
                 er           e# Translate input from X to Y
                   e_         e# Flatten resulting 2D array
                     (+       e# Rotate first element to the end
                       3/     e# Split back into 3-digit elements
                         YXer e# Translate from Y to X

7

CJam, 30 29 27 byte

q'{,97>S+:Af#9fmd(+2/3fbAf=

Hãy thử trực tuyến trong trình thông dịch CJam .

Cách tiếp cận giống như trong câu trả lời khác của tôi , đó là một cổng của mã này đến Pyth.

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

q                           e# Read from STDIN.
 '{,                        e# Push ['\0' ... 'z'].
    97>                     e# Remove the first 97 elements (['\0' - '`']).
       S+:A                 e# Append a space and save in A.
           f#               e# Find the index of each input character in A.
             9fmd           e# Apply modular division by 9 to each index.
                 (+         e# Shift out the first quotient and append it.
                   2/       e# Split into pairs.
                     3fb    e# Convert each pair from base 3 to integer.
                        Af= e# Select the corresponding elements from A.


6

Javascript (ES6), 175 byte

Một lót!

"Lạm dụng vgiải thưởng biến , có ai không?"

cập nhật: Bây giờ chỉ sử dụng các biến được gọi v, cho sự nhầm lẫn hoàn toàn!

Cảm ơn @vihan vì đã tiết kiệm 6 byte!

Cảm ơn @Neil vì đã tiết kiệm 27 byte !!

v=>(([...v].map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).join``)+v[0]).slice(1).match(/..?.?/g).map(v=>(v=String.fromCharCode(parseInt(v,3)+97))>"z"?" ":v).join``

Xác định một hàm ẩn danh. Để sử dụng, hãy thêm v=trước mã để đặt tên cho hàm và gọi nó như thế nàoalert(v("hello world"))


Bạn có thể sử dụng .slice(-3)để lưu 6 byte, tại thời điểm đó bạn có thể sử dụng "00"+vđể lưu một byte khác. (Bạn có thể ghép nối với một mẫu nhưng độ dài kết quả là như nhau.)
Neil

Trên thực tế, bạn có thể lưu cả đống byte bằng cách thêm 27 vào các giá trị của mình trước khi chuyển đổi chúng thành cơ sở ba, vì điều đó đảm bảo đủ các chữ số. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))sau đó trở thành .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil

@Neil Wow, điều đó thực sự rút ngắn mã! Nó cũng làm cho nó trở thành một 'lớp lót' thực sự, bằng cách loại bỏ biến trung gian duy nhất. Cảm ơn!
jrich

5

Julia, 149 137 byte

Golf đầu tiên của tôi!

s->(j=join;b=j([base(3,i==' '?26:i-'a',3)for i=s]);r=b[2:end]*b[1:1];j([i==26?" ":i+'a'for i=[parseint(r[i:i+2],3)for i=1:3:length(r)]]))

(một phần) vô danh:

f = s -> (
    # join the ternary represenations:
    b = join([base(3, i == ' ' ? 26 : i - 'a',3) for i = s]);
    # rotate:
    r = b[2:end] * b[1:1];
    # calculate the new numbers:
    n = [parseint(r[i:i+2],3) for i = 1:3:length(r)];
    # convert back to characters:
    join([i == 26 ? " " : 'a' + i for i = n])
)
assert(f("hello world") == "vnhhr nqzgj")
assert(f("the turtle")  == "dvo fh ego")
assert(f("python")      == "uudwqn")
assert(f("code golf")   == "hpjoytqgp")

Bạn có thể sử dụng =thay invì vòng lặp và bạn có thể sử dụng b[1]thay thế b[1:1]. Bạn cũng không cần một khoảng trống giữa các parens đóng và for.
Alex A.

@AlexA. Chúc mừng =, nhưng b[1]trả về một ký tự, không thể được thêm vào chuỗi *.
kevinsa5

Oh phải, quên điều đó.
Alex A.

@AlexA. Cácfor Bí quyết là tiện lợi. Bạn cũng có thể có nó trực tiếp sau khi trích dẫn gần. Tôi đã không nhận ra trình phân tích cú pháp là linh hoạt.
kevinsa5

Nó cũng có thể trực tiếp theo một chữ số, như có thể end.
Alex A.

4

Javascript (ES6), 178 , 172 , 170

p=>{p=p.replace(' ','{');c="";l=p.length;for(i=0;i<l;){c+=String.fromCharCode(((p.charCodeAt(i)-97)%9)*3+(((p.charCodeAt((++i)%l)-97)/9)|0)+97)}return c.replace('{',' ')}

Đã thay thế Math.floor bằng bitwise hoặc. Tạo một chức năng ẩn danh. Nếu tôi hiểu chính xác, điều này sẽ khắc phục phần nào sự buồn nôn của tôi (cảm ơn Dennis!) Và giúp tôi giảm thêm 2 byte.


3

Julia, 169 166 byte

s->(J=join;t=J(circshift(split(J([lpad(i<'a'?"222":base(3,int(i)-97),3,0)for i=s]),""),-1));J([c[j:j+2]=="222"?' ':char(parseint(c[j:j+2],3)+97)for j=1:3:length(t)]))

Ungolfed + giải thích:

function f(s::String)
    # Convert the input into a string in base 3, with space mapping to 222
    b = join([lpad(i < 'a' ? "222" : base(3, int(i) - 97), 3, 0) for i = s])

    # Split that into a vector of single digits and shift once
    p = circshift(split(b, ""), -1)

    # Join the shifted array back into a string
    t = join(p)

    # Convert groups of 3 back into characters
    c = [t[j:j+2] == "222" ? ' ' : char(parseint(t[j:j+2], 3) + 97) for j = 1:3:length(t)]

    # Return the joined string
    join(c)
end

3

Haskell, 160 byte

a!k|Just v<-lookup k a=v
x=['a'..'z']++" "
y="012";z=mapM id[y,y,y]
m(a:u:r:i:s)=[u,r,i]:m(a:s)
m[e,a,t]=[[a,t,e]]
main=interact$map(zip z x!).m.(>>=(zip x z!))

Ugh, điều này cảm thấy quá dài, nhưng ít nhất tôi đang ... đánh bại Python bằng cách nào đó. Và Ruby.


3

Javascript (ES6), 141 124 120 byte

Tin hay không.... :-)

(t,i=0,c=w=>(t.charCodeAt(w)-123)%91+26)=>String.fromCharCode(...[...t].map(k=>(c(i)%9*3+c(++i%t.length)/9+65|0)%91+32))

Như với câu trả lời khác của tôi, đây là một hàm ẩn danh và cần được gán cho một biến trước khi có thể sử dụng nó. Hãy thử nó ở đây:

Tôi nghĩ rằng tôi có thể loại bỏ một vài byte khỏi câu trả lời trước đó của mình bằng cách sử dụng một kỹ thuật khác, vì vậy tôi đã bắt đầu với một câu tương tự như của Tekgno và đánh đầu từ đó. Tôi đã khởi tạo một số biến trong phần đối số của hàm và một lần nữa nhồi mọi thứ vào một .maphàm. Sau đó, tôi nhận ra rằng String.fromCharCodesẽ hiệu quả hơn nhiều bên ngoài .map. Sau khi tất cả đã được nói và thực hiện, tôi đã loại bỏ hơn 30 45 byte!

Chỉnh sửa 1: Đã lưu 17 byte bằng cách loại bỏ.replace s, sử dụng một kỹ thuật tương tự như giải pháp Python của xnor.

OK, có lẽ đã đến lúc chuyển sang thử thách khác ....


2

Con trăn 2, 182 180 byte

Giải pháp này không lý tưởng, do việc thay thế rất tốn kém .. Cố gắng tìm ra cách để tránh điều đó.

b=lambda k:k and b(k/3)*10+k%3
s=''.join('%03d'%b(ord(x)-6-91*(x>' '))for x in input())
print`[chr(int((s[1:]+s[0])[i:i+3],3)+97)for i in range(0,len(s),3)]`[2::5].replace('{',' ')

Đầu vào là như thế "hello world".


Bạn cần đếm 2 byte cho dấu ngoặc kép cần thiết trong đầu vào, phải không?
mbomb007

@ mbomb007 Đó là những gì tôi đã nghĩ trước đây, nhưng nhiều người đã nói với tôi rằng tôi không cần phải giải thích điều đó.
Kade

2

Toán học, 162 byte

r=Append[#->IntegerDigits[LetterNumber@#-1,3]~PadLeft~3&/@Alphabet[]," "->{2,2,2}];StringJoin[Partition[RotateLeft[Characters@#/.r//Flatten,1],3]/.(#2->#1&@@@r)]&

(Re) Sử dụng a Ruleđể chuyển đổi danh sách chữ số thành ký tự và ngược lại.


2

Javascript (ES6), 179 byte

s=>[...s+s[0]].map(q=>`00${(q<'a'?26:q.charCodeAt(0)-97).toString(3)}`.slice(-3)).join``.slice(1,-2).match(/..?.?/g).map(q=>q>221?' ':String.fromCharCode(parseInt(q,3)+97)).join``

Đạo cụ để vihan cho .matchregex.


1

Hồng ngọc, 177

Cần ít nhất Ruby 1.9 cho each_charphương thức

l=[*('a'..'z'),' '];n=(0..26).map{|m|m=m.to_s(3).rjust 3,'0'};s='';gets.chomp.each_char{|x|s+=n[l.index x]};puts("#{s[1..-1]}#{s[0]}".scan(/.../).map{|i|i=l[n.index i]}.join '')

1

Java, 458 449 byte

Nó làm tôi hơi buồn khi xác định rằng tôi có thể loại bỏ 10 byte bằng cách không sử dụng các luồng Java 8 và map() phương thức.

Đây là phiên bản chơi gôn:

import org.apache.commons.lang.ArrayUtils;class A{public static void main(String[]a){int b=0;String[] c=new String[27];for(;b<27;++b)c[b]=String.format("%03d",Integer.valueOf(Integer.toString(b,3)));String d=a[0],e="abcdefghijklmnopqrstuvwxyz ",f="",g="";for(b=0;b<d.length();++b)f+=c[e.indexOf(d.substring(b,b+1))];f=f.substring(1)+f.charAt(0);for(b=0;b<f.length();b+=3)g+=e.charAt(ArrayUtils.indexOf(c,f.substring(b,b+3)));System.out.println(g);}}

Đây là một phiên bản ít chơi golf hơn. Nó được dự định để có thể đọc được, nhưng tôi không đảm bảo.

import org.apache.commons.lang.ArrayUtils;
class A {
    public static void main(String[] a) {
        int b=0;
        String[] c = new String[27];
        for (; b < 27; ++b)
            c[b] = String.format("%03d", Integer.valueOf(Integer.toString(b, 3)));
        String
            d = a[0],
            e = "abcdefghijklmnopqrstuvwxyz ",
            f = "",
            g = "";
        for (b = 0; b < d.length(); ++b)
            f += c[e.indexOf(d.substring(b, b + 1))];
        f = f.substring(1) + f.charAt(0);
        for (b = 0; b < f.length(); b += 3)
            g += e.charAt(ArrayUtils.indexOf(c, f.substring(b, b + 3)));
        System.out.println(g);
    }
}

Chương trình này lấy chuỗi để chuyển đổi làm đối số dòng lệnh. Nếu bạn muốn có khoảng trắng trong đầu vào của mình, bạn phải bao quanh nó bằng dấu ngoặc kép.

Tôi muốn cung cấp một ví dụ về việc sử dụng điều này từ dòng lệnh, nhưng tôi không thể làm cho mã này hoạt động bên ngoài Eclipse. Tôi chưa bao giờ học cách sử dụng Java từ dòng lệnh ^ _ ^; Bạn có thể có được điều này chạy bên trong IDE bạn chọn mà không gặp quá nhiều khó khăn.


nếu bạn chỉ sử dụng ArrayUtils một lần bằng cách sử dụng tên đủ điều kiện bên trong mã thì ngắn hơn câu lệnh nhập đó. xem: codegolf.stackexchange.com/a/16100/10801 (nửa dưới của câu trả lời được liên kết)
masterX244

1

Javascript (ES6), 181 180 byte

t=>((x=[...t].map(k=>`00${(k<'!'?26:k.charCodeAt(0)-97).toString(3)}`.slice(-3)).join``).slice(1)+x[0]).match(/.../g).map(j=>j>221?' ':String.fromCharCode(parseInt(j,3)+97)).join``

Đây là một chức năng ẩn danh, vì vậy nó cần được đặt tên trước khi có thể sử dụng. (Ví dụ encrypt=t=>...) Dùng thử tại đây:

Tôi bắt đầu sử dụng nhiều biến và forvòng lặp thay vì.map . Sau đó, tôi đã chơi nó theo mọi cách có thể mà không thay đổi thuật toán, điều này đặt tôi ở đâu đó khoảng 217 byte. Sau khi xem câu trả lời của UndiniteFunction, tôi đã tìm cách hạ nó xuống 195 và một số kiểm tra câu trả lời của Dendrobium đã dẫn đến 14 lần đánh gôn khác.

Theo như tôi biết, tôi không thể tiến xa hơn hoặc kết quả của tôi sẽ thực sự giống hệt với Dendrobium (ngoại trừ việc ngắn hơn một ký tự!). Bất cứ ai có thể tìm thấy nơi tôi đã lưu một char? :-)

Như thường lệ, đề nghị được chào đón!


Cảm ơn các mẹo regex! Tôi không chắc chắn chính xác làm thế nào vòng lặp for có thể được làm việc với chức năng một dòng này, nhưng có lẽ nó sẽ tiết kiệm một số không gian. Bạn có thể đăng phiên bản của bạn nếu bạn thích.
Sản phẩm ETH

0

Matlab, 113 byte

x=dec2base(strrep(input('','s'),' ','{')-97,3)';strrep(char(base2dec(reshape(x([2:end 1]),3,[])',3)+97)','{',' ')

Đầu vào là thông qua stdin.

Thí dụ:

>> x=dec2base(strrep(input('','s'),' ','{')-97,3)';strrep(char(base2dec(reshape(x([2:end 1]),3,[])',3)+97)','{',' ')
hello world
ans =
vnhhr nqzgj

0

Julia - 92 87 61 54 byte

s->join(32+(3(i=[s...]%91+579)%27+i[[2:end,1]]÷9)%91)

Ung dung:

function f(s)
  t=[s...];       # Convert the string into a char array
                      #
  i=t%91+579          # Mod 91 drops the alpha characters to sit just
                      # below space, then 579 is added as a trick,
                      # equivalent to subtracting 6 and adding 9*65
  v1=3i%27            # This shifts the bottom two ternary digits up
                      # and removes the first ternary digit
  v2=i[[2:end,19    # This shifts the first ternary digit down and
                      # removes the bottom two ternary digits. [2:end,1]
                      # rotates the array to put the first value at the end
  N=(v1+v2)%91+32     # this combines the ternary digits, then returns
                      # the values to the correct ASCII values
  j=join(N)           # join the char array back to a string
  return j
end

Bí quyết có thể làm bạn bối rối. Trừ đi 6 lần di chuyển 'a' xuống 0 sau khi mod. Thêm 9 * 65 tương đương với việc thêm 65 vào v1 + v2, đây là một phần của quá trình khôi phục các giá trị cho các giá trị ascii của chúng. Bạn có thể thay thế i=t%91+579bằng i=t%91-6, và sau đó thay thế N=(v1+v2)%91+32bằng N=(v1+v2+65)%91+32để có được kết quả tương tự, nhưng nó yêu cầu thêm một ký tự.

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.