Seu desafio é escrever um programa ou função que, quando recebidas duas cadeias de comprimento igual, troque todos os outros caracteres e produza / retorne as cadeias resultantes em qualquer ordem.
Exemplos
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
Regras
- As seqüências conterão apenas caracteres ASCII (32-126).
- As strings sempre terão o mesmo comprimento e nunca estarão vazias.
- Você pode aceitar entrada em qualquer formato adequado: parâmetros separados, itens em uma matriz, separados por uma ou mais novas linhas, até concatenadas. A única restrição é que uma string deve vir completamente antes da outra (por exemplo,
a1\nb2\nc3
para"abc", "123"
é inválida). - A saída pode estar em qualquer ordem (ou seja, você pode começar a trocar do primeiro ou do segundo caractere) e em qualquer formato válido mencionado acima. (Matriz de dois itens, separada por nova linha (s), concatenada etc.)
Pontuação
Isso é código-golfe , portanto o código mais curto em bytes para cada idioma vence.
DrMcMoylex
. : DRespostas:
Haskell, 37 bytes
Fecha as duas seqüências de caracteres, alternando alternadamente os caracteres e as descompacta.
Uma alternativa recursiva de 37 bytes:
fonte
Python, 42 bytes com golfe de E / S
Troca todos os outros caracteres das duas listas. Toma como entrada duas listas de caracteres e saídas modificando-os .
dá
fonte
Vim,
18, 17 bytesExperimente online!
Isso usa o intérprete V devido à compatibilidade com versões anteriores. A entrada vem neste formato:
Explicação:
fonte
x
em vez deyl
e, em seguida, molhoP
, em vez de segundovP
:lqqxjvPkPll@qq@q
[save]
botão? De qualquer maneira, não está funcionando para mim . A verdadeira razão disso é que, quando você éx
o último caractere da linha, ele move o cursor para a esquerda, atrapalhando o posicionamento da troca.Haskell, 41 bytes
Retorna um par com as strings. Exemplo de uso:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Abordagem recursiva simples: pegue o primeiro caractere de cada string como um par e acrescente uma chamada recursiva com as (restantes) strings trocadas.
unzip
faz um par de listas fora da lista de pares.fonte
05AB1E ,
1110 bytesExperimente online!
Explicação
input =
["code", "golf"]
usado como exemplo.fonte
Perl, 48 bytes
Bytecount inclui 47 bytes de código e
-p
sinalizador.Corra com
-p
e-E
sinalize. Espere cada sequência em uma linha diferente:Explicações :
-p
: captura entrada$_
e imprime no final. (para obter e imprimir a primeira string)<>
: obtenha uma linha de entrada. (para obter a segunda string).=~
: Aplicar uma expressão regular a<>
:s%%%geer
, onde graças aor
a cadeia modificada é devolvido (e, em seguida, impresso graças asay
).O regex:
.\K(.)
localiza dois caracteres e substitui o segundo pelo resultado da avaliação deste código"s/.{$-[0]}\\K(.)/$1/;\$1"
:A primeira parte
s/.{$-[0]}\\K(.)/$1/
aplica um regex para$_
:.{$-[0]}
ignora os primeiros caracteres para chegar ao mesmo ponto que o regex externo (já que$-[0]
contém o índice do primeiro grupo de captura; nesse caso, o índice dos caracteres a serem substituídos) e, em seguida, capturamos um caractere com(.)
e substitua-o pelo caractere do regex externo ($1
). E então adicionamos$1
o resultado de Você deve ter notado que se refere ao personagem que queremos substituir nas duas strings (dois caracteres diferentes), então brincamos com o modificador da regex que avalia o lado direito da regex duas vezes: o primeiro substituirá apenas o que não é precedido pelo ."s/.{$-[0]}\\K(.)/$1/;\$1"
é o personagem que capturamos no regex interno.$1
/ee
$1
\
fonte
Python, 55 bytes
Fatiamento!
58 bytes:
64 bytes:
Recursivamente acumula os caracteres das duas seqüências em
s
et
, e gera o par deles no final. A alternância é feita alternando as cadeias de entrada a cada chamada recursiva. A saída de uma sequência separada por espaço tinha o mesmo comprimento:Isso venceu por pouco uma estratégia recursiva diferente de pegar caracteres alternadamente de cada corda, com cada uma das duas cordas possíveis como a primeira. (65 bytes)
fonte
MATL ,
111098 bytesGraças à ETHproductions por 1 byte de desconto!
Entrada é uma matriz 2D contendo as duas cadeias, tal como:
['Halloween'; 'Challenge']
. As seqüências de saída estão na ordem inversa.Experimente online!
Explicação
Versão antiga: 9 bytes
Explicação
fonte
Gelatina , 5 bytes
A entrada é como argumentos separados, a saída é concatenada.
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Gelatina ,
986 bytesAgradecimentos a Dennis por economizar 2 bytes!
Usa a codificação Jelly .
Experimente online!
fonte
ṙ"J$
vez deĖṙ@/€
. Além disso, não é necessário separar a sequência, para que você possa soltar oY
.V , 12 bytes
Experimente online!
Nada muito interessante, apenas uma porta direta da minha resposta vim para que eu possa competir com (mas não vencer) 05AB1E.
fonte
Pyke, 9 bytes
Experimente aqui!
fonte
JavaScript (ES6), 51
54Editar 3 bytes salvos thx @Neil
Função com entrada / saída de array
Eu gosto mais deste, mas é 55 (2 strings na entrada, array na saída)
Teste
fonte
replace
poupa 3 bytes:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pitão, 8 bytes
Experimente online: Demonstração
Transpõe as palavras, inverte cada par de letras 'índice atual' vezes, transpõe novamente.
fonte
JavaScript (ES6), 55 bytes
Eu queria fazer algo inteligente usando o regexp para substituir caracteres alternativos, mas isso acabou levando
6757 bytes:fonte
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
o mesmo comprimento.map
, ele raspou 10 bytes da minha resposta regexp. Ainda muito tempo.Perl, 40 bytes
Inclui +1 para
-n
Dê strings como linhas em STDIN
interlace.pl
fonte
Java,
132103100 bytesObrigado a Kevin Cruijssen por sugerir o retorno da matriz (entre outras melhorias) e salvar 29 bytes! Também Olivier Grégoire por 3 bytes!
Chamado assim:
Saída:
Hollo,werld!
Aproveita o fato de que a entrada pode ser basicamente formatada de qualquer forma (neste caso, uma única matriz de caracteres de Strings que são delimitadas por vírgula) e também regras de saída bastante branda.
fonte
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 bytes ) com a saída sendo retornada em vez de impressa diretamente. Exemplo de entradaSystem.out.println(c("Hello,world!".toCharArray(), 5));
:; Exemplo de saída:Hollo,werld!
.Hollo!werld,
e nãoHollo,werld!
(a pontuação está incorreta). Eu acredito que isso pode ser corrigido com um valor de entrada de 6 em vez de 5.t
parachar
, por que não o declara diretamente no loop for como achar
? Você pouparia alguns bytes ao fazê-lo.C, 124 bytes
Ligue para:
O comprimento da string é limitado a 98 caracteres.
fonte
Oitava ,
6461 bytesFunção anônima que insere uma matriz de caracteres 2D com cada sequência em uma linha e produz a saída no mesmo formato.
Experimente em Ideone .
fonte
Raquete 208 bytes
Ungolfed:
Teste:
Saída:
Acima é a versão recursiva.
Versão iterativa:
Ungolfed:
fonte
PowerShell v2 +, 82 bytes
Ainda jogando golfe ...Não. Não consigo resolver isso sem usar um regex como outras respostas (vaia nos algoritmos de cópia).Então, pegamos
$a
e$b
como strings, definimos index$i
como0
, cast$a
como umchar
array e enviamos através de um loop|%{...}
. A cada iteração, concatenamos as cadeias de caracteres$c
e$d
indexamos em uma seleção de matriz (ou seja, para que alterne entre si). Então, deixamos$c
e$d
no gasoduto, e saída através implícitaWrite-Output
acontece na conclusão do programa.fonte
Lit , 120 caracteres (+3 para o sinalizador -v1)
Linha dividida em 2 para facilitar a leitura:
Requer a
-v1
bandeira pararun.js
que algumas funções ainda não façam parte da biblioteca padrão.Uso da amostra:
Esse tipo de destaque não passei tempo suficiente na biblioteca padrão. O uso de
js-bridge/1
duas vezes e a forma longa de expressão regular, bem como a invocação do mapa usandoinvoke/*
todos contribuem para que isso seja muito mais longo do que o necessário.Hora de trabalhar mais na minha biblioteca padrão, eu acho.
fonte
PHP, 79 bytes
Versão anterior PHP, 82 bytes
fonte
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
é mais -2, embora exija php 7 #Notice: String offset cast occurred in Command line code on line 1
C,
5452 bytesAssume a saída
c
já tenha o comprimento desejado.Uso:
}
Se você insistir em criar a saída, aqui está uma solução de 91 bytes :
Uso:
fonte
C, 150 bytes
Eu usei as omissões típicas dos arquivos de cabeçalho e
main()
o tipo de retorno e a declaração de retorno. Ele lança um aviso, mas é compilado sem problemas. Também usei um truque específico do GCC que permite declarações de matriz com expressões variáveis.O programa espera as seqüências de caracteres da linha de comando e, como tal, o programa deve ser executado com
./a.out string1 string2
.Ou mais legível,
fonte
Mathematica, 51 bytes
Recebe a entrada como uma matriz de duas matrizes de caracteres, com saída no mesmo formato. A função simplesmente constrói a nova matriz usando uma operação (mod 2).
fonte
QBasic 4.5, 172 bytes
Ouch, este fica doloroso com o velho QBasic ...
Curiosidade: Usar
DEFSTR
mais bytes salvos do que custa, porque agora eu poderia usar emA
vez dea$
.fonte
QBIC , 112 bytes
O QBIC pode otimizar grande parte do padrão do QBasic, mas o
MID$
mecanismo principal ainda precisa ser feito no QBasic porque o QBIC não possui uma função de substring. Ainda assim, me salva 60 bytes.fonte
MIND$
=>MIN$
no texto.Java, 68 bytes
Ungolfed and testing
fonte
APL, 12
Explicação: {...} define uma função, ⍵ é o argumento correto. A tomada (↑) cria uma matriz com as duas cadeias e depois gira cada coluna (⊖) n vezes, onde n é a parte entre parênteses (⍳⍴⊃⍵). Isso é definido como o valor mínimo do comprimento do primeiro argumento. (Ex: comprimento = 5 ==> 1 2 3 4 5). Então a primeira coluna é girada uma vez, a segunda duas vezes (voltando às posições originais), a terceira coluna três vezes, etc ...
Experimente em tryapl.org
fonte