Injeção de duas cordas para uma corda

13

Desafio

Escreva um programa que aplique uma função injetiva que aceita um par ordenado de seqüências de caracteres como entrada e uma sequência como saída. Em outras palavras, cada entrada deve mapear para uma saída exclusiva.

Específicos

  • A entrada pode ser quaisquer duas cadeias de comprimento arbitrário, mas irá consistir apenas em caracteres ASCII imprimível (códigos [32,126] ).
  • Da mesma forma, a sequência de saída não possui restrição de comprimento, mas deve consistir apenas em caracteres ASCII imprimíveis.
  • Se o seu idioma não puder lidar com cadeias de comprimento arbitrário, o programa poderá funcionar apenas teoricamente para cadeias de qualquer tamanho.
  • O mapeamento de entradas para saídas deve ser consistente entre as execuções do programa. Caso contrário, o mapeamento que você usa depende totalmente de você, desde que seja uma injeção.
  • A entrada está ordenada. Se as duas seqüências de entrada forem diferentes, elas deverão produzir uma saída diferente da que foram trocadas. stf(s,t)f(t,s)
  • Nem toda string precisa ser uma saída possível.
  • A resposta mais curta em cada idioma vence!

Casos de teste

As seguintes entradas devem resultar em diferentes saídas. Para evitar confusão, as cordas são cercadas por guillemets («») e separadas por espaços únicos.

"Olá Mundo"
«Lelho» «drowl»
"diferente"
"não é o mesmo"

«Código» «Golfe»
«Co» «deGolf»
«CodeGolf» «»

«» «»
«» «»
«» «»
«» «»
«» «»

«Abc", »« def »
«Abc» «," def »
«Abc '» «' def»
«Abc '» «' def»

«\» «" »
«\\» «\" »
sete negativos
fonte
8
Hmm, acabei de notar "Escreva um programa que ..." - observe que, por meta consenso (atualmente 46 em diante, 1 em baixo) "A restrição a apenas programas requer especificar explicitamente" programa completo "em vez de apenas" programa "" . Espero que você não tenha tentado restringir isso, mas, se o fez, precisará atualizar a postagem de acordo e abordar aqueles de nós que já enviaram funções como respostas.
Jonathan Allan
4
@ JonathanAllan A intenção era permitir funções.
negativo sete
3
Qualquer uma das strings pode estar vazia?
Shaggy
2
@ Shagy Sim, um ou ambos podem.
negativo sete
1
Podemos ter alguns casos de teste? Obrigado!
precisa saber é

Respostas:

17

brainfuck, 30 29 27 23 bytes

,[-[+.>]-[>+<---]>.-.,]

Experimente online!

As entradas são separadas por um 0x01byte.

Isso se ["foo", "bar"]transforma fUToUToUTUTbUTaUTrUT. Para recuperar as duas seqüências originais, pegue grupos de 3 caracteres, encontre o que não está na segunda letra Ue divida-o.

Maçaneta da porta
fonte
@Grimy Desculpe, incompreendido "As entradas são separadas por um byte 0x01."
Wastl
15

JavaScript (ES6), 14 bytes

Recebe a entrada como uma matriz de 2 strings. Inspirado pela resposta de Luis .

JSON.stringify

Experimente online!


JavaScript (ES6),  21  20 bytes

Toma entrada como (a)(b).

a=>b=>[a.length,a]+b

Experimente online!

Retorna o comprimento de a , seguido por vírgula, seguido da concatenação de a e b .

Arnauld
fonte
Droga! Estava prestes a usar o stringifytruque sozinho!
Shaggy
Rompe com a="hello","" b="world"ea="hello" b="","world"
Soleil
1
@ Soleil Isso daria ["\"hello\",\"\"","\"world\""]e ["\"hello\"","\"\",\"world\""].
Arnauld
1
@Arnauld a proteção de barra invertida não estará visível. A função não injeta.
Soleil
1
@ Soleil Eu não entendo o que você quer dizer. JSON.stringify()definitivamente escapa ". Veja um despejo hexadecimal .
Arnauld
15

jq -c, 0 bytes

Experimente online!

Definitivamente isso parece trapaça ...? Mas parece estar em conformidade com as regras do desafio.

Por padrão, jqproduzirá sua entrada em um formato JSON legível por humanos. O -csinalizador (compacto) indica jqa saída no estilo "compacto", que remove as novas linhas (já que o desafio proíbe o ASCII não imprimível).

Maçaneta da porta
fonte
1
OP permite a entrada de vazio, por isso não seria um "=", b = "x" dar mesma saída como uma = "x" b = ""
Gnudiff
3
@Gnudiff Como assim? Eles dariam ["","x"]e ["x",""]respectivamente
Doorknob
1
Desculpe, você está certo.
Gnudiff 28/09/19
7

Python 3 , 3 bytes

str

Uma função (incorporada) que, dada uma lista das duas cadeias, fornece uma representação da cadeia

