Verschleierung von Text durch Umschalten von ternären Ziffern


28

Ziel dieser Herausforderung ist es, die kürzeste Funktion / das kürzeste Programm zu schreiben, um Eingabetext zu erfassen, ihn mit der folgenden Methode zu verschlüsseln und das Ergebnis zurückzugeben.

Als Beispiel verwende ich die Zeichenfolge hello world.

Holen Sie sich zunächst den Eingabetext.

hello world

Zweitens konvertieren Sie die Zeichenfolge in ternäre (Basis 3). Verwenden Sie diesen Schlüssel:

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

...

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

Mit dieser Taste hello worldwird 021011102102112222211112122102010, wie unten zu sehen.

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

Verschieben Sie drittens die erste Ziffer an das Ende.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Viertens konvertieren Sie die Zahl mit demselben Schlüssel wieder in eine Zeichenfolge.

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

Zuletzt geben Sie den verschlüsselten Text zurück.

vnhhr nqzgj

Hier sind einige Beispieltexte und deren Ausgabe:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Da dies Codegolf ist, gewinnt der kürzeste Eintrag in Bytes . Fehler sind zulässig, wenn einige der Zeichen keine Kleinbuchstaben oder Leerzeichen sind. Dies ist meine erste Herausforderung, daher wären Vorschläge mehr als hilfreich.

Viel Glück!

Bestenliste:

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
Beachten Sie, dass dies technisch gesehen eine Verschleierung und keine Verschlüsselung ist. Hier gibt es keinen Verschlüsselungsschlüssel.
John Dvorak

@JanDvorak Funktioniert "chiffrieren"?
Die Schildkröte

Um auf @ JanDvoraks Kommentar aufzubauen, würde ich dies als "Codierung" bezeichnen, eine Standardmethode zum Ausdrücken von Daten in einem anderen Format (z. B. können Sie eine Bitfolge mit hexadezimaler Codierung oder Base64-Codierung ausdrücken).
Apsillers

1
@JanDvorak Einverstanden - Ich würde ROT13 eher als "Verschleierung" als als "Codierung" bezeichnen (obwohl beide Definitionen erfüllt sind). Der wahrscheinlich genaueste Titel wäre "Obfuscate text by ..."
apsillers

2
@TheTurtle Die Idee war, die Zeichen uint64mit zunehmenden Potenzen von in eine große Ganzzahl ( ) zu packen 27. Die Verschiebung um eine Ziffer würde dann dem Multiplizieren dieser großen ganzen Zahl mit entsprechen 3, und die Einführung der ersten Ziffer am anderen Ende wäre einfach eine Addition. Aber es gibt Komplikationen, wie das Verwerfen des letzten "Carry" (möglicherweise über eine modOperation), und ich konnte es nicht mit wenigen Bytes zum Laufen bringen
Luis Mendo

Antworten:


16

Pyth, 23 22 Bytes

sXc.<sXz=+GdJ^UK3K1KJG

Probieren Sie es online aus: Regular Input / Test Suite

Vielen Dank an @isaacg für ein Byte.

Erläuterung:

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
Wir hatten die gleiche Idee. Ich schrieb eine Pyth-Portierung von meinem CJam, scrollte dann nach unten und sah Ihre Antwort: /
Andrea Biondo

1
Sie können ein Byte speichern, indem Sie eine erweiterte Zuweisung für vornehmen, Ganstatt Nz =+Gd.
isaacg

@isaacg danke.
Jakube,

14

Pyth, 26 Bytes

J+Gds@LJiR3c.<s.DR9xLJz1 2

Versuchen Sie es online im Pyth Compiler / Executor: demo | Testfälle

Idee

Angenommen, alle eingegebenen Zeichen wurden bereits den in Schritt 2 angegebenen Ganzzahlen zugeordnet.

Für jede dreistellige ternäre Zahl gilt xyz 3 = 9x + 3y + z , sodass die modulare Division durch 9 den Quotienten x und den Rest 3y + z ergibt .

Wenn die Eingabe abc 3 def 3 ghi 3 ist , ergibt das Anwenden einer modularen Division auf jedes a, 3b + c, d, 3e + f, g, 3h + i .

Nachdem Sie die Liste um eine Einheit nach links gedreht haben, können Sie die ganzen Zahlen in Paare gruppieren. Dies ergibt die Liste (3b + c, d), (3e + f, g), (3h + i, a) .

Wenn wir nun (3y + z, w) von der Basis 3 in eine ganze Zahl konvertieren , erhalten wir 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Daher von Paaren zu der Liste Basisumwandlung Anwendung gibt uns bcd 3 efg 3 HIA 3 , die zum Drehen der verketteten ternären Ziffern eine Einheit nach links genau das Ergebnis ist.

