Vamos começar definindo um reflexo de um caractere em uma string:
Dada uma sequência com letras alfabéticas minúsculas distintas e sem espaços, como abcdefg
, defina um reflexo de uma letra na sequência c
como movendo-a (sem alterar a ordem de qualquer outra letra) para um novo local na sequência, de forma que o número de letras originalmente agora à direita está o número de letras à esquerda.
Assim, um reflexo da letra c
em abcdefg
seria abdecfg
. Explicação: havia 4 letras à direita de c
e agora, existem 4 letras à esquerda de c
.
Mais alguns exemplos:
Refletindo o caráter e
em myfriend
formariam a stringmyefrind
Refletindo o caráter a
em axyz
formariam a corda xyza
.
Refletindo o caráter b
em abc
formariam a corda abc
.
Refletindo o caráter d
em d
formariam a corda d
.
Refletindo o caráter e
em ef
formariam a corda fe
.
Para obter mais informações ou experimentar alguns casos de teste, aqui está um programa (um tanto longo) que escrevi em C ++.
O desafio
Dada uma sequência com letras minúsculas distintas, passe por cada caractere alfabeticamente e "reflita" na sequência.
Esclarecimentos: As letras da string são de a-z
, não há espaços, as letras são exclusivas e a string tem pelo menos 1 letra e no máximo 26 letras.
Exemplos
Entrada: dcba
. Saída: dcba
.
Motivo: primeiro, reflita o a
caractere da string que aparece mais cedo no alfabeto. Você receberá adcb
. Em seguida, reflita o b
que vem a seguir no alfabeto, para obter badc
. Em seguida, reflita o c
que obter cbad
e, em seguida, o d
que obter dcba
.
Entrada: myface
. Saída: fyecma
.
Dica: Percorra as letras na ordem a, c, e, f, m, y
.
Entrada: a
. Saída: a
.
Entrada: acb
. Saída: bac
.
Entrada: cwmfjordbankglyphsvextquiz
. Saída: ieabhqzugdltkfnvpjxsormycw
.
Pontuação
- A entrada e saída podem ser fornecidas por qualquer método conveniente .
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
- Aceitando ~ 100 horas após a postagem.
Vencedor Atual
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 162891; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Respostas:
Flacidez Cerebral , 188 bytes
Experimente online!
Além das reflexões descritas na especificação do desafio, esse código também inverte a sequência exatamente 26 vezes. Isso não afeta a saída final.
fonte
05AB1E ,
2017 bytesExperimente online!
Explicação
Por exemplo, para a primeira iteração de
myface
A cadeia é cercada por espaços a cada iteração, pois a divisão na primeira ou na última letra da cadeia resultaria em uma lista de comprimento 1 caso contrário, e a mesclagem não incluiria essa letra.
fonte
Pitão,
18161916 bytesExperimente aqui
Explicação
fonte
Python 3 ,
8073 bytesAgradeço ao Esolanging Fruit por me lembrar que as funções podem retornar modificando seu argumento.
Experimente online!
Recebe a entrada como uma lista de caracteres.
fonte
Python 2 , 70 bytes
Experimente online!
Modifica a lista de entrada
fonte
Retina 0.8.2 , 61 bytes
Experimente online! O link inclui casos de teste. Explicação:
Inicie o loop em
a
.Se a entrada contiver a letra atual, mova-a para o final, com uma sequência de
_
s representando sua posição original.Para cada
_
movimento, a letra retorna um caractere.Incremente a letra. Depois de
z
alterá-lo para um,!
para que não corresponda a nada e o loop termina.Exclua o
!
.fonte
Java 8,
1409692888785 bytes-44 bytes criando uma porta da resposta Python 2 do @TFeld .
-6 bytes graças a @ OlivierGrégoire .
Modifica a lista de entrada em vez de criar uma nova.
Explicação:
Experimente online.
fonte
s->{for(char c=96;++c<123;){int i=s.indexOf(c);if(i>=0)s.add(s.size()+~i,s.remove(i));}}
for(char c=9;++c>1;)
é melhor ;-)char
também envolve comoInteger.MAX_VALUE + 1 == Integer.MIN_VALUE
.. Inteligente!s
é um ArrayList, portantoindexOf
será do tipo genéricoT
(que éCharacter
para esta lista de entrada).JavaScript,
858079 bytes-6 bytes graças a @DanielIndie
Experimente online!
fonte
Ruby , 51 bytes
Experimente online!
Toma uma matriz de caracteres
Retorna modificando a entrada
fonte
Vermelho ,
9694 bytes2 bytes economizados graças a Kevin Cruijssen
Experimente online!
Mais legível:
fonte
find x c replace x c""insert at x i c
parafind x c insert at replace x c""i c
para se livrar de umx
espaço.R ,
737269 bytesExperimente online!
Insere e gera um vetor de caracteres.
fonte
c
como um nome de variável? isso é horrível, mesmo para o código de golfe!c
parachar
), em vez de embutidos não utilizados.c
, e foi horrível quando não consegui entender o que estava acontecendo. Normalmente, usoK
ouk
mesmoC
apenas para evitar problemas como esse, mas entendo totalmente.append
é a ferramenta certa para o trabalho.Perl 5
-p
, 37 bytesExperimente online!
fonte
Japonês ,
2322 bytesSalvo um byte graças a Oliver .
Experimente online!
fonte
,É
porJ
Haskell, 87 bytes
Experimente online!
fonte
f s=foldl(#)s['a'..'z']
?['a'..]
não é infinito, porqueChar
pertence à classeBounded
. Uma lista com..]
dosBounded
valores páramaxBound
. Tente:print [False ..]
.SNOBOL4 (CSNOBOL4) ,
132128 bytesExperimente online!
Implementação direta do algoritmo necessário. Economizou alguns bytes alternando para uma função em vez de um programa completo; a explicação permanece a mesma, mais ou menos.
fonte
Geléia ,
1211 bytesUm link monádico que aceita uma lista de caracteres e retorna uma lista de caracteres.
Experimente online!
Quão?
fonte
ḟ
(filtrar), mas ainda não o consegui.sorted
e depois executa n iterações do que parecem ser operações menos complexas (achatamento, divisão nos índices encontrados, união, reversão ) - e o Pythonsorted
é O (n log n).C (clang) ,
164162 bytesExperimente online!
f()
toma o array de caracteres contendo a string de entrada e o comprimento desse array como parâmetros e executa as reflexões necessárias.callf()
faz bonita impressão.Créditos
-2 bytes. @Kevin. obrigado
fonte
char *s
e mudançai=96
parai=9
para salvar 2 bytes.a
. ObrigadoAPL + WIN, 63 bytes
Solicita a sequência de entrada
Explicação:
fonte
Perl ,
7470 bytes8480 bytes, incluindo invocação como filtro unixfonte