Desafio:
Dada uma sequência contendo apenas letras maiúsculas e / ou minúsculas (o que você preferir), coloque tape
horizontalmente para corrigi-la. Fazemos isso verificando a diferença de duas letras adjacentes no alfabeto (ignorando o contorno e apenas avançando) e preenchendo o espaço com o máximo TAPE
/ tape
necessário.
Exemplo:
Entrada: abcmnnnopstzra
Saída:abcTAPETAPETmnnnopTAstTAPETzra
Por quê?
- Entre
c
em
deve serdefghijkl
(comprimento 9), então preenchemos isso comTAPETAPET
; - Entre
p
es
deve serqr
(comprimento 2), então preenchemos isso comTA
; - Entre
t
ez
deve seruvwxy
(comprimento 5), por isso preenchemos issoTAPET
.
Regras do desafio:
- A diferença se aplica apenas a frente, portanto, não há fita entre elas
zra
. - É possível ter várias das mesmas letras adjacentes como
nnn
. - Você tem permissão para receber a entrada em qualquer formato razoável. Pode ser uma única string, string-array / lista, caractere-array / lista, etc. A saída tem a mesma flexibilidade.
- Você tem permissão para usar letras minúsculas e / ou maiúsculas da maneira que desejar. Isso se aplica à entrada, saída e
TAPE
. - É possível que não
TAPE
seja necessário; nesse caso, a entrada permanece inalterada.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link para um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Input: "abcmnnnopstzra"
Output: "abcTAPETAPETmnnnopTAstTAPETzra"
Input: "aza"
Output: "aTAPETAPETAPETAPETAPETAPEza"
Input: "ghijk"
Output: "ghijk"
Input: "aabbddeeffiiacek"
Output: "aabbTddeeffTAiiaTcTeTAPETk"
Input: "zyxxccba"
Output: "zyxxccba"
Input: "abccxxyz"
Output: "abccTAPETAPETAPETAPETAPExxyz"
Input: "abtapegh"
Output: "abTAPETAPETAPETAPETtaTAPETAPETAPETApeTgh"
Input: "tape"
Output: "taTAPETAPETAPETApe"
ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh
(acrescentou o[]
para torná-lo mais legível).Respostas:
05AB1E ,
1412 bytesExperimente online!
Explicação
fonte
-d
para obter o despejo de operação por operação da pilha bruta do que está acontecendo no lugar de uma explicação, mas tento publicá-los também, não é direto, especialmente em alguns meu LOL.Gelatina , 13 bytes
Experimente online!
Explicação
fonte
abctapetapetmnnnopapstetapezra
vez deabctapetapetmnnnoptasttapetzra
.Haskell , 58 bytes
Experimente online! A função se
f
repete sobre a string e examina caracteres consecutivosx
ey
.cycle"TAPE"
produz a sequência infinita"TAPETAPETAPE..."
.[x..y]
recebe o intervalo de caracteres a partirx
dey
Inclusive, portanto, precisa subtrair dois do comprimento. No caso dex
ocorrer mais tarde no alfabeto, entãoy
ou ambos são do mesmo caractere, obtemos um número negativo após a subtração, mas felizmente ostake
aceita também e simplesmente não aceita nada.fonte
Perl 5 ,
-F
46 bytesExperimente online!
fonte
P,E,T,A
vez deT,A,P,E
, mas agora percebo que você usou em((P,E,T,A)x7)[2..-$^H+($^H=ord)
vez de((T,A,P,E)x7)[0..-$^H+($^H=ord)-2
salvar dois bytes. Boa resposta!^H
(\x08
)!do$0
), mas é apenas 2 bytes aqui, então eu não me incomodeiPython 2 ,
968780 bytesExperimente online!
fonte
Haskell , 64 bytes
Manipula cadeias de letras maiúsculas ou minúsculas, mas não as duas.
Experimente online!
fonte
C, 84 bytes
Experimente online!
C (executado no prompt de comando do Windows), 81 bytes
Saída:
fonte
Python 3 , 98 bytes
Experimente online!
-1 byte graças a Asone Tuhid
fonte
Scala , 66 bytes
Experimente online!
Explicação
fonte
PHP , 85 bytes
Experimente online!
Explicação
fonte
Javascript,
131127 bytes4 bytes economizados graças a Rick Hitchcock.
Desenrolado
Meu problema aqui é que o Javascript não tinha uma maneira limpa de obter a distância entre os caracteres aeb.
fonte
charCodeAt
a uma variável:z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
Python 2/3 ,
7069 bytesExperimente online!
fonte
Carvão , 20 bytes
Experimente online! Explicação:
fonte
Pip , 29 bytes
Recebe a entrada como argumento da linha de comando (maiúsculas ou minúsculas, não importa). Experimente online!
Explicação
fonte
JavaScript (ES6),
8078 bytesA distância entre dois caracteres pode ser determinada convertendo sua concatenação na base 36, subtraindo 370, módulo 37.
Por exemplo
(parseInt('cy',36)-370)%37 == 22
,.Podemos então usar
padEnd
para preencher as lacunas e recursão para lidar com o loop.Casos de teste:
Mostrar snippet de código
fonte
K4 , 48 bytes
Solução:
Exemplos:
Explicação:
Solução bastante simples, mas com uma contagem alta de bytes ... Encontre os deltas, retire da string
"TAPE"
e junte-se ao corte original da string onde os deltas são> 1.fonte
Excel VBA, 106 bytes
Uma função de janela imediata anônima do VBE que recebe entrada como uma seqüência de caracteres em maiúsculas via célula
A1
e envia para a janela imediata do VBE.fonte
Ruby ,
5953 bytesExperimente online!
Na verdade, isso é bastante direto - nós pegamos a entrada como
dividimos nossa string emuma matriz de caracteres (agradecemos a Asone Tuhid por apontar isso) e aplicamos a operação de redução, onde justificamos cada caractere com o comprimento necessário usando "TAPE" como string de preenchimento.fonte
K (oK) , 33 bytes
Experimente online!
{ }
função anônima com argumentox
-':x
subtraia cada anterior (use um 0 imaginário antes do primeiro item)1_
largar primeiro item0,
preceder um 0-1+
add -10|
máx (0, ...)(
...)#\:"TAPE"
remodelar a string"TAPE"
de cada item da lista à esquerda(
...),'x
acrescenta o caractere correspondentex
a cada sequência remodelada,/
concatenar tudofonte
Ruby ,
78 77 6462 bytes-1 byte graças a Kevin Cruijssen
Experimente online!
fonte
ord-l[-1].ord-1
paraord+~l[-1].ord
. Boa resposta, no entanto. +1 de mim.Java (JDK) , 91 bytes
Experimente online!
Explicação
Créditos
var
fonte
int p=123
salvaria um personagem. Não importa o quep
está na primeira iteração, desde que seja maior ou igual ao primeiro caractere. O maior valor que o primeiro caractere pode ter é'z'
== ASCII122
, portanto, 123 é bom o suficiente. Além disso, se você usou letras maiúsculas, poderá usar 91 em vez de 123, salvando outro caractere.C # (.NET Core) ,
122111 bytesGuardado 11 bytes graças a @KevinCruijssen
Experimente online!
Explicação:
fonte
while
a umfor
e remover os suportes:for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+=t[(e-d)%4]);
. :) Oh, e uma vez que você estiver usandot="ETAP"
apenas uma vez, você pode usá-lo diretamente, e mudançastring
paravar
salvar mais 7 bytes:s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+="ETAP"[(e-d)%4]);return r;}
.Yabasic , 119 bytes
Uma função anônima que recebe entrada como uma seqüência de caracteres em maiúsculas e gera saída para STDOUT.
Experimente online!
fonte
Python 3, 90 bytes
Experimente Online
fonte
**title**
para#title
. Além disso, você se importaria de adicionar um link TryItOnline com código de teste?Clojure,
139119 bytesFunção anônima que pega a string e retorna a gravada. Como sempre, Clojure não parece ter um desempenho muito bom. O que eu realmente não consegui descobrir é buscar o próximo caractere de uma maneira curta. No último char, eu teria uma
OutOfBoundsException
razão óbvia. Então eu coloquei umacycle
volta. Talvez haja uma solução mais elegante.Ungolfed
Atualizar
Conseguiu eliminar alguns bytes. Livre-se da
if
declaração traquina , diminuindo a diferença.take
produz uma lista vazia se o número for 0 ou menos, o que resulta em uma sequência vazia.Ungolfed
fonte
APL (Dyalog Classic) , 30 bytes
Experimente online!
{ }
função anônima com argumento⍵
⎕a⍳⍵
encontre índices de seus caracteres no alfabeto2-/
diferenças aos pares (anterior menos próximo)1+
add 1-
negar0⌈
máx (0, ...)0,
preceder um 0⍴∘'TAPE'¨
remodelar ciclicamente a cadeia'TAPE'
de caracteres para cada⍵,¨⍨
anexa cada caractere do argumento à string remodelada correspondente∊
aplainarfonte
CJam ,
2725 bytesExperimente online!
Longe, longe das outras línguas do golfe, mas de qualquer forma estou orgulhoso desse golfe.
Explicação
fonte
Casca ,
2625 bytesExperimente online!
fonte
PowerShell , 72 bytes
Experimente online!
fonte
Java,
213166153 bytesexperimente online
Por favor me ajude a melhorar.
Obrigado a @cairdcoinheringaahing pela dica sobre espaços em branco. Obrigado a @RM pela dica sobre a sequência de fitas. Obrigado a @KevinCruijssen pelas dicas sobre lambda e expressões.
fonte
"TAPETAPETAPETAPETAPETAPET".substring...
.int a=1,l=i.length;a<=l;a++
pode serint a=0,l=i.length;++a<=l;
,char u=i[a-1];o+=u;if(a<l){char n=
pode serchar u=i[a-1],n;o+=u;if(a<l){n=
,(n-u)
não precisa de parênteses en-u-1
pode sern+~u
. Além disso, sua resposta é atualmente um trecho de código em vez de uma função. Para torná-lo um lambda, você precisará adicionari->{
na frente e}
no final. Portanto, no total: experimente online. 153 bytes