Sie müssen nur noch die resultierenden Ganzzahlen den Zeichen zuordnen.

Code

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.

Ja, in ein paar Stunden wurde ich von CJam und Pyth geschlagen. : /
kirbyfan64sos

Wow! Können Sie eine Erklärung schreiben, wie es funktioniert? Ich bin neugierig. :)
Die Schildkröte

@TheTurtle Ich habe meine Antwort bearbeitet.
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

Wandelt ein Zeichen cauf einen Wert xals x=(ord(c)-97)%91mit dem Modulo nur Raum beeinflusst es die umgekehrte Umwandlung zu 26 zu konvertieren ist izu chr((i-26)%91+32), mit der Modulo nur beeinflussen i=26, um es Räume worden.

Wir durchlaufen die Zeichen und notieren den aktuellen Wert xund den vorherigen Wert y. Wir verwenden die letzten beiden ternären Ziffern von y, gefunden als y%9und die erste ternäre Ziffer von x, gefunden als x/9. Der Wert der Verkettung ist y%9*3+x/9. Es gibt wahrscheinlich einige Optimierungen, die diese Arithmetik mit dem Verschieben 97und Fixieren des Raums kombinieren .

Wir machen diese Schleife um, wir kehren zum ersten Zeichen der Zeichenkette am Ende zurück. Wir führen auch eine Vorbereitungsschleife durch, um einen vorherigen Wert yeinzuschreiben, wobei das Zeichen für die erste Schleife unterdrückt wird, wenn yes noch nicht initialisiert wurde.


8

CJam, 39 29 Bytes

Das Coole an diesem ist, dass es nicht einmal eine Basiskonvertierung verwendet.

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

Probieren Sie es online aus .

Mir wurde gerade klar, dass ich genau die gleiche Idee hatte wie Jakubes Pyth-Antwort. Ich habe diesen CJam-Code tatsächlich nach Pyth portiert, bevor ich seinen Beitrag gesehen habe, der 25 Bytes umfasst. Da es mein erstes Pyth-Golf war, denke ich, ist es nicht so schlimm.

Erläuterung

                              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=

Probieren Sie es online im CJam-Interpreter aus .

Der Ansatz ist der gleiche wie in meiner anderen Antwort , die ein Port dieses Codes zu Pyth ist.

Wie es funktioniert

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

Ein Einzeiler!

"Überbeanspruchung der variablen vAuszeichnung, jemand?"

Update: Verwendet jetzt nur die genannten Variablen v, für völlige Verwirrung!

Danke @vihan für das Speichern von 6 Bytes!

Danke @Neil für das Speichern von 27 Bytes !!

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

Definiert eine anonyme Funktion. Fügen Sie zur Verwendung v=vor dem Code einen Namen für die Funktion ein und nennen Sie sie wie folgtalert(v("hello world"))


Mit können Sie .slice(-3)6 Bytes speichern. An diesem Punkt können Sie ein "00"+vweiteres Byte speichern. (Sie könnten mit einer Vorlage verketten, aber die resultierende Länge ist die gleiche.)
Neil

Actually, you can save a whole bunch of bytes by adding 27 to your values before converting them to base three, as that guarantees enough digits. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length)) then becomes .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil

@Neil Wow, that really shortened the code! It also made it a true 'one-liner', by removing the only intermediate variable. Thanks!
jrich

5

Julia, 149 137 bytes

My first golf!

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

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

You can use = rather than in for loops and you can use b[1] in place of b[1:1]. You also don't need a space between closing parens and for.
Alex A.

@AlexA. Cheers for =, but b[1] returns a character, which can't be appended to a string with *.
kevinsa5

Oh right, forgot about that.
Alex A.

@AlexA. The for trick is nifty. You can also have it directly after a close quote. I didn't realize the parser was that flexible.
kevinsa5

It can also directly follow a numeric literal, as can 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('{',' ')}

Replaced Math.floor with a bitwise or. Created an anonymous function. If I'm understanding correctly, this should fix my noobishness somewhat (thanks Dennis!) and get me another 2 bytes down.


3

Julia, 169 166 bytes

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

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 bytes

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, this feels way too lengthy, but at least I'm... beating Python somehow. And Ruby.


3

Javascript (ES6), 141 124 120 bytes

Believe it or not.... :-)

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

As with my other answer, this is an anonymous function, and needs to be assigned to a variable before it can be used. Try it here:

I thought I might be able to shave a couple bytes off my previous answer by using a different technique, so I started out with one similar to Tekgno's and golfed my head off from there. I initialized some variables in the function's argument section, and again stuffed everything into a .map function. Then I realized the String.fromCharCode would be much more efficient outside the .map. After all was said and done, I had shaved off more than 30 45 bytes!

