Teks dikaburkan oleh bersepeda digit terary

28

Tujuan dari tantangan ini adalah menulis fungsi / program terpendek untuk mengambil teks input, mengenkripsinya menggunakan metode di bawah ini, dan mengembalikan hasilnya.

Sebagai contoh, saya akan menggunakan string hello world.

Pertama , dapatkan teks input.

hello world

Kedua , konversikan string menjadi terner (base 3). Gunakan kunci ini:

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

...

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

Dengan kunci ini, hello worldmenjadi 021011102102112222211112122102010, seperti yang terlihat di bawah ini.

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

Ketiga , pindahkan digit pertama ke ujung.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Keempat , ubah nomor kembali menjadi string menggunakan kunci yang sama.

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

Terakhir , kembalikan teks terenkripsi.

vnhhr nqzgj

Berikut ini beberapa contoh teks dan hasilnya:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Karena ini adalah kode golf, entri terpendek dalam byte akan menang. Kesalahan diperbolehkan jika beberapa karakter bukan huruf kecil atau spasi. Ini adalah tantangan pertama saya, jadi saran apa pun akan lebih bermanfaat.

Semoga berhasil!

Papan peringkat:

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>

Kura-kura
sumber
3
Perhatikan bahwa ini secara teknis membingungkan, bukan enkripsi. Tidak ada kunci enkripsi di sini.
John Dvorak
@ JanDvorak Akankah "sandi" bekerja?
The Turtle
Untuk membangun komentar @ JanDvorak, saya akan menggambarkan ini sebagai "pengkodean," yang merupakan cara standar untuk mengekspresikan data dalam format yang berbeda (misalnya, Anda dapat mengekspresikan string bit dengan pengkodean heksadesimal, atau pengkodean base64).
apsillers
1
@ JanDvorak Setuju - Saya akan lebih cenderung menyebut ROT13 "kebingungan" daripada "pengkodean" (meskipun memenuhi kedua definisi). Mungkin judul yang paling tepat adalah "Obfuscate text by ..."
apsillers
2
@TheTurtle Idenya adalah untuk mengemas karakter ke dalam integer besar ( uint64) menggunakan peningkatan kekuatan 27. Perpindahan dengan satu digit kemudian akan sama dengan mengalikan bilangan bulat besar ini dengan 3, dan pengenalan digit pertama di ujung lainnya hanya akan menjadi tambahan. Tetapi ada beberapa komplikasi, seperti membuang "carry" terakhir (mungkin melalui modoperasi), dan saya tidak bisa membuatnya bekerja dengan beberapa byte
Luis Mendo

Jawaban:

16

Pyth, 23 22 byte

sXc.<sXz=+GdJ^UK3K1KJG

Cobalah online: Input Reguler / Test Suite

Berkat @isaacg untuk satu byte.

Penjelasan:

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
Jakube
sumber
1
Kami memiliki ide yang sama. Saya menulis port Pyth CJam saya, lalu menggulir ke bawah dan melihat jawaban Anda: /
Andrea Biondo
1
Anda dapat menyimpan byte dengan melakukan penugasan augmented Gdaripada menggunakan N, misalnya =+Gd.
isaacg
@isaacg terima kasih.
Jakube
14

Pyth, 26 byte

J+Gds@LJiR3c.<s.DR9xLJz1 2

Cobalah online di Pyth Compiler / Executor: demo | uji kasus

Ide

Asumsikan semua karakter input telah dipetakan ke bilangan bulat yang ditentukan langkah 2.

Untuk setiap bilangan terner 3 digit, kita memiliki xyz 3 = 9x + 3y + z , sehingga pembagian modular dengan 9 menghasilkan hasil bagi x dan residu 3y + z .

Jika inputnya abc 3 def 3 ghi 3 , terapkan pembagian modular untuk setiap hasil a, 3b + c, d, 3e + f, g, 3h + i .

Setelah memutar daftar dari atas satu unit ke kiri, kita dapat mengelompokkan bilangan bulat menjadi pasangan. Ini menghasilkan daftar (3b + c, d), (3e + f, g), (3h + i, a) .

Sekarang, jika kita mengonversi (3y + z, w) dari basis 3 ke integer, kita memperoleh 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Dengan demikian, menerapkan konversi basis ke daftar pasangan memberi kita bcd 3 efg 3 hia 3 , yang tepatnya merupakan hasil dari rotasi digit terner gabungan satu unit ke kiri.

Yang tersisa untuk dilakukan adalah memetakan bilangan bulat yang dihasilkan kembali ke karakter.

Kode

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.
Dennis
sumber
Ya, dalam beberapa jam saya dipukuli oleh CJam dan Pyth. : /
kirbyfan64sos
Wow! Bisakah Anda menulis penjelasan tentang cara kerjanya? Saya penasaran. :)
The Turtle
@TheTurtle Saya sudah mengedit jawaban saya.
Dennis
10

Python 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

