Alternar , é o ato de pegar uma corda e aninha-la entre colchetes. Aqui está como você alterna uma string.
Para uma sequência de comprimento N , pegue os caracteres N centrais e coloque-os entre parênteses. Portanto, se nossa string tiver
Hello world!
(12 caracteres), terminaremos com(Hello world!)
Em seguida, pegue os
n-2
caracteres centrais restantes e coloque-os entre colchetes. Nesse caso, os 10 caracteres centrais sãoello world
, portanto, a próxima iteração é:(H[ello world]!)
Enquanto houver mais de dois caracteres no meio da sequência, repita os dois últimos passos, alternando entre
()
e[]
. Aqui estão os últimos passos:(Hello world!) (H[ello world]!) (H[e(llo worl)d]!) (H[e(l[l(o[ w]o)r]l)d]!)
Como há apenas dois caracteres no meio na última iteração, paramos. Nossa string final é
(H[e(l[l(o[ w]o)r]l)d]!)
Observe como existem dois caracteres entre colchetes. Isso acontece quando a entrada tem um comprimento uniforme. Se a entrada tivesse um comprimento ímpar (por exemplo,
Hello, world!
com uma vírgula adicionada), teríamos apenas um caractere no meio:(H[e(l[l(o[,( )w]o)r]l)d]!)
Para o desafio de hoje, você deve escrever um programa ou função que use uma string como entrada e a alterne, produzindo a nova string. Você pode receber entrada e saída em qualquer formato razoável que desejar. A entrada sempre terá pelo menos um caractere e conterá apenas ASCII imprimível. Você também pode assumir que a entrada não conterá parênteses ou colchetes. Para idiomas tradicionais, isso não deve importar muito, mas pode facilitar para alguns idiomas esotéricos.
Como sempre, esse é um competição de código-golfe , portanto, tente fazer a resposta mais curta possível no idioma de sua escolha. Diverta-se!
Teste de E / S
#Input #Output
"Alternesting is fun!" --> (A[l(t[e(r[n(e[s(t[in]g) ]i)s] )f]u)n]!)
"PPCG" --> (P[PC]G)
"Code-golf" --> (C[o(d[e(-)g]o)l]f)
"4 8 15 16 23 42" --> (4[ (8[ (1[5( [1]6) ]2)3] )4]2)
"a" --> (a)
"ab" --> (ab)
"abc" --> (a[b]c)
fonte
()
) ou podemos começar com colchetes ([]
)?()
HelloWorld
.Respostas:
Python 3 ,
706965 bytes-1 byte graças a @Uriel
-4 bytes graças a @xnor
Experimente online!
fonte
C,
143137135 bytesExperimente online!
Explicação:
fonte
0
. Assim, você não deve precisar dok=i=0,
. Eu posso estar errado. Veja esta resposta do SORetina , 52 bytes
Experimente online! O primeiro estágio insere pares de parênteses entre cada par de caracteres de entrada, enquanto o segundo e o terceiro estágios corrigem parênteses alternados entre colchetes.
fonte
Sed, 78
A pontuação inclui +1 para a
-r
opção passada para sed.Experimente online .
fonte
JavaScript (ES6),
6968 bytesCasos de teste
Mostrar snippet de código
fonte
V ,
252625 bytes12 bytes de desconto graças a @DJMcMayhemExperimente online!
Emprestou algumas das idéias de @ udioca.
Finalmente, também usei o plug - in surround incluído no V para uma resposta, embora possa não ter sido o melhor caminho, quem sabe.O plugin NÃO quer ser usado.Hexdump:
Explicação:
fonte
;
vez do últimof)
Experimente online!()
e[]
é um byte mais curto, mas muito menos legalHaskell ,
9691817977 bytesExperimente online!
fonte
(x:y)
e(init y)
.k==""=""
é mais curto comok==""=k
.cycle["()","[]"]
para apenas"()[]"
: Experimente online!cycle
é ainda mais curto. Você ainda pode remover os parênteses(init y)
.k==""=k
para o final e alterá-lo para0<1=k
.Ruby ,
7977 bytes-2 bytes graças a @Value Ink
Experimente online!
fonte
s.insert k=i*2,'(['[i%2];s[~k]+=')]'[i%2]
para salvar 2 bytes. Experimente online!Javascript (ES6)
110105 bytesObrigado a @powelles por me lembrar
x%y<1
.Obrigado @Luke por
a-b?y:x
Mostrar snippet de código
A primeira coisa a entender essa fera é destruí-la:
Quase todas as linhas fazem parte da versão em golfe, portanto, passo a passo:
Linha 1: A instrução de função se torna uma função de seta , renomeando
input
parai
. Torna-sei=>
.Linha 2:
Array.from
é a maneira nova e adequada de converter uma string em uma matriz e o que usamos nessa linha. No entanto, junto com ele, o operador de propagação é uma maneira mais barata do que a.split('')
maneira antiga , de fazê-lo, que é o que é usado na versão de golfe. Termina como[...i]
.Linha 3:
.map
percorre uma matriz, fornecendo três argumentos:item
(a
no campo de golfe)index
,; jogou golfe comob
ebaseArray
ouc
. Enquanto nos preocupamos apenas com ,item
eindex
continuamosbaseArray
(veja na linha 4 o porquê). Golfe para.map((a,b,c,...)=>...
.Linha 4: A variável
middle
, ou o argumentod
na versão golfed é criada para salvar alguns bytes quando é repetida. O argumentoc
precisava ser mantido para que o argumentod
fosse criado. É convertido para(...,d=i.length/2-1,...)
.Linha 5 : A variável
alternate
ou argumentoe
é usada para verificar em que caractere estava "(" ou "[" ou se passou do meio ",") "e"] ".b%2<1
é igual ab%2==0
porque não pode ser menor que 1, mas 0 neste caso. Igual a(...,e=b%2<1)
.Linha 6: Uma variável helper para permitir-me para converter o
ternary operators
paraif
declarações. Não há nada no codegolf real.Linhas 7-8 : Se o índice for menor que o meio da string, defina o símbolo como uma alternância de "[" e "(". Equivale a
d>b?e?'[':'(':...
.Linhas 9-12 : Caso contrário (se o índice for maior que o meio), verifique se o meio é um número inteiro; caso contrário, alterne a alternância. Em seguida, defina o símbolo como uma alternância de ')' e ']'. Ofuscado para
(d%1==0?!e:e)?')':']'
.Linhas 13-15 : Se no meio, defina o símbolo como uma string vazia. Isso não se aplica a alternadores ímpares, porque o meio tem um decimal. Torna-se:
d==b?'':...
.Linha 16 : junta a matriz de caracteres novamente em uma sequência. Equivale a
.join``
.Linha 17 : Retorna o símbolo inicial "(" e o resultado. Correlaciona para
'('+...
.fonte
%2==0
para%2<1
e usar[...i]
em vez dei.split
[..i] idea
, mas esqueci o%2<1
obrigado.b%2<1
poderia ser substituído por!b%2
d==b?x:y
poderia se tornard-b?y:x
ed%1==0
poderia se tornar!d%1
.!d%1
funciona apenas com parênteses:,!(d%1)
e não retira nenhum bytes. Esqueci que 0 era o único número falso, por alguma razão eu pensei que -1 era o número falso. Corrija-me se estou entendendo algo errado sobre o segundo.Geléia ,
2321 bytesExperimente online!
-2 bytes graças a @EricTheOutgolfer
fonte
ị
link para o auxiliar para -2, desta forma:LHĊRị¶ç⁾)]żUFUż@ç⁾([$
SCALA,
140138 caracteres,140138 bytesMe desculpe, eu não poderia fazer melhor ... Tenho certeza que existem muitas maneiras de melhorá-lo. Ainda:
Experimente online!
Obrigado por este desafio, foi muito difícil para mim.
EDIT: -2 bytes graças a Mar Dev.
PS: Vou perguntar uma coisa. Eu entendo por que ESTE CÓDIGO continua duplicando o caractere central da minha string se eu tiver um comprimento ímpar (eu apenas não a verifico e a adiciono duas vezes, nas duas
l
e nasr
strings). Mas por que eu obter um par de parênteses quando tento corrigi-lo como QUE ? Eu não entendo nada.fonte
i%2==0
parai%2<1
para salvar dois bytes.Perl,
7774 (73 + 1) bytesExpressões regulares são coisas gloriosas. Execute com o
-p
sinalizador de linha de comando.fonte
05AB1E , 31 bytes
Experimente online!
Explicação
Com exemplos de entrada:
abcd
/abcde
fonte
C ++ 14,
154145 bytes[Recursivo]
C ++ 14, 177 bytes
[Iterativo]
fonte
Pitão , 42 (!) Bytes
Teste online! A entrada deve ser citada.
Explicações
Então, basicamente, removo progressivamente a cabeça e o final de H (sendo a string de entrada no início) enquanto concatenamos os parênteses / colchetes. G é apenas um booleano que lembra se devo usar colchetes ou parênteses.
fonte
05AB1E ,
4942 bytesExperimente online!
fonte
PowerShell,
125119111 bytesExperimente online!
Versão anterior*
* Obrigado @Digital Trauma.
fonte
QuadR , 82 bytes
(81 bytes +1 para
≡
sinalizador)Experimente online!
fonte
AWK, 118 bytes
Testado com gawk, mas deve funcionar com qualquer intérprete awk compatível
fonte
JavaScript, 101 bytes
Não é um vencedor, mas foi interessante tentar a
replace
abordagem. Definitivamente, isso poderia ser melhorado, mas saiu rapidamente do controle ...fonte
Java (OpenJDK 8) , 124 bytes
Experimente online!
Créditos
fonte