Experimente online!

Jonathan Allan
fonte
2
Mais conciso do que Pyth ...
Trichoplax
Bem, a solução Pyth de 1 byte `faz a mesma coisa.
Anders Kaseorg 01/10/19
5

Japonês -S , 3 bytes

Eu ainda sinto que devo estar perdendo alguma coisa aqui ...

®mc

Tente

Possivelmente 2 bytes:

mq

Tente

Ou esticá-lo com este 1 byter:

U

Tente

A primeira versão mapeia cada cadeia de caracteres da matriz para seus pontos de código e os envia com um espaço.

A segunda versão divide cada seqüência de caracteres em uma matriz de caracteres e as gera juntas com um espaço.

E a terceira versão, que parece trapaça, apenas envia a entrada com a -Qbandeira fazendo o trabalho pesado da srringifymesma.

Shaggy
fonte
5

Pitão , 4 bytes

jNmC

Experimente online!

Isso converte cada seqüência de caracteres na base 256 e as une em ordem com a ". Como os resultados são cada número, os "separa sem ambiguidade e as seqüências originais podem ser recuperadas mCsdczN.

FryAmTheEggman
fonte
1
O @AndersKaseorg sugere um byter .
Kevin Cruijssen 01/10/19
@KevinCruijssen Estou ciente disso desde alguns minutos depois de postar isso, mas prefiro o espírito desta solução. Obrigado por trazê-lo de qualquer maneira, e definitivamente se sentir livre para postar-lo sozinho :)
FryAmTheEggman
Eu também gosto mais da sua resposta. :) E nah, eu nem conheço Pyth. Se você quiser, pode postá-lo como uma resposta separada (ou uma resposta combinada editando esta), caso contrário Anders Kaseorg pode publicá-la, já que ele foi quem mencionou no comentário.
Kevin Cruijssen 01/10/19
4

T-SQL, 38 bytes

SELECT QUOTENAME(a)+QUOTENAME(b)FROM i

Euvarcharumab

Usos QUOTENAME, que circundam as cordas []e também escapam de qualquer colchete interno. Deve mapear para uma saída exclusiva.

BradC
fonte
1
Mesmo tamanho no MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Experimente online
Night2 27/09/19
4

Zsh , 7 bytes

<<<$@:q

Experimente online!

Une implicitamente os argumentos aos espaços. O qmodificador diz ao zsh para citar os argumentos, que escapam crucialmente dos espaços, garantindo que um espaço sem escape separa sem ambiguidade os dois argumentos.

(Sem q, "a " "b"e "a" " b"ambos renderiam "a b".)

GammaFunction
fonte
3

MATL , 1 byte

j

O código pega uma matriz de duas cadeias como entrada e gera uma representação de cadeia dessa matriz.

Experimente online!

Explicação

O código simplesmente lê a entrada como uma sequência, sem avaliação.

Luis Mendo
fonte
1
Isso realmente leva duas strings como entrada? Parece que isso apenas imprime a entrada, seja ela qual for. Experimente online!
James
1
@ DJ Ele apenas lê entradas não avaliadas, então lê qualquer coisa. É uma brecha? Uma abordagem mais padrão seria pegar a entrada avaliada como uma matriz e depois converter em representação de string. Mas o resultado seria o mesmo que o meu código, então eu diria que a distinção é não observável
Luis Mendo
3

Gelatina , 2 bytes

ŒṘ

Um link monádico que aceita uma lista de duas listas de caracteres como argumento, o que gera uma única lista de caracteres.

Experimente online!

Quão?

É um recurso interno para obter a representação de strings do Python, simples.

Jonathan Allan
fonte
3

Haskell, 4 bytes

show

O Haskell embutido para transformar as coisas em strings. A entrada é tomada como um par de strings.

Experimente online!

nimi
fonte
3

05AB1E , 2 bytes

₁ö

Experimente online! Interpreta cada sequência como um número inteiro de base 256 e, em seguida, imprime as duas no formulário [1, 2].


05AB1E, 1 byte (validade desconhecida)

â

Experimente online!

Leva consigo o produto cartesiano da entrada. As aspas na entrada não são escapadas, o que pode causar confusão. Forcei brutalmente todas as combinações de até 12 ", "e "], ["não encontrei nenhuma colisão; no entanto, não posso provar que não há colisões para cadeias mais longas. Se alguém puder apresentar uma prova ou contra-exemplo, eu apreciaria muito!

O trivial 0-byter falha devido a aspas não serem escapadas: entradas ( ", ", sequência vazia) e (sequência vazia ", ") produzem a saída ["", "", ""].

O 1 byter º(espelhar cada sequência de entrada) também falha por causa disso: inputs ( ", "" ,", string vazia) e (string vazia " ,"", ") produzem a saída ["", "" ,"", "" ,"", ""].

Grimmy
fonte
3

C # com 26 bytes (graças a Lukas Lang, Kevin Cruijssen e Jo King)

a=>b=>$"{a.Length}.{a}{b}"

tio.run lambda

Soleil
fonte
1
Por favor, considere usar tio.run
Ver Nick diz Reinstate Monica
Isso ainda interrompe ("a <>", "b") e ("a", "<> b") - observe que é impossível lidar com todos os casos se você estiver apenas concatenando as entradas, não importa o que você queira. colocar entre / em torno deles - você precisa modificar as cadeias de alguma forma
Lukas Lang
1
Desculpe, ainda não: ("1", "11111111111") e ("11111111111", "1") - o que funciona por outro lado (e é ainda mais curto) é isso $"{a.Length}.{a}{b}"- você sempre pode extrair ae bdisso sem qualquer ambigüidade (apenas ler até o primeiro .para obter o comprimento de a, bé, em seguida, o resto
Lukas Lang
1
@LukasLang Great. Obrigado pelos acompanhamentos.
Soleil
1
Muito obrigado @JoKing!
Soleil
2

Carvão , 12 bytes

⪫E²⭆⪪S"⪫""λ,

Experimente online! Link é a versão detalhada do código. Explicação:

 E²             Repeat twice
     S          Input a string
    ⪪ "         Split it on `"`s
   ⭆            Map over each piece and join
       ⪫""λ     Wrap each piece in `"`s
