Ukrywanie tekstu za pomocą cyklicznych cyfr trójskładnikowych

28

Celem tego wyzwania jest napisanie najkrótszej funkcji / programu do pobrania tekstu wejściowego, zaszyfrowania go przy użyciu poniższej metody i zwrócenia wyniku.

Jako przykład użyję ciągu hello world.

Najpierw pobierz tekst wejściowy.

hello world

Po drugie , przekształć ciąg w trójskładnikowy (podstawa 3). Użyj tego klucza:

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

...

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

Z tym kluczem hello worldstaje się 021011102102112222211112122102010, jak pokazano poniżej.

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

Po trzecie , przenieś pierwszą cyfrę na koniec.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Po czwarte , przekonwertuj liczbę z powrotem na ciąg za pomocą tego samego klucza.

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

Na koniec zwróć zaszyfrowany tekst.

vnhhr nqzgj

Oto przykładowy tekst i ich wyniki:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Ponieważ jest to kod golfowy, wygrywa najkrótszy wpis w bajtach . Błędy są dozwolone, jeśli niektóre znaki nie są małymi literami lub spacjami. To moje pierwsze wyzwanie, więc wszelkie sugestie byłyby bardziej niż pomocne.

Powodzenia!

Tabela liderów:

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>

Żółw
źródło
3
Pamiętaj, że technicznie jest to zaciemnianie, a nie szyfrowanie. Nie ma tutaj klucza szyfrowania.
John Dvorak,
@JanDvorak Czy „szyfrowanie” będzie działać?
Turtle
Opierając się na komentarzu @ JanDvorak, opisałbym to jako „kodowanie”, które jest standardowym sposobem wyrażania danych w innym formacie (np. Możesz wyrazić ciąg bitów za pomocą kodowania szesnastkowego lub kodowania base64).
apsillers
1
@ JanDvorak zgodził się - bardziej prawdopodobne byłoby, że ROT13 nazwie „zaciemnianie” niż „kodowanie” (mimo że spełnia obie definicje). Prawdopodobnie najbardziej precyzyjnym tytułem byłoby „zaciemnij tekst przez ...”
apsillers
2
@TheTurtle Pomysł polegał na spakowaniu znaków do dużej liczby całkowitej ( uint64) przy użyciu rosnących mocy 27. Przesunięcie o jedną cyfrę byłoby wówczas równoznaczne z pomnożeniem tej dużej liczby całkowitej przez 3, a wprowadzenie pierwszej cyfry na drugim końcu byłoby po prostu dodatkiem. Ale są komplikacje, takie jak odrzucenie ostatniego „przenoszenia” (być może przez modoperację), i nie mogłem zmusić go do pracy z kilkoma bajtami
Luis Mendo

Odpowiedzi:

16

Pyth, 23 22 bajtów

sXc.<sXz=+GdJ^UK3K1KJG

Wypróbuj online: Regular Input / Test Suite

Dzięki @isaacg za jeden bajt.

Wyjaśnienie:

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
źródło
1
Mieliśmy ten sam pomysł. Napisałem port Pyth mojego CJam, a następnie przewinąłem w dół i zobaczyłem twoją odpowiedź: /
Andrea Biondo
1
Możesz zapisać bajt, wykonując zadanie rozszerzone Gzamiast N, np =+Gd.
isaacg
@isaacg dzięki.
Jakube,
14

Pyth, 26 bajtów

J+Gds@LJiR3c.<s.DR9xLJz1 2

Wypróbuj online w Pyth Compiler / Executor: demo | przypadki testowe

Pomysł

Załóżmy, że wszystkie znaki wejściowe zostały już zamapowane na liczby całkowite określone w kroku 2.

Dla każdej 3-cyfrowej liczby trójskładnikowej mamy xyz 3 = 9x + 3y + z , więc modułowy podział przez 9 daje iloraz x i resztę 3y + z .

Jeśli dane wejściowe to abc 3 def 3 ghi 3 , zastosowanie podziału modułowego na każde daje a, 3b + c, d, 3e + f, g, 3h + i .

Po obróceniu listy z góry o jedną jednostkę w lewo możemy pogrupować liczby całkowite w pary. Daje to listę (3b + c, d), (3e + f, g), (3h + i, a) .

Teraz, jeśli przeliczymy (3y + z, w) z podstawy 3 na liczbę całkowitą, otrzymamy 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Zatem zastosowanie konwersji podstawowej do listy par daje nam bcd 3 efg 3 hia 3 , co jest dokładnie wynikiem obrócenia połączonych cyfr trójskładnikowych o jedną jednostkę w lewo.

Pozostało tylko zmapować wynikowe liczby całkowite z powrotem na znaki.

Kod

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
źródło
Tak, za kilka godzin zostałem pobity przez CJama i Pytha. : /
kirbyfan64sos
Łał! Czy możesz napisać wyjaśnienie, jak to działa? Jestem ciekawy. :)
The Turtle,
@ TheTurtle Zredagowałem swoją odpowiedź.
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

