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»

«\» «" »
«\\» «\" »

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.


@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 .


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).


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


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.


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.


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.


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".)


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.


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.


3

Haskell, 4 bytes

show

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

Experimente online!


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 ["", "" ,"", "" ,"", ""].


3

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

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

tio.run lambda


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




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>,



1

Perl 6 , 6 3 bytes

&dd

Experimente online!

Emite a representação do objeto para STDERR.


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.


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 ": "


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!


Agradável! Aqui está um 59 .
Grimmy




Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.