ข้อความที่ทำให้งงงวยโดยการขี่ตัวเลขที่ประกอบไปด้วยหลัก


28

เป้าหมายของความท้าทายนี้คือการเขียนฟังก์ชั่น / โปรแกรมที่สั้นที่สุดในการป้อนข้อความเข้ารหัสโดยใช้วิธีการด้านล่างและส่งกลับผลลัพธ์

hello worldเป็นตัวอย่างที่ผมจะใช้สตริง

ขั้นแรกรับข้อความอินพุต

hello world

ประการที่สองแปลงสตริงเป็นไตรภาค (ฐาน 3) ใช้รหัสนี้:

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

...

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

ด้วยกุญแจนี้hello worldกลาย021011102102112222211112122102010เป็นดังที่เห็นด้านล่าง

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

ประการที่สามย้ายตัวเลขแรกไปยังจุดสิ้นสุด

021011102102112222211112122102010
becomes
210111021021122222111121221020100

ประการที่สี่แปลงตัวเลขกลับเป็นสตริงโดยใช้คีย์เดียวกัน

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

สุดท้ายให้ส่งคืนข้อความที่เข้ารหัส

vnhhr nqzgj

นี่คือตัวอย่างข้อความและผลลัพธ์:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

เนื่องจากนี่คือรหัสกอล์ฟรายการที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ อนุญาตให้มีข้อผิดพลาดได้หากตัวอักษรบางตัวไม่ใช่ตัวอักษรตัวพิมพ์เล็กหรือช่องว่าง นี่เป็นความท้าทายครั้งแรกของฉันดังนั้นข้อเสนอแนะใด ๆ จะเป็นประโยชน์มากกว่า

โชคดี!

ลีดเดอร์บอร์ด:

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
โปรดทราบว่านี่เป็นเทคนิคที่ทำให้งงงวยไม่ใช่การเข้ารหัส ไม่มีรหัสการเข้ารหัสที่นี่
John Dvorak

@JanDvorak จะ "cipher" ทำงานหรือไม่
เต่า

เพื่อสร้างความคิดเห็นของ @ JanDvorak ฉันจะอธิบายสิ่งนี้ว่า "การเข้ารหัส" ซึ่งเป็นวิธีมาตรฐานในการแสดงข้อมูลในรูปแบบอื่น (เช่นคุณสามารถแสดงสตริงบิตด้วยการเข้ารหัสเลขฐานสิบหกหรือการเข้ารหัส base64)
apsillers

1
@JanDvorak ตกลง - ฉันจะเรียกROT13 "obfuscation" มากกว่า "encoding" (แม้ว่าจะเป็นไปตามข้อกำหนดทั้งสอง) อาจเป็นชื่อที่แม่นยำที่สุดคือ "Obfuscate text by ... "
apsillers

2
@TheTurtle ความคิดคือการแพ็คตัวละครที่เป็นจำนวนเต็มขนาดใหญ่ ( uint64) 27การใช้อำนาจที่เพิ่มขึ้นของ การกระจัดด้วยตัวเลขหนึ่งหลักนั้นจะเทียบเท่ากับการคูณจำนวนเต็มขนาดใหญ่นี้ด้วย3และการแนะนำของตัวเลขแรกที่ปลายอีกด้านก็จะเป็นการเพิ่ม แต่มีปัญหาแทรกซ้อนเช่นการทิ้ง "อุ้ม" ครั้งล่าสุด (อาจจะผ่านการmodผ่าตัด) และฉันไม่สามารถทำให้มันทำงานได้ไม่กี่ไบต์
หลุยส์เมนโด

คำตอบ:


16

Pyth, 23 22 ไบต์

sXc.<sXz=+GdJ^UK3K1KJG

ลองใช้ออนไลน์: อินพุตปกติ / ชุดทดสอบ

ขอบคุณ @isaacg สำหรับหนึ่งไบต์

คำอธิบาย:

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
เรามีความคิดเดียวกัน ฉันเขียนพอร์ต Pyth ของ CJam ของฉันแล้วเลื่อนลงมาและเห็นคำตอบของคุณ: /
Andrea Biondo

1
คุณสามารถบันทึกไบต์ด้วยการทำงานเพื่อเติมGแทนการใช้เช่นN =+Gd
isaacg

@isaacg ขอบคุณ
Jakube

14

Pyth, 26 ไบต์

J+Gds@LJiR3c.<s.DR9xLJz1 2

ลองออนไลน์ใน Pyth Compiler / Executor: demo | กรณีทดสอบ

ความคิด

สมมติว่าอักขระอินพุตทั้งหมดได้รับการแม็พกับจำนวนเต็มที่ขั้นตอนที่ 2 ระบุไว้แล้ว

