O objetivo desse desafio é escrever a função / programa mais curta para receber o texto de entrada, criptografá-lo usando o método abaixo e retornar o resultado.
Como exemplo, vou usar a string hello world
.
Primeiro , obtenha o texto de entrada.
hello world
Segundo , converta a string em ternário (base 3). Use esta chave:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
Com esta chave, hello world
torna-se 021011102102112222211112122102010
, como visto abaixo.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
Terceiro , mova o primeiro dígito até o fim.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
Quarto , converta o número novamente em uma seqüência de caracteres usando a mesma chave.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Por fim , retorne o texto criptografado.
vnhhr nqzgj
Aqui estão alguns exemplos de texto e seus resultados:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Como esse é o código de golfe, a entrada mais curta em bytes vence. Erros são permitidos se alguns dos caracteres não tiverem letras minúsculas ou espaço. Este é o meu primeiro desafio, portanto, qualquer sugestão seria mais do que útil.
Boa sorte!
Entre os melhores:
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>
fonte
uint64
) usando poderes crescentes de27
. O deslocamento por um dígito seria então equivalente a multiplicar esse número inteiro grande por3
, e a introdução do primeiro dígito na outra extremidade seria simplesmente uma adição. Mas há complicações, como descartando o último "carry" (talvez através de umamod
operação), e eu não poderia obtê-lo para trabalhar com alguns bytesRespostas:
Pitão,
2322 bytesExperimente on-line: Conjunto regular de entrada / teste
Graças a @isaacg por um byte.
Explicação:
fonte
G
vez de usarN
, por exemplo=+Gd
.Pitão, 26 bytes
Experimente online no Pyth Compiler / Executor: demo | casos de teste
Idéia
Suponha que todos os caracteres de entrada já tenham sido mapeados para os números inteiros especificados na etapa 2.
Para cada número ternário de 3 dígitos, temos que xyz 3 = 9x + 3y + z , portanto, a divisão modular por 9 produz o quociente x e o resíduo 3y + z .
Se a entrada é abc 3 def 3 ghi 3 , aplicar divisão modular a cada um produz a, 3b + c, d, 3e + f, g, 3h + i .
Depois de girar a lista acima de uma unidade para a esquerda, podemos agrupar os números inteiros em pares. Isso produz a lista (3b + c, d), (3e + f, g), (3h + i, a) .
Agora, se convertermos (3y + z, w) da base 3 em número inteiro, obteremos 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Assim, aplicar a conversão base à lista de pares nos dá bcd 3 efg 3 hia 3 , que é precisamente o resultado da rotação dos dígitos ternários concatenados uma unidade para a esquerda.
Tudo o que resta a fazer é mapear os números inteiros resultantes de volta aos caracteres.
Código
fonte
Python 2, 96
Converte um caractere
c
em um valorx
comox=(ord(c)-97)%91
, com o módulo afetando apenas o espaço para convertê-lo em 26. A conversão reversa éi
parachr((i-26)%91+32)
, com o módulo afetando apenasi=26
para torná-lo espaços.Percorremos os caracteres, observando o valor atual
x
e o valor anteriory
. Utilizamos os dois últimos dígitos ternários dey
, encontrados comoy%9
, e o primeiro dígito ternário dex
, encontrado comox/9
. O valor da concatenação éy%9*3+x/9
. Provavelmente, há algumas otimizações que combinam essa aritmética com a mudança97
e a fixação do espaço.Nós fazemos esse loop, retornamos ao primeiro caractere da string no final. Também fazemos um loop de preparação para escrever em um valor anterior
y
, suprimindo o caractere para o primeiro loop quandoy
ainda não foi inicializado.fonte
CJam,
3929 bytesO mais legal sobre este é que ele nem usa conversão de base.
Experimente online .
Acabei de perceber que tinha exatamente a mesma ideia que a resposta Pyth de Jakube. Na verdade, eu portado esse código CJam para Pyth antes de ver seu post, terminando com 25 bytes. Dado que foi o meu primeiro golfe Pyth, acho que não é tão ruim.
Explicação
fonte
CJam,
302927 bytesExperimente on-line no intérprete CJam .
A abordagem é a mesma da minha outra resposta , que é uma porta desse código para Pyth.
Como funciona
fonte
Pitão,
3029 bytesGuardou 1 byte graças a @Jakube.
Demonstração ao vivo e casos de teste.
fonte
Javascript (ES6), 175 bytes
Um one-liner!
"Uso excessivo de variável
v
prêmio , alguém?"atualização: agora usa apenas variáveis chamadas
v
, para total confusão!Obrigado @vihan por salvar 6 bytes!
Obrigado @ Neil por salvar 27 bytes !!
Define uma função anônima. Para usar, adicione
v=
antes do código para dar um nome à função e chame-a comoalert(v("hello world"))
fonte
.slice(-3)
para salvar 6 bytes; nesse ponto, você pode usar"00"+v
para salvar outro byte. (Você poderia concatenar com um modelo, mas o comprimento resultante é o mesmo.).map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
então se torna.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Julia,
149137 bytesMeu primeiro golfe!
(parcialmente) ungolfed:
fonte
=
vez dein
para loops e pode usarb[1]
no lugar deb[1:1]
. Você também não precisa de um espaço entre o fechamento de parênteses efor
.=
, masb[1]
retorna um caractere, que não pode ser anexado a uma sequência com*
.for
truque é bacana. Você também pode obtê-lo diretamente após uma cotação apertada. Não percebi que o analisador era tão flexível.end
.Javascript (ES6),
178,172, 170Math.floor substituído por um bit a bit ou. Criou uma função anônima. Se estou entendendo corretamente, isso deve corrigir um pouco o meu noobishness (obrigado Dennis!) E me dar mais 2 bytes para baixo.
fonte
Julia,
169166 bytesUngolfed + explicação:
fonte
Haskell, 160 bytes
Ugh, isso parece muito longo, mas pelo menos eu estou ... vencendo o Python de alguma forma. E Ruby.
fonte
Javascript (ES6),
141124120 bytesAcredite ou não.... :-)
Como na minha outra resposta, esta é uma função anônima e precisa ser atribuída a uma variável antes que possa ser usada. Experimente aqui:
Mostrar snippet de código
Eu pensei que seria capaz de raspar alguns bytes da minha resposta anterior usando uma técnica diferente, então comecei com uma semelhante à de Tekgno e joguei minha cabeça de lá. Inicializei algumas variáveis na seção de argumentos da função e, novamente, coloquei tudo em uma
.map
função. Então percebiString.fromCharCode
que seria muito mais eficiente fora do.map
. Depois de tudo dito e feito, eu tinha raspado mais de3045 bytes!Editar 1: salvou 17 bytes, livrando-se do
.replace
s, usando uma técnica semelhante à solução Python do xnor.OK, talvez seja hora de passar para outro desafio ....
fonte
Python 2,
182180 bytesEsta solução não é ideal, devido à substituição ser muito cara. Tentando descobrir como evitar isso.
Entrada é como
"hello world"
.fonte
Mathematica, 162 bytes
(Re) Usando a
Rule
para converter as listas de dígitos em caracteres e vice-versa.fonte
Javascript (ES6), 179 bytes
Adereços para vihan para o
.match
regex.fonte
Ruby, 177
Precisa de pelo menos Ruby 1.9 para o
each_char
métodofonte
Java,
458449 bytesFiquei um pouco triste ao determinar que eu poderia cortar 10 bytes sem usar o Java 8 streams e o
map()
método.Aqui está a versão do golfe:
Aqui está uma versão muito menos golfe. Pretende-se que seja legível, mas não dou garantias.
Este programa usa a string para converter como um argumento da linha de comandos. Se você quiser ter espaços em sua entrada, precisará envolvê-lo entre aspas duplas.
Eu queria fornecer um exemplo de uso disso na linha de comando, mas não consegui que esse código funcionasse fora do Eclipse. Eu nunca aprendi a usar Java na linha de comando ^ _ ^; Provavelmente, você pode executá-lo dentro do IDE de sua escolha sem muita dificuldade.
fonte
Javascript (ES6),
181180 bytesEsta é uma função anônima e, portanto, precisa receber um nome antes de poder ser usada. (Por exemplo
encrypt=t=>...
) Experimente aqui:Mostrar snippet de código
Comecei usando várias variáveis e
for
loops em vez de.map
. Depois joguei o golfe de todas as formas possíveis sem alterar o algoritmo, o que me colocou em torno de 217 bytes. Depois de dar uma olhada na resposta da UndefinedFunction, consegui reduzi-la para 195, e algumas inspeções na resposta do Dendrobium resultaram em outros 14 jogadores.Tanto quanto sei, não posso ir mais longe ou meu resultado seria praticamente idêntico ao do Dendrobium (exceto por ser um personagem mais baixo!). Alguém pode encontrar o lugar onde eu salvei um caractere? :-)
Como sempre, sugestões são bem-vindas!
fonte
Matlab, 113 bytes
A entrada é através do stdin.
Exemplo:
fonte
Julia -
92876154 bytesUngolfed:
O truque pode confundir você. Subtrair 6 move 'a' para zero após o mod. Adicionar 9 * 65 é equivalente a adicionar 65 a v1 + v2, que faz parte do processo de restauração dos valores em seus valores ascii. Você pode substituir
i=t%91+579
pori=t%91-6
e depois substituirN=(v1+v2)%91+32
porN=(v1+v2+65)%91+32
para obter o mesmo resultado, mas requer um caractere extra.fonte