Edit 1: 17 Bytes gespart .replace, indem das s mit einer Technik entfernt wurde, die der Python-Lösung von xnor ähnelt.

OK, vielleicht ist es Zeit, sich einer anderen Herausforderung zu stellen ...


2

Python 2, 182 180 Bytes

Diese Lösung ist nicht ideal, da das Ersetzen sehr kostspielig ist. Versuchen Sie herauszufinden, wie Sie dies vermeiden können.

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

Eingabe ist wie "hello world".


Sie müssen 2 Bytes für die erforderlichen Anführungszeichen in der Eingabe zählen, richtig?
mbomb007

@ mbomb007 Das hatte ich mir vorher gedacht, aber mehrere Leute haben mir gesagt, dass ich das nicht erklären muss.
Kade,

2

Mathematica, 162 Bytes

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

(Re) Verwenden von a Rulezum Konvertieren der Ziffernlisten in Zeichen und zurück.


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

Requisiten an Vihan für den .matchRegex.


1

Rubin, 177

Benötigt mindestens Ruby 1.9 für die each_charMethode

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 Bytes

Es hat mich ein wenig traurig gemacht, festzustellen, dass ich 10 Bytes abschneiden kann, wenn ich keine Java 8 - Streams verwende map() Methode verwendete.

Hier ist die Golfversion:

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

Hier ist eine viel weniger golfene Version. Es soll lesbar sein, aber ich gebe keine Garantie.

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

Dieses Programm verwendet die zu konvertierende Zeichenfolge als Befehlszeilenargument. Wenn Ihre Eingabe Leerzeichen enthalten soll, müssen Sie sie in doppelte Anführungszeichen setzen.

Ich wollte ein Beispiel für die Verwendung dieses Befehls über die Befehlszeile bereitstellen, konnte diesen Code jedoch nicht für die Arbeit außerhalb von Eclipse verwenden. Ich habe nie gelernt, Java von der Kommandozeile aus zu benutzen ^ _ ^; Sie können dies wahrscheinlich problemlos in der IDE Ihrer Wahl zum Laufen bringen.


Wenn Sie die ArrayUtils nur einmal verwenden, ist der vollständig qualifizierte Name im Code kürzer als diese import-Anweisung. Siehe: codegolf.stackexchange.com/a/16100/10801 (untere Hälfte der verknüpften Antwort)
masterX244

1

Javascript (ES6), 181 180 Bytes

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

Dies ist eine anonyme Funktion, daher muss ihr ein Name zugewiesen werden, bevor sie verwendet werden kann. (ZB encrypt=t=>...) Probieren Sie es hier aus:

Ich begann mit der Verwendung mehrerer Variablen und forSchleifen anstelle von.map . Ich habe es dann auf jede erdenkliche Weise ausprobiert, ohne den Algorithmus zu ändern, wodurch ich ungefähr 217 Bytes hatte. Nachdem ich mir die Antwort von UndefinedFunction angesehen hatte, schaffte ich es, sie auf 195 zu bringen, und einige Überprüfungen von Dendrobiums Antwort ergaben, dass weitere 14 Golfspieler verloren hatten.

Soweit ich weiß, kann ich nicht weiter gehen, oder mein Ergebnis wäre praktisch identisch mit dem von Dendrobium (außer, dass es ein Zeichen kürzer ist!). Kann jemand den Ort finden, an dem ich ein Zeichen gespeichert habe? :-)

Vorschläge sind wie immer gerne willkommen!


Danke für den Regex-Tipp! Ich bin mir nicht sicher, wie genau die for-of-Schleife in diese einzeilige Funktion eingearbeitet werden könnte, aber vielleicht würde sie trotzdem etwas Platz sparen. Sie können Ihre Version posten, wenn Sie möchten.
ETHproductions

0

Matlab, 113 Bytes

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

Die Eingabe erfolgt über stdin.

Beispiel:

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

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

Der Trick kann Sie verwirren. Das Subtrahieren von 6 verschiebt 'a' nach dem Mod auf Null. Das Hinzufügen von 9 * 65 entspricht dem Hinzufügen von 65 zu v1 + v2, was Teil des Prozesses zum Wiederherstellen der Werte auf ihre ASCII-Werte ist. Sie könnten ersetzen i=t%91+579mit i=t%91-6, und ersetzen Sie dann N=(v1+v2)%91+32mit N=(v1+v2+65)%91+32dem gleichen Ergebnis zu bekommen, aber es erfordert ein zusätzliches Zeichen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.