สำหรับทุกจำนวน ternary 3 หลักเรามีที่xyz 3 = 9x + 3y + Zส่วน modular ดังนั้นโดย9อัตราผลตอบแทนเชาวน์xและกาก3y + Z

ถ้าใส่เป็นabc 3 def 3 GHI 3การประยุกต์ใช้การแบ่งแบบแยกส่วนแต่ละอัตราผลตอบแทนที่ 3b + C, D, 3e + F, G, 3h + i

หลังจากหมุนรายการจากข้างบนหนึ่งหน่วยไปทางซ้ายเราสามารถจัดกลุ่มจำนวนเต็มเป็นคู่ อัตราผลตอบแทนนี้รายการ(3b + C, D), (3E + F, G), (3h + i, ก)

ตอนนี้ถ้าเราแปลง(3y + Z, W)จากฐาน 3 ถึงจำนวนเต็มเราได้รับ3 (3y + z) + W = 9Y + 3Z + W = zyw 3

ดังนั้นการใช้การแปลงฐานในรายการคู่ทำให้เราได้รับbcd 3 efg 3 hia 3ซึ่งเป็นผลลัพธ์ที่แม่นยำจากการหมุนตัวเลขที่ประกอบไปด้วยสามส่วนทางด้านซ้าย

สิ่งที่เหลืออยู่ที่ต้องทำคือการจับคู่จำนวนเต็มที่ได้ผลลัพธ์กับตัวอักษร

รหัส

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.

ใช่ในอีกไม่กี่ชั่วโมงฉันก็พ่ายแพ้โดย CJam และ Pyth : /
kirbyfan64sos

ว้าว! คุณสามารถเขียนคำอธิบายว่ามันทำงานอย่างไร? ฉันอยากรู้. :)
เต่า

@TheTurtle ฉันได้แก้ไขคำตอบของฉัน
เดนนิส

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

แปลงอักขระcเป็นค่าxเช่นเดียวx=(ord(c)-97)%91กับที่ modulo ส่งผลต่อพื้นที่ว่างเท่านั้นที่จะแปลงเป็น 26 การแปลงกลับเป็นiไปchr((i-26)%91+32)ได้โดย modulo จะส่งผลต่อi=26การทำให้เป็นช่องว่างเท่านั้น

เราห่วงผ่านตัวอักษรที่สังเกตค่าปัจจุบันและความคุ้มค่าก่อนหน้านี้x yเราใช้ตัวเลขสองหลักสุดท้ายของ ternary yพบเป็นy%9และประกอบไปด้วยหลักแรกของการพบเป็นx มูลค่าของการเรียงต่อกันคือx/9 y%9*3+x/9อาจมีการเพิ่มประสิทธิภาพบางอย่างที่รวมเลขคณิตนี้เข้ากับการเลื่อน97และแก้ไขพื้นที่

เราวนรอบนี้เรากลับไปที่ตัวอักษรตัวแรกของสตริงตอนท้าย นอกจากนี้เรายังทำการเตรียมการวนรอบหนึ่งเพื่อเขียนในค่าก่อนหน้าyซึ่งจะหยุดอักขระสำหรับลูปแรกเมื่อyยังไม่ได้เริ่มต้น


8

CJam, 39 29 ไบต์

สิ่งที่ยอดเยี่ยมเกี่ยวกับอันนี้ก็คือมันไม่ได้ใช้การแปลงฐาน

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

ลองมันออนไลน์

ฉันเพิ่งรู้ว่าฉันมีความคิดเดียวกันกับคำตอบ Pyth ของ Jakube จริงๆแล้วฉันส่งรหัส CJam นี้ไปยัง Pyth ก่อนที่จะเห็นโพสต์ของเขาซึ่งลงท้ายด้วย 25 ไบต์ เนื่องจากมันเป็นสนามกอล์ฟ Pyth แรกของฉันฉันคิดว่ามันไม่ได้แย่เกินไป

คำอธิบาย

                              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 bytes

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

ลองใช้ออนไลน์ในล่าม CJam

วิธีนี้เหมือนกับในคำตอบอื่น ๆ ของฉันซึ่งเป็นพอร์ตของรหัสนี้ไปยัง Pyth

มันทำงานอย่างไร

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 ไบต์

หนึ่งซับ!

" vรางวัลตัวแปรแปรปรวนมากเกินไปใคร?"

อัปเดต: ตอนนี้เพียงใช้ตัวแปรที่เรียกว่าvสำหรับความสับสนรวม!

ขอบคุณ @vihan สำหรับการบันทึก 6 ไบต์!

ขอบคุณ @Neil สำหรับการบันทึก 27 ไบต์ !!

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

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ วิธีใช้เพิ่มv=รหัสก่อนตั้งชื่อฟังก์ชั่นแล้วเรียกมันว่าต้องการalert(v("hello world"))


