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 world
staje 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&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\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>
uint64
) przy użyciu rosnących mocy27
. Przesunięcie o jedną cyfrę byłoby wówczas równoznaczne z pomnożeniem tej dużej liczby całkowitej przez3
, a wprowadzenie pierwszej cyfry na drugim końcu byłoby po prostu dodatkiem. Ale są komplikacje, takie jak odrzucenie ostatniego „przenoszenia” (być może przezmod
operację), i nie mogłem zmusić go do pracy z kilkoma bajtamiOdpowiedzi:
Pyth,
2322 bajtówWypróbuj online: Regular Input / Test Suite
Dzięki @isaacg za jeden bajt.
Wyjaśnienie:
źródło
G
zamiastN
, np=+Gd
.Pyth, 26 bajtów
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
źródło
Python 2, 96
Konwertuje znak
c
na wartośćx
takx=(ord(c)-97)%91
, że modulo wpływa tylko na spację, aby go przekonwertować na 26. Odwrotna konwersja polegai
na tymchr((i-26)%91+32)
, że modulo wpływa tylko nai=26
to, że staje się spacjami.Przewijamy znaki, zwracając uwagę na bieżącą
x
i poprzednią wartośćy
. Używamy dwóch ostatnich cyfr trójskładnikowychy
, znalezionych jakoy%9
i pierwszej cyfry trójskładnikowejx
, znalezionych jakox/9
. Wartość konkatenacji wynosiy%9*3+x/9
. Prawdopodobnie istnieją pewne optymalizacje łączące tę arytmetykę z przesuwaniem97
i 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, gdyy
nie została jeszcze zainicjowana.źródło
CJam,
3929 bajtówFajną rzeczą w tym jest to, że nawet nie korzysta z konwersji podstawowej.
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
źródło
CJam,
302927 bajtówWypró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
źródło
Pyth,
3029 bajtówZaoszczędzono 1 bajt dzięki @Jakube.
Prezentacje na żywo i przypadki testowe.
źródło
JavaScript (ES6), 175 bajtów
Jednowarstwowy!
„Czy
v
ktoś 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 !!
Definiuje anonimową funkcję. Aby użyć, dodaj
v=
przed kodem, aby nadać funkcji nazwę i nazwij ją jakalert(v("hello world"))
źródło
.slice(-3)
aby zapisać 6 bajtów, w tym momencie możesz użyć,"00"+v
aby zapisać kolejny bajt. (Można połączyć z szablonem, ale wynikowa długość jest taka sama.).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))
.Julia,
149137 bajtówMój pierwszy golf!
(częściowo) bez golfa:
źródło
=
zamiastin
pętli i możesz używaćb[1]
zamiastb[1:1]
. Nie potrzebujesz również odstępu między zamykającymi parens afor
.=
, aleb[1]
zwraca znak, którego nie można dołączyć do ciągu*
.for
Sztuką jest ładne. Możesz go również otrzymać bezpośrednio po zamknięciu oferty. Nie zdawałem sobie sprawy, że parser był tak elastyczny.end
.JavaScript (ES6),
178,172, 170Zamieniono 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.
źródło
Julia,
169166 bajtówNiegolfowane + wyjaśnienie:
źródło
Haskell, 160 bajtów
Ugh, wydaje się to zbyt długie, ale przynajmniej ... jakoś pokonuję Pythona. I Ruby.
źródło
JavaScript (ES6),
141124120 bajtówUwierz lub nie.... :-)
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:
Pokaż fragment kodu
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
.map
funkcji. Potem zdałem sobie sprawę, żeString.fromCharCode
byłoby znacznie bardziej wydajne poza.map
. Po tym, jak wszystko zostało powiedziane i zrobione, ogoliłem ponad3045 bajtów!Edycja 1: Zaoszczędzono 17 bajtów, pozbywając się
.replace
s, stosując technikę podobną do rozwiązania xnor w języku Python.OK, może czas przejść do kolejnego wyzwania ...
źródło
Python 2,
182180 bajtówTo rozwiązanie nie jest idealne, ponieważ wymiana jest bardzo kosztowna. Próbuję dowiedzieć się, jak tego uniknąć.
Dane wejściowe są jak
"hello world"
.źródło
Mathematica, 162 bajty
(Re) Użycie a
Rule
do konwersji list cyfr na znaki iz powrotem.źródło
JavaScript (ES6), 179 bajtów
Rekwizyty do vihan dla
.match
wyrażenia regularnego.źródło
Ruby, 177
Potrzebuje co najmniej Ruby 1.9 dla tej
each_char
metodyźródło
Java,
458449 bajtówTrochę mnie zasmuciło stwierdzenie, że mogę ogolić 10 bajtów, nie używając strumieni Java 8 i tej
map()
metody.Oto wersja golfowa:
Oto wersja znacznie mniej golfowa. Ma być czytelny, ale nie daje żadnych gwarancji.
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.
źródło
JavaScript (ES6),
181180 bajtówJest to anonimowa funkcja, dlatego przed użyciem należy ją nazwać. (Np.
encrypt=t=>...
) Wypróbuj tutaj:Pokaż fragment kodu
Zacząłem od używania wielu zmiennych i
for
pę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!
źródło
Matlab, 113 bajtów
Wejście odbywa się poprzez standardowe wejście.
Przykład:
źródło
Julia -
92876154 bajtówNie golfowany:
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+579
zi=t%91-6
, a następnie zastąpićN=(v1+v2)%91+32
zN=(v1+v2+65)%91+32
aby uzyskać ten sam efekt, ale wymaga to jeden dodatkowy znak.źródło