Konwertuje znak cna wartość xtak x=(ord(c)-97)%91, że modulo wpływa tylko na spację, aby go przekonwertować na 26. Odwrotna konwersja polega ina tym chr((i-26)%91+32), że modulo wpływa tylko na i=26to, że staje się spacjami.

Przewijamy znaki, zwracając uwagę na bieżącą xi poprzednią wartość y. Używamy dwóch ostatnich cyfr trójskładnikowych y, znalezionych jako y%9i pierwszej cyfry trójskładnikowej x, znalezionych jako x/9. Wartość konkatenacji wynosi y%9*3+x/9. Prawdopodobnie istnieją pewne optymalizacje łączące tę arytmetykę z przesuwaniem 97i ustalaniem przestrzeni.

Wykonujemy tę pętlę, wracamy do pierwszego znaku ciągu na końcu. Wykonujemy również jedną pętlę przygotowawczą, aby zapisać poprzednią wartość y, tłumiąc znak dla pierwszej pętli, gdy ynie została jeszcze zainicjowana.

xnor
źródło
8

CJam, 39 29 bajtów

Fajną rzeczą w tym jest to, że nawet nie korzysta z konwersji podstawowej.

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

Wypróbuj online .

Właśnie zdałem sobie sprawę, że mam dokładnie taki sam pomysł jak odpowiedź Pyth Jakube. Właściwie przeniosłem ten kod CJam do Pytha, zanim zobaczyłem jego post, co skończyło się na 25 bajtach. Biorąc pod uwagę, że był to mój pierwszy golf w Pythonie, chyba nie jest tak źle.

Wyjaśnienie

                              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
źródło
7

CJam, 30 29 27 bajtów

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

Wypróbuj online w interpretatorze CJam .

Podejście jest takie samo jak w mojej innej odpowiedzi , która jest portem tego kodu do Pytha.

Jak to działa

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
źródło
6

JavaScript (ES6), 175 bajtów

Jednowarstwowy!

„Czy vktoś nadużywa zmiennej nagrody?”

aktualizacja: Teraz używa tylko wywoływanych zmiennych v, dla całkowitego zamieszania!

Dzięki @vihan za uratowanie 6 bajtów!

Dzięki @Neil za uratowanie 27 bajtów !!

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

Definiuje anonimową funkcję. Aby użyć, dodaj v=przed kodem, aby nadać funkcji nazwę i nazwij ją jakalert(v("hello world"))

jrich
źródło
Możesz użyć, .slice(-3)aby zapisać 6 bajtów, w tym momencie możesz użyć, "00"+vaby zapisać kolejny bajt. (Można połączyć z szablonem, ale wynikowa długość jest taka sama.)
Neil
W rzeczywistości możesz zaoszczędzić całą masę bajtów, dodając 27 do swoich wartości przed przekształceniem ich w trzy podstawowe, ponieważ gwarantuje to wystarczającą liczbę cyfr. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))wtedy staje się .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil
@Neil Wow, to naprawdę skróciło kod! Dzięki temu stała się prawdziwą „linią jednowarstwową”, usuwając jedyną zmienną pośrednią. Dzięki!
jrich
5

Julia, 149 137 bajtów

Mój pierwszy 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)]]))

(częściowo) bez golfa:

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
źródło
Możesz używać =zamiast inpętli i możesz używać b[1]zamiast b[1:1]. Nie potrzebujesz również odstępu między zamykającymi parens a for.
Alex A.,
@AlexA. Kibicuje =, ale b[1]zwraca znak, którego nie można dołączyć do ciągu *.
kevinsa5,
No tak, zapomniałem o tym.
Alex A.,
@AlexA. forSztuką jest ładne. Możesz go również otrzymać bezpośrednio po zamknięciu oferty. Nie zdawałem sobie sprawy, że parser był tak elastyczny.
kevinsa5,
Może również bezpośrednio podążać za literałem numerycznym, tak jak może 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('{',' ')}

Zamieniono Math.floor na bitwise lub. Utworzono anonimową funkcję. Jeśli dobrze rozumiem, powinno to nieco poprawić moją noobizm (dzięki Dennis!) I uzyskać kolejne 2 bajty.

Tekgno
źródło
3

Julia, 169 166 bajtów

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

Niegolfowane + wyjaśnienie:

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.
źródło
3

Haskell, 160 bajtów

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, wydaje się to zbyt długie, ale przynajmniej ... jakoś pokonuję Pythona. I Ruby.

Lynn
źródło
3

JavaScript (ES6), 141 124 120 bajtów

Uwierz lub nie.... :-)

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

Podobnie jak w przypadku mojej innej odpowiedzi, jest to funkcja anonimowa i należy ją przypisać do zmiennej, zanim będzie można jej użyć. Wypróbuj tutaj:

Pomyślałem, że uda mi się ogolić kilka bajtów z mojej poprzedniej odpowiedzi, używając innej techniki, więc zacząłem od jednego podobnego do Tekgno i stamtąd zacząłem grać w golfa. Zainicjowałem niektóre zmienne w sekcji argumentów funkcji i ponownie upchnąłem wszystko do .mapfunkcji. Potem zdałem sobie sprawę, że String.fromCharCodebyłoby znacznie bardziej wydajne poza .map. Po tym, jak wszystko zostało powiedziane i zrobione, ogoliłem ponad 30 45 bajtów!

Edycja 1: Zaoszczędzono 17 bajtów, pozbywając się .replaces, stosując technikę podobną do rozwiązania xnor w języku Python.

OK, może czas przejść do kolejnego wyzwania ...

ETHprodukcje
źródło
2

Python 2, 182 180 bajtów

To rozwiązanie nie jest idealne, ponieważ wymiana jest bardzo kosztowna. Próbuję dowiedzieć się, jak tego uniknąć.

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

Dane wejściowe są jak "hello world".

Kade
źródło
Musisz policzyć 2 bajty dla wymaganych znaków cudzysłowu na wejściu, prawda?
mbomb007,
@ mbomb007 Tak myślałem wcześniej, ale wiele osób powiedziało mi, że nie muszę tego rozliczać.
Kade,
2

Mathematica, 162 bajty

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

(Re) Użycie a Ruledo konwersji list cyfr na znaki iz powrotem.

murphy
źródło
2

JavaScript (ES6), 179 bajtów

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

Rekwizyty do vihan dla .matchwyrażenia regularnego.

Dendrobium
źródło
1

Ruby, 177

Potrzebuje co najmniej Ruby 1.9 dla tej each_charmetody

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
źródło
1

Java, 458 449 bajtów

Trochę mnie zasmuciło stwierdzenie, że mogę ogolić 10 bajtów, nie używając strumieni Java 8 i tej map()metody.

Oto wersja golfowa:

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

Oto wersja znacznie mniej golfowa. Ma być czytelny, ale nie daje żadnych gwarancji.

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

Ten program pobiera ciąg do przekonwertowania jako argument wiersza polecenia. Jeśli chcesz mieć spacje na wejściu, musisz otoczyć je podwójnymi cudzysłowami.

Chciałem podać przykład użycia tego z wiersza poleceń, ale nie byłem w stanie zmusić tego kodu do działania poza Eclipse. Nigdy nie nauczyłem się używać Java z wiersza poleceń ^ _ ^; Prawdopodobnie możesz uruchomić to w wybranym IDE bez większych problemów.

sadakatsu
źródło
jeśli użyjesz ArrayUtils tylko raz, używając w pełni kwalifikowanej nazwy w kodzie, jest on krótszy niż ta instrukcja importu. patrz: codegolf.stackexchange.com/a/16100/10801 (dolna połowa połączonej odpowiedzi)
masterX244
1

JavaScript (ES6), 181 180 bajtów

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

Jest to anonimowa funkcja, dlatego przed użyciem należy ją nazwać. (Np. encrypt=t=>...) Wypróbuj tutaj:

Zacząłem od używania wielu zmiennych i forpętli zamiast .map. Następnie grałem w golfa na wszystkie możliwe sposoby, nie zmieniając algorytmu, co dało mi około 217 bajtów. Po przyjrzeniu się odpowiedzi UndefinedFunction udało mi się sprowadzić ją do 195, a niektóre sprawdzenie odpowiedzi Dendrobium zaowocowało kolejnymi 14 golfami.

O ile mi wiadomo, nie mogę iść dalej lub mój wynik byłby praktycznie identyczny z wynikiem Dendrobium (z wyjątkiem tego, że byłam o jedną postać krótsza!). Czy ktoś może znaleźć miejsce, w którym uratowałem jednego chara? :-)

Jak zwykle sugestie są mile widziane!

ETHprodukcje
źródło
Dzięki za wskazówkę wyrażenia regularnego! Nie jestem pewien, jak dokładnie można zastosować pętlę for-of w tej funkcji jednowierszowej, ale może i tak zaoszczędziłoby trochę miejsca. Możesz opublikować swoją wersję, jeśli chcesz.
ETHproductions
0

Matlab, 113 bajtów

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

Wejście odbywa się poprzez standardowe wejście.

Przykład:

>> 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
źródło
0

Julia - 92 87 61 54 bajtów

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

Nie golfowany:

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

Sztuczka może Cię pomylić. Odejmowanie 6 ruchów „a” do zera po modyfikacji. Dodanie 9 * 65 jest równoważne dodaniu 65 do v1 + v2, co jest częścią procesu przywracania wartości do ich wartości ascii. Można wymienić i=t%91+579z i=t%91-6, a następnie zastąpić N=(v1+v2)%91+32z N=(v1+v2+65)%91+32aby uzyskać ten sam efekt, ale wymaga to jeden dodatkowy znak.

Glen O
źródło