คุณสามารถใช้.slice(-3)เพื่อบันทึก 6 ไบต์ ณ จุดที่คุณสามารถใช้"00"+vเพื่อบันทึกไบต์อื่น (คุณสามารถต่อกับแม่แบบได้ แต่ความยาวที่ได้จะเท่ากัน)
Neil

ที่จริงแล้วคุณสามารถบันทึกทั้งกลุ่มไบต์โดยเพิ่ม 27 ค่าของคุณก่อนที่จะแปลงให้เป็นฐานสามเช่นที่รับประกันตัวเลขที่เพียงพอ แล้วจะกลายเป็น.map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length)) .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
Neil

@ Neil Wow นั่นเป็นรหัสที่สั้นลงจริงๆ! มันทำให้มันเป็น 'หนึ่งซับ' จริงโดยการลบตัวแปรกลางเท่านั้น ขอบคุณ!
ริ

5

Julia, 149 137 ไบต์

กอล์ฟครั้งแรกของฉัน!

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

(บางส่วน) ungolfed:

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

คุณสามารถใช้=แทนinลูปและใช้b[1]แทนb[1:1]ได้ นอกจากนี้คุณยังไม่จำเป็นต้องปิดช่องว่างระหว่าง parens forและ
Alex A.

@AlexA ไชโยสำหรับ=แต่ผลตอบแทนที่เป็นตัวละครที่ไม่สามารถได้รับการผนวกเข้ากับสตริงกับb[1] *
kevinsa5

โอ้ถูกต้องลืมเรื่องนั้น
Alex A.

@AlexA forเคล็ดลับคือดี นอกจากนี้คุณยังสามารถรับมันได้โดยตรงหลังจากปิดการเสนอราคา ฉันไม่ได้ตระหนักถึง parser ที่ยืดหยุ่น
kevinsa5

นอกจากนี้ยังสามารถติดตามตัวอักษรตัวเลขได้โดยตรงเช่น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('{',' ')}

แทนที่ Math.floor ด้วย bitwise หรือ สร้างฟังก์ชั่นที่ไม่ระบุชื่อ ถ้าฉันเข้าใจอย่างถูกต้องสิ่งนี้น่าจะช่วยแก้ปัญหาความไม่สงบของฉันได้บ้าง (ขอบคุณเดนนิส!) แล้วเอาฉันลงมาอีก 2 ไบต์


3

Julia, 169 166 ไบต์

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 +:

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 ไบต์

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

เอ่อนี่มันรู้สึกยาวเกินไป แต่อย่างน้อยฉันก็ ... และทับทิม


3

Javascript (ES6), 141 124 120 ไบต์

เชื่อหรือไม่.... :-)

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

เช่นเดียวกับคำตอบอื่น ๆ ของฉันนี่เป็นฟังก์ชันที่ไม่ระบุตัวตนและจำเป็นต้องกำหนดให้กับตัวแปรก่อนจึงจะสามารถใช้งานได้ ลองที่นี่:

ฉันคิดว่าฉันอาจจะโกนสองสามไบต์จากคำตอบก่อนหน้าของฉันโดยใช้เทคนิคที่แตกต่างกันดังนั้นฉันจึงเริ่มต้นด้วยหนึ่งคล้ายกับของ Tekgno และกอล์ฟหัวของฉันออกจากที่นั่น ฉันเริ่มต้นตัวแปรบางอย่างในส่วนอาร์กิวเมนต์ของฟังก์ชันและยัดทุกอย่างลงใน.mapฟังก์ชันอีกครั้ง จากนั้นฉันก็ตระหนักถึงนอกจะมีประสิทธิภาพมากขึ้นString.fromCharCode .mapหลังจากพูดและทำเสร็จแล้วฉันได้โกนออกไปมากกว่า30 45 ไบต์!

แก้ไข 1:บันทึก 17 ไบต์โดยกำจัด.replaces โดยใช้เทคนิคที่คล้ายคลึงกับโซลูชัน Python ของ xnor

ตกลงอาจถึงเวลาที่จะก้าวสู่ความท้าทายอีกครั้ง ...


2

Python 2, 182 180 Bytes

โซลูชันนี้ไม่เหมาะเนื่องจากการแทนที่มีค่าใช้จ่ายสูงมาก .. พยายามหาวิธีหลีกเลี่ยง

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

"hello world"การป้อนข้อมูลที่เป็นเหมือน


คุณต้องนับ 2 ไบต์สำหรับเครื่องหมายคำพูดที่ต้องการในอินพุตใช่ไหม
mbomb007

@ mbomb007 นั่นคือสิ่งที่ฉันคิดไว้ก่อนหน้านี้ แต่มีหลายคนบอกว่าฉันไม่จำเป็นต้องคิดเรื่องนั้น
Kade

