Aqui está um desafio relativamente simples para você.
Dada uma sequência de comprimento N , produza a sequência para frente, depois para trás, depois para frente e depois para trás ... etc. N vezes. Por exemplo, se sua entrada foi
Hello!
Você deve produzir:
Hello!!olleHHello!!olleHHello!!olleH
Opcionalmente, você também pode enviar uma nova linha à direita.
Seu envio pode ser um programa completo ou uma função, e você pode receber entradas e saídas em qualquer formato razoável . Por exemplo, você pode obter E / S de STDIN / STDOUT, argumentos de função e valor de retorno, de um arquivo etc. Você pode assumir com segurança que a sequência de entrada não estará vazia e conterá apenas ASCII imprimível. Você deve gerar a nova string em uma única linha. Então, por exemplo, se a saída para o último exemplo foi
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
Esta não seria uma solução válida!
Aqui estão mais alguns casos de teste:
Input:
a
Output:
a
Input:
abcd
Output:
abcddcbaabcddcba
Input:
OK!
Output:
OK!!KOOK!
Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184
Input:
PPCG
Output:
PPCGGCPPPPCGGCPP
Input:
42
Output:
4224
Classificação
Como este é um desafio do código-golfe , as brechas padrão são proibidas e a resposta mais curta em bytes vence! No entanto , também é uma competição ter a resposta mais curta em qualquer idioma específico. Embora seja improvável que uma resposta Java supere uma resposta em perl ou alguma linguagem de golfe, ainda é muito impressionante ter a resposta Java mais curta. Então, você pode usar esse cabeçalho para ver os dois
A resposta mais curta de todos os idiomas e
A resposta mais curta em cada idioma individual.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=93261,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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>
olleH
, nãoelloH
?Respostas:
Teclas Vim,
39, 345 bytes salvos graças a @Lynn!
Aqui está um gif dele acontecendo ao vivo: (Observe que este gif é de uma versão anterior, pois ainda não tive tempo de regravá-lo).
E aqui está uma explicação de como funciona:
Em uma nota lateral,
Y
pega uma nova linha extra, que geralmente é um recurso desagradável. Esta é provavelmente a primeira vez que ele realmente salvou vários bytes!fonte
:%s/\n<cr>
, você pode fazerv{gJ
para salvar três bytes.@q
está vazio no início, certo? ou o@q
antes de parar a gravação faria algo arbitrário. (Isso me leva a minha trivium vim favorita que eu vim acima com: todos sabem que desistir vim é tão fácil como:q<CR>
, mas como você fechar e salvar todos os seus arquivos fáceis:? ApenasqqqqqZZ@qq@q
!)@q
estar vazio. Por que não apenas fazer:wqa
? Também quer saber como gerar um fractal no vim?qqqqq<C-w>v<C-w>n@qq@q
: DPython, 40 bytes
Uma função recursiva. Anexa a sequência de entrada
s
à função de reversão até que o contadori
exceda o comprimento des
.fonte
lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]
em um byte.f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])
mas é de 136 bytes de acordo comsys.sizeof
, curiosamente, é o mesmo tamanho de #f = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Flak cerebral ,
418378228 bytesEsta é minha obra-prima Brain-Flak. Pode não ser um bom golfe, mas o desafio é o mais difícil que já encontrei.
Experimente online!
Explicação
Agora, essa explicação está um pouco desatualizada, mas ainda funciona muito bem ao explicar o programa.
Essa explicação vai ser um pouco diferente do meu processo de explicação regular. Vou explicar como obtive esse resultado, em vez de explicar o resultado em ordem. Aqui vai:
Roller
Depois de trabalhar bastante no problema, vim com esse código:
Este código (onde n é o literal para algum número, por exemplo
()()
), pega o item no topo da pilha e o move para baixo n etapas. Com n como a altura da pilha, isso executará um "rolo" da pilha. ou seja, mova o item superior para o final da pilha. Veja como funciona:Colocamos o local em que queremos mover o item para menos um na pilha. Por que menos um? Eu não sei, apenas funciona dessa maneira.
Em seguida, fazemos um loop até esse número chegar a zero, acompanhando o loop com a
()
.Cada vez que fazemos um loop, pegamos o item superior e movemos o item abaixo para a outra pilha. Isso coloca o número no topo em seu lugar.
Tudo o que precisamos fazer agora é colocar os números que retornamos. Mudamos para a pilha desativada e aumentamos o número de execuções que o loop fez.
Fazemos um loop decrescente do número recém-enviado até que ele chegue a zero. Cada vez que movemos um número para trás.
Marcha ré
Em seguida, modifiquei o rolo para reverter a pilha completa:
Mais uma vez, n representa a profundidade do reverso. Esses são os n itens principais da pilha serão revertidos. Como funciona:
O inverso é apenas um rolo sofisticado. Simplesmente rolamos o topo da pilha n vezes, diminuindo a profundidade do rolo uma vez a cada vez.
Duplicado
A duplicação é difícil. Muito difícil. Depois que eu descobri como reverter a pilha, ainda era preciso muito esforço para criar o algoritmo de duplicação.
Aqui está:
É um pouco grande, mas eis como funciona:
Comece pressionando n. n é a profundidade da duplicata. Também abrimos dois parênteses. Isso nos permite armazenar o valor de n no escopo até que seja necessário novamente.
Em seguida, repetimos n vezes cada vez, empurrando o valor superior da pilha para fora da pilha duas vezes. Isso faz as duplicatas iniciais para cada número na pilha.
Agora, temos duas cópias de cada número na cartela. Precisamos separá-los em dois grupos.
Então, mudamos para o offstack e lembramos de um dos ns que salvamos no início.
Nós repetimos n vezes.
Cada vez que movemos uma cópia para a pilha principal.
E role uma cópia para o final da pilha. (Isso pressupõe que o offstack estava vazio para começar a tornar essa duplicata não empilhável)
Feito isso, dividimos o original em dois grupos, o "original" e uma cópia no offstack (a cópia é realmente ao contrário). Então, apenas movemos a cópia para a pilha principal e podemos concluir com ela.
Programa esqueleto
Agora que criei todas as partes do programa, só tenho que inseri-las em um quadro.
O quadro dobra o texto um a menos que os tempos de altura da pilha Usando duplicado.
E então inverte a pilha em incrementos decrescentes da altura inicial da pilha de n ^ 2-n para 0.
fonte
Gelatina ,
43 bytesExperimente online! ou Verifique todos os casos de teste.
Guardou um byte graças a @ Maltysen .
Explicação
fonte
L
PHP,
5452 bytes(49 bytes, mas não funciona se a string contiver '0')
(52 bytes)
(54 bytes)
fonte
str_pad
. Agradável!2sable , 3 bytes
Código:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
Ruby, 39 bytes
Eu sou péssima com Ruby. A ajuda do golfe é apreciada.
Ruby é uma linguagem muito boa para isso por causa de
.reverse!
Explicação
Eu esperava que fosse algo simples como:
mas devido à restrição de clichê / desafio, é mais longo.
O que
s.reverse!
é muito útil.s.reverse!
é basicamentes = s.reverse!
, o que significa que também mudas
.O que cada seção do programa faz é descrito abaixo:
O
s.reverse!
que é ótimo é que toda vez que é avaliada, a string é invertida. Então, como ele substitui a cadeia.s
é modificado!fonte
-p
bandeira, você pode salvar 4 bytes:$_.reverse!;gsub(/./){$_.reverse!}
.chomp
sobre o$_
? parece incluir a nova linha no momentoruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txt
, ondefile.txt
é uma linha sem a nova linha de fuga: V De qualquer forma, se você decidir não fazer isso, você não precisa de parênteses na lambda tão->s
obrass.gsub(/./){s.reverse!.reverse}
Perl, 24 bytes
Inclui +2 para
-lp
Dê entrada no STDIN:
rev.pl
:Surpreendentemente, isso não usa o
reverse
operador interno . Esse nome é muuuuito longo, todas as soluções em que eu poderia pensarreverse
são pelo menos 1 byte a mais.fonte
J,
138 bytesEconomizou 5 bytes graças a milhas!
Este é um trem de 5 com os seguintes verbos:
O fork interno é composto por
]
(identidade),;
(link) e|.
(reverso). Observar:Os dois verbos exteriores formam o resto do trem.
#
é, nesse caso, o tamanho do argumento, ou seja, o comprimento. O verbo que liga estes é;@$
, ouravel
acaboureshape
. Observar:Solução antiga.
Simples o suficiente.
|.
é reverso e^:
é uma conjunção de poder, que repete o verbo esquerdo (mão direita) # vezes. Quando o argumento certo é um verbo, esse verbo é chamado no argumento. O verbo certo, neste caso, varia de zero (i.
) ao comprimento (#
). Quando elevados para uma matriz, os resultados intermediários são mantidos. Tudo o que precisa ser feito é achatar a matriz,
.Resultados intermediários
fonte
<@#
#;@$];|.
que a caixas inicial e inverter, remodela as cordas e encaixotados arrasa-los juntosJavaScript (ES 6),
5950 bytes9 bytes graças a Hedi e Huntro.
função recursiva.
A reversão da string ocupa quase metade do tamanho (
2522 bytes!) ...Por que não existe um caminho nativo para isso?
fonte
s[n]?...
intead den<s.length?...
[...s]
vez des.split``
f=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)
que também ser melhor com um pouco melhor função de gamaSyntaxError: Unexpected token )
JS não possui reversão de string nativa.SyntaxError: Invalid or unexpected token
para sua segunda sugestão. Em que navegador isso funciona?Minkolang , 17 bytes:
Experimente aqui!
Explicação
fonte
Conjunto 8088, IBM PC DOS,
2928 bytesMontado,
xxd
despejo:Listagem desmontada:
Programa executável autônomo do PC DOS. Seqüência de entrada via linha de comando, a saída é console.
fonte
Pip ,
1110 bytesExperimente online!
Explicação:
fonte
Haskell,
403632 BytesExemplo:
Ainda mais curto (crédito para Damien):
s >> [s, s reverso] ciclos ["abc", "cba", ...] zipados para corrigir o tamanho e concatMap'ped com fst
fonte
q s=zip(s>>[s,reverse s])s>>=fst
(>>=fst).(iterate reverse>>=zip)
Perl 6 ,
3130 bytesSalve um byte usando incorretamente
.ords
, o que retorna uma lista de ordinais e, em seguida, converta implicitamente isso em um número para criar um intervalo.Explicação:
Uso:
fonte
Vim + coreutils, 32 pressionamentos de teclas
Você nunca pode ter muitas respostas do Vim.
Explicação
fonte
MATL,
13128 bytesEmpurra todos os elementos, combina no final.
Experimente online!
Versões antigas:
Abordagem completamente diferente, com base em
fprintf
:Versão baseada na reversão de uma sequência de modelos
fonte
td
!tnq:"
primeiro, mastn:"
é um pouco de cheiro de código (veja esta dica de golfe do Matlab), então achei quetnq:
poderia ser mais compacto também.Scala,
737271 bytesEsta é a minha primeira tentativa no código de golfe, por isso tenho certeza de que há inúmeras melhorias.
Atualizar:
Jogou 1 byte de golfe removendo os suportes.
Agradecemos a Destructible Watermelon pela sugestão, raspou um byte.
fonte
i%2==1
parai%2>0
?Cubix , 52 bytes
Em um cubo:
Este foi divertido; ainda há bytes a serem jogados fora disso, mas isso definitivamente funcionará.
Experimente online!
explicação:
Entrada de
ABC
/A
: vá para o norte e leia todas as entradas como caracteres;-1
estará na parte inferiorp\;.
: remova o-1
da pilhau#
: pressione o comprimento da string (número de itens na pilha)\:\:qq
: duplique o comprimento da sequência duas vezes, empurre duas cópias para o final da pilhaloop:
soq(?/<u
: troque a parte superior da pilha, coloque a parte superior da pilha como ASCII, empurre a parte superior (letra) para baixo, diminua a parte superior da pilha, vire à direita se não estiver pronto e mova o IP para o lugar certo.C B A 3 3 0
;u
: pop pop da pilhaC B A 3 3
B
: pilha reversa3 3 A B C
p(
: mova de baixo para cima e diminua3 A B C 2
?
se top for zero, vá direto para@
e terminepsq:uq
: mova de baixo para cima, troque de cima para baixo e mova de cima para baixo e mova de cima para baixo3 2 A B C 3
$u
: pularu
<
nos coloca de volta no circuito.Intérprete
fonte
C (gcc) ,
888785836866838278 bytes-1 graças a ceilingcat
Versão antiga
Experimente online!
Versão mais curta (ligeiramente quebrada)
Analisando a abordagem de 76 bytes pela ASCII, apenas nos comentários, e -1 byte de sua emenda na minha emenda.
Edit: Esta versão é um pouco quebrada, pois pressupõe que toda string é precedida por um byte NULL, o que nem sempre é verdadeiro. (Veja o último caso de teste no link). Revertendo para a versão de 83 bytes por enquanto.
Experimente online!
fonte
Java,
12711188 bytesPrograma de teste ungolfed
fonte
(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};
( 88 bytes ). Além disso, gostaria especificar que esta é Java 8.R, 53 bytes
Supõe que a entrada seja separada por espaço ou nova linha para cada caractere.
Alguns casos de teste:
fonte
PowerShell v2 +, 57 bytes
Não existe uma maneira realmente limpa de obter comprimentos de string ou revertê-los, portanto isso é bastante demorado.
Recebe entrada
$a
, passa de1
para$a.length
(armazenado$x
para uso posterior). A cada iteração, usamos um pseudo-ternário para indexar em uma matriz de um$a
ou outro$a[$x..0]
( ou seja, invertido), com base no fato de nosso número de entrada ser ímpar / par[$_%2]
. Tudo isso é encapsulado em parênteses e-join
editado em conjunto para formar uma única sequência. Isso é deixado no pipeline e a produção está implícita.fonte
Java, 151 bytes
}
Ungolfed:
fonte
public static
método before. Você pode remover os espaços entre elest=new StringBuffer
. Você pode remover os parênteses e colchetes desnecessários. E você pode trocar a verificação do módulo de==1
para<1
(o que equivale a==0
números não negativos). Além disso, você pode moveri++
o último uso para dentro do loop for.void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}
( 105 bytes )C #, 94 bytes
76 bytes para o método + 18 bytes para importação de LINQ.
Como funciona:
fonte
CJam , 10 bytes
Experimente online!
Explicação
fonte
Oitava,
3935 bytesExplicação:
Guardado 4 bytes graças a Luis.
~x
em vez de0*x
salvar um byte (funciona porque todos os elementos de x são diferentes de zero. emflip
vez deflipud
salvar outros dois bytes (eu não sabia queflip
existiam).fonte
bash + util-linux,
685853 bytesExplicação
Duas coisas com o
for
loop:for
loops, onde se substitui as palavras-chavedo
edone
por chaves{
e}
. O espaço após o primeiro colchete é necessário e o ponto e vírgula no final também é necessário.for
loops "estilo C" , você pode apenas inicializar com emi;
vez de usari=0;
.${#1}
parte da condiçãoi < ${#1}
refere-se ao comprimento da nossa entrada (o primeiro parâmetro$1
). Em geral, você pode usar${#foo}
para recuperar o tamanho da sequência$foo
.Além disso:
rev
é a ferramenta no util-linux que reverte uma string.-n
bandeira paraecho
nos livrar das novas linhas.rev<<<$y
é chamada string aqui (consulte esta página relevante do tldp.org ), que passa a variável$y
para a entrada padrão derev
.fonte
do
edone
palavras-chave em umfor
loop, você realmente não precisa que o espaço!y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}
... salvou alguns bytesJaponês , 11 bytes
Experimente online!
fonte
î
novo, não é ?!05AB1E , 7 bytes
Experimente online!
Continuará a trabalhar nisso. Eu realmente não gosto da parte "v}", provavelmente posso salvar um byte lá.
Explicação
fonte
vÂ}\J
5 bytes é igual ao seu código, mas com os recursos internos que você estava procurando. :)Â
é Bifurcate (abreviação de Duplicate & Reverse, que é exatamente o que você está fazendo).\
exclui o item superior da pilha.