Mengkonversi karakter cke nilai xsebagai x=(ord(c)-97)%91, dengan modulo hanya mempengaruhi ruang untuk mengubahnya menjadi 26. sebaliknya konversi iuntuk chr((i-26)%91+32), dengan modulo hanya mempengaruhi i=26untuk membuatnya menjadi ruang.

Kami mengulang karakter, mencatat nilai saat ini xdan nilai sebelumnya y. Kami menggunakan dua digit terner terakhir y, ditemukan sebagai y%9, dan digit terner pertama x, ditemukan sebagai x/9. Nilai dari rangkaian adalah y%9*3+x/9. Mungkin ada beberapa optimasi yang menggabungkan aritmatika ini dengan pergeseran oleh 97dan perbaikan ruang.

Kami membuat loop ini, kami kembali ke karakter pertama dari string di akhir. Kami juga melakukan satu loop persiapan untuk menulis di nilai sebelumnya y, menekan karakter untuk loop pertama ketika ybelum diinisialisasi.

Tidak
sumber
8

CJam, 39 29 byte

Yang keren tentang ini adalah ia bahkan tidak menggunakan konversi basis.

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

Cobalah online .

Saya baru menyadari bahwa saya memiliki ide yang persis sama dengan jawaban Pyth Jakube. Saya benar-benar porting kode CJam ini ke Pyth sebelum melihat postingnya, berakhir dengan 25 byte. Mengingat itu adalah golf Pyth pertama saya, saya kira itu tidak terlalu buruk.

Penjelasan

                              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
Andrea Biondo
sumber
7

CJam, 30 29 27 byte

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

Cobalah online di juru bahasa CJam .

Pendekatannya sama dengan jawaban saya yang lain , yang merupakan port dari kode ini ke Pyth.

Bagaimana itu bekerja

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.
Dennis
sumber
6

Pyth, 30 29 byte

K+Gdsm@Kid3c.<sm.[Z3jxKd3z1 3

Disimpan 1 byte berkat @Jakube.

Demo langsung dan uji kasus.

kirbyfan64sos
sumber
6

Javascript (ES6), 175 byte

Satu garis!

"Terlalu sering menggunakan vpenghargaan variabel , ada yang?"

pembaruan: Sekarang hanya menggunakan variabel yang dipanggil v, untuk kebingungan total!

Terima kasih @vihan karena telah menghemat 6 byte!

Terima kasih @Neil untuk menghemat 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``

Menentukan fungsi anonim. Untuk menggunakan, tambahkan v=sebelum kode untuk memberi fungsi nama, dan menyebutnya sepertialert(v("hello world"))

Jrich
sumber
Anda dapat menggunakan .slice(-3)untuk menyimpan 6 byte, pada titik mana Anda dapat menggunakan "00"+vuntuk menyimpan byte lain. (Anda dapat menyatukan dengan templat tetapi panjang yang dihasilkan sama.)
Neil
Sebenarnya, Anda bisa menyimpan sejumlah byte dengan menambahkan 27 ke nilai Anda sebelum mengubahnya menjadi basis tiga, karena itu menjamin angka yang cukup. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))kemudian menjadi .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil
@Neil Wow, itu benar-benar memperpendek kode! Itu juga menjadikannya benar 'satu-liner', dengan menghapus satu-satunya variabel perantara. Terima kasih!
jrich
5

Julia, 149 137 byte

Golf pertamaku!

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

(sebagian) tidak diserang:

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")
kevinsa5
sumber
Anda dapat menggunakan =daripada inuntuk loop dan Anda dapat menggunakan b[1]di tempat b[1:1]. Anda juga tidak perlu jarak antara menutup paren dan for.
Alex A.
@AlexA. Bersorak untuk =, tetapi b[1]mengembalikan karakter, yang tidak dapat ditambahkan ke string dengan *.
kevinsa5
Oh benar, lupakan itu.
Alex A.
@AlexA. The fortrick adalah bagus. Anda juga dapat memilikinya langsung setelah penawaran harga. Saya tidak menyadari parser yang fleksibel.
kevinsa5
Itu juga bisa langsung mengikuti numeric literal, seperti yang bisa 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('{',' ')}

Diganti Math.floor dengan bitwise atau. Membuat fungsi anonim. Jika saya mengerti dengan benar, ini seharusnya sedikit memperbaiki noobishness saya (terima kasih Dennis!) Dan buat saya 2 byte lagi.

Tekgno
sumber
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)]))

Penjelasan + tidak dikumpulkan:

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
Alex A.
sumber
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, ini terasa terlalu panjang, tapi setidaknya aku ... entah bagaimana mengalahkan Python. Dan Ruby.

Lynn
sumber
3

Javascript (ES6), 141 124 120 byte

Percaya atau tidak.... :-)

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

Seperti jawaban saya yang lain, ini adalah fungsi anonim, dan perlu ditugaskan ke variabel sebelum dapat digunakan. Coba di sini:

Saya pikir saya mungkin bisa mencukur beberapa byte dari jawaban saya sebelumnya dengan menggunakan teknik yang berbeda, jadi saya mulai dengan yang mirip dengan Tekgno dan melepaskan kepala saya dari sana. Saya menginisialisasi beberapa variabel di bagian argumen fungsi, dan sekali lagi memasukkan semuanya ke dalam .mapfungsi. Kemudian saya menyadari String.fromCharCodeakan jauh lebih efisien di luar .map. Setelah semua dikatakan dan dilakukan, saya telah mencukur lebih dari 30 45 byte!

Sunting 1: Disimpan 17 byte dengan menyingkirkan .replaces, menggunakan teknik yang mirip dengan solusi Python xnor.

Oke, mungkin sekarang saatnya untuk beralih ke tantangan lain ....

Produksi ETH
sumber
2

Python 2, 182 180 Bytes

Solusi ini tidak ideal, karena penggantiannya menjadi sangat mahal .. Mencoba mencari cara untuk menghindarinya.

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('{',' ')

Inputnya seperti "hello world".

Kade
sumber
Anda perlu menghitung 2 byte untuk tanda kutip yang diperlukan dalam input, kan?
mbomb007
@ mbomb007 Itulah yang saya pikirkan sebelumnya, tetapi banyak orang mengatakan kepada saya bahwa saya tidak perlu menjelaskannya.
Kade
2

Mathematica, 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) Menggunakan a Ruleuntuk mengkonversi daftar digit ke karakter dan kembali.

murphy
sumber
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``

Alat peraga untuk mendukung .matchregex.

Dendrobium
sumber
1

Ruby, 177

Membutuhkan setidaknya Ruby 1.9 untuk each_charmetode ini

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 '')
David Bailey
sumber
1

Jawa, 458 449 byte

Itu membuat saya sedikit sedih untuk menentukan bahwa saya bisa mencukur 10 byte dengan tidak menggunakan Java 8 stream dan map()metode.

Ini adalah versi golfnya:

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

Ini adalah versi yang jauh lebih sedikit golf. Ini dimaksudkan agar dapat dibaca, tetapi saya tidak membuat jaminan.

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

Program ini mengambil string untuk dikonversi sebagai argumen baris perintah. Jika Anda ingin memiliki spasi di input Anda, Anda harus mengelilinginya dengan tanda kutip ganda.

Saya ingin memberikan contoh menggunakan ini dari baris perintah, tetapi saya tidak dapat membuat kode ini bekerja di luar Eclipse. Saya tidak pernah belajar menggunakan Java dari baris perintah ^ _ ^; Anda mungkin dapat menjalankan ini di dalam IDE pilihan Anda tanpa terlalu banyak kesulitan.

sadakatsu
sumber
jika Anda hanya menggunakan ArrayUtils sekali menggunakan nama yang sepenuhnya memenuhi syarat di dalam kode lebih pendek dari pernyataan impor itu. lihat: codegolf.stackexchange.com/a/16100/10801 (bagian bawah dari jawaban terkait)
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``

Ini adalah fungsi anonim, jadi harus diberi nama sebelum dapat digunakan. (Misalnya encrypt=t=>...) Cobalah di sini:

Saya mulai menggunakan beberapa variabel dan forbukan loop .map. Saya kemudian bermain golf dengan segala cara yang mungkin tanpa mengubah algoritma, yang membuat saya sekitar 217 byte. Setelah melihat jawaban UndefinedFunction, saya berhasil menurunkannya menjadi 195, dan beberapa pemeriksaan jawaban Dendrobium menghasilkan 14 pegolf lagi.

Sejauh yang saya ketahui, saya tidak bisa melangkah lebih jauh atau hasil saya akan secara praktis identik dengan Dendrobium (kecuali untuk menjadi satu karakter lebih pendek!). Adakah yang bisa menemukan tempat saya menyimpan satu arang? :-)

Seperti biasa, saran dipersilahkan dengan senang hati!

Produksi ETH
sumber
Terima kasih atas tip regex! Saya tidak yakin bagaimana tepatnya for-of loop dapat bekerja pada fungsi satu-baris ini, tapi mungkin itu akan menghemat ruang. Anda dapat memposting versi Anda jika mau.
ETHproductions
0

Matlab, 113 byte

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

Masukan melalui stdin.

Contoh:

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

Julia - 92 87 61 54 byte

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

Tidak Terkumpul:

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

Triknya mungkin membingungkan Anda. Mengurangkan 6 gerakan 'a' ke nol setelah mod. Menambahkan 9 * 65 sama dengan menambahkan 65 ke v1 + v2, yang merupakan bagian dari proses mengembalikan nilai ke nilai ascii mereka. Anda bisa mengganti i=t%91+579dengan i=t%91-6, dan kemudian mengganti N=(v1+v2)%91+32dengan N=(v1+v2+65)%91+32untuk mendapatkan hasil yang sama, tetapi membutuhkan satu karakter tambahan.

Glen O
sumber