2

Mathematica, 162 ไบต์

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

(Re) การใช้ a Ruleเพื่อแปลงรายการหลักเป็นอักขระและย้อนกลับ


2

Javascript (ES6), 179 ไบต์

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

อุปกรณ์ประกอบฉากสำหรับวิหารสำหรับ.matchregex


1

ทับทิม, 177

ต้องการอย่างน้อย Ruby 1.9 สำหรับeach_charวิธีการ

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 ไบต์

มันทำให้ฉันเศร้าเล็กน้อยในการพิจารณาว่าฉันสามารถโกน 10 ไบต์โดยไม่ใช้ Java 8 สตรีมและmap()วิธีการ

นี่คือเวอร์ชั่น golfed:

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

นี่เป็นเวอร์ชั่นที่ตีกอล์ฟน้อยกว่ามาก มันตั้งใจจะอ่าน แต่ฉันไม่รับประกัน

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

โปรแกรมนี้ใช้สตริงเพื่อแปลงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง หากคุณต้องการมีช่องว่างในอินพุตของคุณคุณต้องล้อมรอบด้วยเครื่องหมายคำพูดคู่

ฉันต้องการให้ตัวอย่างของการใช้สิ่งนี้จากบรรทัดคำสั่ง แต่ฉันไม่สามารถรับรหัสนี้เพื่อทำงานนอก Eclipse ฉันไม่เคยเรียนรู้การใช้ Java จากบรรทัดคำสั่ง ^ _ ^; คุณอาจเรียกใช้การทำงานนี้ภายใน IDE ที่คุณเลือกโดยไม่มีปัญหามากเกินไป


หากคุณใช้ ArrayUtils เพียงครั้งเดียวโดยใช้ชื่อที่มีคุณสมบัติครบถ้วนภายในรหัสนั้นจะสั้นกว่าคำสั่งการนำเข้านั้น ดู: codegolf.stackexchange.com/a/16100/10801 (ครึ่งล่างของคำตอบที่เชื่อมโยง)
masterX244

1

Javascript (ES6), 181 180 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อดังนั้นจึงจำเป็นต้องได้รับชื่อก่อนจึงจะสามารถใช้งานได้ (เช่นencrypt=t=>...) ลองที่นี่:

ฉันเริ่มจากการใช้ตัวแปรหลายตัวและforวน.mapซ้ำแทน จากนั้นฉันเล่นกอล์ฟด้วยวิธีที่เป็นไปได้โดยไม่ต้องเปลี่ยนอัลกอริธึมซึ่งทำให้ฉันอยู่ที่ใดประมาณ 217 ไบต์ หลังจากดูที่คำตอบของคำจำกัดความของฟังก์ชัน UndefinedFunction ฉันจัดการลงไปจนถึงปี 195 และการตรวจสอบคำตอบของ Dendrobium ทำให้เกิดการเล่นกอล์ฟอีก 14 ครั้ง

เท่าที่ฉันทราบฉันไม่สามารถไปได้ไกลกว่านี้หรือผลลัพธ์ของฉันจะเหมือนกับของ Dendrobium (ยกเว้นการที่ตัวละครตัวหนึ่งสั้นกว่า!) มีใครบ้างที่สามารถค้นพบสถานที่ที่ฉันบันทึกไว้ได้ :-)

ตามปกติข้อเสนอแนะยินดีต้อนรับอย่างยินดี!


ขอบคุณสำหรับเคล็ดลับ regex! ฉันไม่แน่ใจว่าวิธี for-of loop สามารถทำงานในฟังก์ชั่นหนึ่งบรรทัดนี้ได้อย่างไร แต่บางทีมันอาจช่วยประหยัดพื้นที่ได้บ้าง คุณสามารถโพสต์เวอร์ชั่นของคุณได้ถ้าต้องการ
ETHproductions

0

Matlab, 113 ไบต์

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

การป้อนข้อมูลผ่าน stdin

ตัวอย่าง:

>> 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 ไบต์

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

Ungolfed:

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

เคล็ดลับอาจทำให้คุณสับสน การลบ 6 ย้าย 'a' ลงไปที่ศูนย์หลังจากตัวดัดแปลง การเพิ่ม 9 * 65 นั้นเทียบเท่ากับการเพิ่ม 65 ถึง v1 + v2 ซึ่งเป็นส่วนหนึ่งของกระบวนการเรียกคืนค่าเป็นค่า ascii คุณสามารถแทนที่i=t%91+579ด้วยi=t%91-6แล้วแทนที่N=(v1+v2)%91+32ด้วยN=(v1+v2+65)%91+32เพื่อให้ได้ผลลัพธ์เดียวกัน แต่ต้องใช้อักขระพิเศษหนึ่งตัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.