⪫          ,    Join the two results with a `,`
                Implicitly print
Neil
fonte
2

PowerShell , 22 bytes

Muitas correções graças ao mazzy

"$($args|% le*)"+$args

Experimente online!

Pegue cinco, oh meu.

Veskah
fonte
"ab" "c"e "a" "bc"ambos produzem a mesma saída.
BradC 27/09/19
@JoKing As coisas devem ser consertadas. Esperançosamente.
Veskah 28/09/19
1
15 bytes com $ OFS ?
Andrei Odegov
1

CSS + HTML, 55 + 20 = 75 bytes

Forneça as entradas no HTML depois das <code>tags. Injeta visualmente as letras uma a uma de cada entrada na saída. Quando uma entrada é maior que a outra, os espaços visuais são mostrados para as letras ausentes da entrada mais curta. Também é adicionada uma vírgula em HTML para forçar a exclusividade da saída visual (espero).

*{position:absolute;letter-spacing:9px}code>code{left:9px
<code>abcdefg<code>hijklmn</code>,

Night2
fonte
1

Perl 6 , 6 3 bytes

&dd

Experimente online!

Emite a representação do objeto para STDERR.

Brincadeira
fonte
Eu não estou familiarizado o suficiente com Perl - como você insere uma string contendo espaços aqui?
negativo sete
2
@negativeseven assim
Grimmy
@negativeseven Sim, desculpe, eu estava apenas usando uma sintaxe de atalho para listas de strings. Você pode fazer isso de uma maneira típica como["Hello, ", "World!"]
Jo King
1

Lua , 27 bytes

print(('%q%q'):format(...))

Experimente online!

Programa completo, tome entrada como argumentos.

Inspirado na resposta zsh, como também usa %q modificador para usar o mecanismo interno de segurança.

Além disso, eu posso pensar em apenas

('%q%q'):format

mas não tenho certeza se essa é uma resposta aceitável.

val diz Reinstate Monica
fonte
Não acho que o segundo seja válido, pois ('%q%q'):formatnão resulta em um objeto que pode, por exemplo, ser atribuído a uma variável. Apenas causa um erro de sintaxe por si próprio. A sintaxe de cólon é apenas um atalho para '%q%q'.format('%q%q', ...)e que Lua não permite a aplicação parcial para funções
Jo rei
@ JoKing Sim, você está certo, eu acho.
val diz Reinstate Monica
1

sed , 19 bytes

N
s/ /. /g
s/\n/: /

Experimente online!

N          # append the second string into the pattern space
s/ /. /g   # prefix all spaces with ".". Now ": " will not occur in the stiring
s/\n/: /   # replace the newline with ": "
GammaFunction
fonte
1

C (gcc) , 59 bytes

Agradeço a Grimy pela sugestão.

Pega uma matriz de sequências de entrada (da qual "2" é o número correto para esse desafio) e imprime seus valores de caracteres, incluindo o final NUL. Tecnicamente, o %pformatador usado por printfé para ponteiros, mas funciona bem para exibir valores hexadecimais de números inteiros arbitrários, se você não for exigente quanto à aparência deles!

f(s,t)char**s,*t;{for(;t=*s++;)for(;printf("%p",*t++)^5;);}

Experimente online!

ErikF
fonte
Agradável! Aqui está um 59 .
Grimmy
0

Bash , 11 bytes

echo ${@@Q}

Experimente online!

${parameter@Q}cita o parâmetro para reutilização como entrada. No caso de uma matriz, ela cita cada elemento.

GammaFunction
fonte