"Multiplicar" duas strings


29

Isso foi inspirado por uma função que adicionei recentemente à minha linguagem Add ++ . Portanto, enviarei uma resposta curta em Add ++, mas não a aceitarei se vencer (não seria justo)

Você não odeia quando pode multiplicar números, mas não seqüências de caracteres? Então você deve corrigir isso, certo?

Você deve escrever uma função ou programa completo que use duas cadeias não vazias como entrada e saída da versão multiplicada.

Como você multiplica seqüências de caracteres? Eu vou te dizer!

Para multiplicar duas cadeias, você pega duas e compara cada caractere. O caractere com o ponto de código mais alto é então adicionado à saída. Se forem iguais, basta adicionar o caractere à saída.

Não é garantido que as cordas tenham o mesmo comprimento. Se os comprimentos forem diferentes, o comprimento da sequência final será o comprimento da sequência mais curta. A entrada sempre será minúscula e pode conter qualquer caractere no intervalo ASCII imprimível ( 0x20 - 0x7E), excluindo letras maiúsculas.

Você pode produzir em qualquer formato razoável, como string, lista etc. Seja sensato, números inteiros não são uma maneira sensata de produzir neste desafio.

Com entradas de hello,e world!, é assim que funciona

hello,
world!

w > h so "w" is added ("w")
o > e so "o" is added ("wo")
r > l so "r" is added ("wor")
l = l so "l" is added ("worl")
d < o so "o" is added ("worlo")
! < , so "," is added ("worlo,")

Portanto, a saída final para hello,e world!seria worlo,!

Mais casos de teste

(sem etapas)

input1
input2 => output

programming puzzles & code golf!?
not yet graduated, needs a rehaul => prtgyetmirgduuzzlesneedsde rolful

king
object => oing

blended
bold => boln

lab0ur win.
the "super bowl" => the0usuwir.

donald j.
trumfefe! => trumlefj.

Este é um então o código mais curto vence! Luok!


35
Esse é o máximo elementar das strings, certo? Isso não parece se multiplicar.
Xnor

5
Nitpick: O PPCG se formou, ainda não recebemos um novo design.
Dennis

Respostas:


53

Haskell, 11 bytes

zipWith max

Experimente online!

Não há muito o que explicar.


7
E eu pensei Mathematica teve estranhas built-ins
Mr. Xcoder

@ Mr.Xcoder Mathematica tem zipWith, ele é chamado MapThread
michi7x7

2
@ Mr.Xcoder, na verdade, zipWithnão é muito estranho. É uma primitiva funcional bastante comum. A idéia de "compactar" duas listas juntas surge em muitos problemas e, quando você faz isso, geralmente deseja aplicar alguma função aos itens de 2 elementos resultantes, daí a parte "com".
Jonah


6

Perl 6 , 22 bytes

{[~] [Zmax] @_».comb}

Como bônus, ele aceita qualquer número de multiplicandos, não apenas dois.


6

Japonês , 16 bytes

ñl g îUy ®¬ñ oÃq

Teste online! Recebe a entrada como uma matriz de duas seqüências.

A falta de mínimos e máximos embutidos prejudica Japt aqui, mas ainda consegue obter uma pontuação um tanto decente ...

Explicação

 ñl g îUy ®   ¬ ñ oà q
Uñl g îUy mZ{Zq ñ o} q
                        // Implicit: U = input array     ["object", "king"]
       Uy               // Transpose the strings of U.   ["ok", "bi", "jn", "eg", "c ", "t "]
          mZ{      }    // Map each string Z to
             Zq ñ o     //   the larger of the two chars. (Literally Z.split().sort().pop())
                        //                               ["o", "i", "n", "g", "c", "t"]
                     q  // Join into a single string.    "oingct"
Uñl g                   // Sort the two input strings by length and take the shorter.
      î                 // Trim the previous result to this length.
                        //            "king"î"oingct" -> "oing"
                        // Implicit: output result of last expression

6

Gelatina , 5 bytes

żœ-"«

Experimente online!

Como funciona

żœ-"«  Main link. Arguemts: s, t (strings)

ż      Zipwith; form all pairs of corresponding characters from s and t.
       If one of the strings is longer than the other, its extra characters are 
       appended to the array of pairs.
    «  Dyadic minimum; get all minima of corresponding characters.
       This yields the characters themselves for unmatched characters.
 œ-"   Zipwith multiset subtraction; remove a single occurrence of the minimum from
       each character pair/singleton.
       This yields the maximum for pairs, but an empty string for singletons.

Exemplo

Let s = misturados e t = negrito .

żrendimentos ["bb", "lo", "el", "nd", 'd', 'e', 'd']. Os últimos três elementos são caracteres.

«é o vetor diádico vetorizante, portanto ele produz ['b', 'l', 'e', 'd', 'd', 'e', 'd'].

œ-"remove exatamente uma ocorrência do n ° de caracteres no segundo agrupamento do n th cadeia / caracter na primeira matriz, obtendo-se ["b", "o", "l", "n", "", "", ""]. œ-é o átomo de subtração multiset , e o rápido o "torna vetorizado.

Quando impresso, simplesmente lê boln .


Então, isso é fechar o zíper e, em seguida, tirar a diferença de vários conjuntos de algo, e existem algumas aspas duplas agradáveis ​​de significado misterioso e, finalmente, o mínimo. Bom ... Explicação, por favor? : D
Leo

11
Eu adicionei um exemplo trabalhado.
Dennis


6

Alice , 8 bytes

/oI\
@m+

Experimente online!

Explicação

Alice também possui esse operador (que chamei de sobreposição ), mas não limita a saída ao comprimento da string mais curta (em vez disso, os caracteres restantes da string mais longa são anexados). No entanto, ele também tem um operador para truncar a mais longa das duas seqüências para o comprimento da mais curta.

/   Reflect to SE, switch to Ordinal. The IP bounces diagonally up and down
    through the code.
m   Truncate, doesn't really do anything right now.
I   Read a line of input.
    The IP bounces off the bottom right corner and turns around.
I   Read another line of input.
m   Truncate the longer of the two input lines to the length of the shorter.
+   Superimpose: compute their elementwise maximum. 
o   Output the result.
@   Terminate the program.

6

Retina , 28 bytes

{O^`
G`.
^.+$

M!\*`^.
Rm`^.

Experimente online!

Explicação

{O^`

Ele {informa ao Retina para executar o programa inteiro em um loop até que ele não altere a string de trabalho. Otorna isso um estágio de classificação que classifica linhas não vazias por padrão. A ^opção reverte o resultado. Com efeito, obtemos um tipo inverso das duas linhas, se não estiverem vazias, colocando a linha com o caractere principal maior no topo.

G`.

Descarte linhas vazias, se houver alguma.

^.*$

Se restar apenas uma linha, uma das linhas estava vazia e removemos a outra também para interromper o processo.

M!\*`^.

Muitas configurações estão acontecendo aqui. Isso corresponde ( M) ao primeiro caractere da string de trabalho ( ^.), retorna ( !), imprime-o sem um avanço de linha à direita ( \) e depois reverte a string de trabalho para seu valor anterior ( *). Em outras palavras, simplesmente imprimimos o primeiro caractere da string de trabalho (que é o caractere inicial máximo) sem realmente alterar a string.

Rm`^.

Finalmente, removemos o primeiro caractere de cada linha, para que a próxima iteração processe o próximo caractere.


Quando você comentou sobre quão altas são as respostas dos monólitos, ocorreu-me que minha resposta a essa pergunta era longa demais e que talvez eu estivesse transpondo ineficientemente. Depois de analisar como a sua sugestão de transposição funcionava, decidi que, afinal, não era apropriado para essa pergunta. Eu então criei uma nova abordagem que me salvou 19 bytes ... e depois rolei para baixo para descobrir que você já tinha uma versão melhor ...
Neil

Você pode salvar 3 bytes, pois isso G`.é desnecessário, embora isso produza uma nova linha extra que você pode remover usando ^.+¶$ou prefixando \a no início da resposta.
314 Neil

@ Neil Oh bom ponto. Eu também poderia usar o commit mais recente (que ainda não está no TIO e provavelmente não demorará um tempo), onde tornei a impressão sem avanço de linha à direita (eu também poderia largar o outro \).
Martin Ender


6

JavaScript (ES6), 47 45 bytes

f=
(a,b)=>a.replace(/./g,(c,i)=>c>b[i]?c:[b[i]])
<div oninput=o.textContent=f(a.value,b.value)><input id=a><input id=b><pre id=o>

Convenientemente c>b[i]retorna falso após o final de b. Editar: salvou 2 bytes graças a @ETHproductions.


Aqui no meu celular esse código acima não pode ser executado. Na área de trabalho do PC, os exemplos acima, eu digo, podem funcionar bem, mas não permitem alterar a entrada de funções ... Por que não usar o Tio?
RosLuP

@RosLuP Quando a entrada é simples (neste caso, 2 picadas), prefiro usar um snippet de pilha que normalmente facilita a alteração das entradas e a saída é atualizada dinamicamente também.
Neil


5

Mathematica, 78 bytes

FromCharacterCode[Max/@Thread[#~Take~Min[Length/@x]&/@(x=ToCharacterCode@#)]]&

Já existe outra resposta no Mathematica . Esta resposta recebe a entrada como uma lista de cadeias, portanto /@pode ser usada em #vez de {##}. E podemos apenas Mapo nome longo da função no objeto, em vez de atribuí-lo às variáveis. (de fato, cada nome de símbolo interno do Mathematica é usado no máximo uma vez na função)


5

Java 8, 124 120 117 63 bytes

a->b->{for(int i=0;;i++)System.out.print(a[i]>b[i]?a[i]:b[i]);}

-4 bytes graças a @ Khaled.K .
-3 bytes graças a @Jakob .

As entradas são duas matrizes de caracteres e param com um ArrayIndexOutOfBoundsException.

Explicação:

Experimente aqui.

a->b->{                       // Method with two char-array parameters and no return-type
  for(int i=0;;i++)           //  Loop `i` from 0 up indefinitely (until an error is given)
    System.out.print(         //   Print:
      a[i]>b[i]?a[i]:b[i]);}  //    The character that has the highest unicode value

4

C #, 81 78 bytes

a=>b=>{var s="";try{for(int q=0;;q++)s+=a[q]>b[q]?a[q]:b[q];}catch{}return s;}

C # está implícito charna intconversão (porque a charé na verdade uma parte intinferior), o que é bom e, em vez de procurar a string mais curta, tente até a falha


11
Bata em mim! No entanto, salve um byte com currying a=>b=>compilando para a Func<string, Func<string, string>>. Você pode remover as chaves ao redor do loop for para economizar 2 bytes.
TheLethalCoder

Nota lateral: C# has implicit char to int conversioné verdadeira porque a charé uma parte intinferior.
TheLethalCoder

@TheLethalCoder: Não é bem assim. sizeof(int) == 4mas sizeof(char) == 2.
recursivo

4

MATL , 8 bytes

otX>cwA)

Entrada é uma matriz de células de cadeias, no formato {'abcd' 'efg'}

Experimente online!

Como um aparte, isso também funciona para mais de duas seqüências .

Explicação

Considere entrada {'blended' 'bold'}. A pilha é mostrada de cabeça para baixo, com os elementos mais recentes abaixo.

o    % Implicitly input a cell array of strongs. Convert to numeric
     % vector of code points. This right-pads with zeros if needed
     %   STACK: [98 108 101 110 100 101 100;
                 98 111 108 100   0   0   0]
tX>  % Duplicate. Maximum of each column
     %   STACK: [98 108 101 110 100 101 100;
                 98 111 108 100   0   0   0],
                [98 111 108 110 100 101 100]
c    % Convert to char
     %   STACK: [98 108 101 110 100 101 100;
                 98 111 108 100   0   0   0],
                'bolnded'
w    % Swap
     %   STACK: 'bolnded'
                [98 108 101 110 100 101 100;
                 98 111 108 100   0   0   0]
A    % All: gives true (shown as 1) for columns containing only nonzeros
     %   STACK: 'bolnded'
                [1 1 1 1 0 0 0]
)    % Use as logical index (mask). Implicitly display
     %   STACK: 'boln'

4

R, 103 bytes

Código:

n=min(sapply(y<-strsplit(scan(,"",sep="\n"),""),length));cat(mapply(max,el(y)[1:n],y[[2]][1:n]),sep="")

Casos de teste:

> n=min(sapply(y<-strsplit(scan(,"",sep="\n"),""),length));cat(mapply(max,el(y)[1:n],y[[2]][1:n]),sep="")
1: programming puzzles & code golf!?
2: not yet graduated, needs a rehaul
3: 
Read 2 items
prtgretmirgduuzzlesneedsde rolful
> x <- scan(,"",sep=NULL)
1: asd asd 
3: 
Read 2 items
> n=min(sapply(y<-strsplit(scan(,"",sep="\n"),""),length));cat(mapply(max,el(y)[1:n],y[[2]][1:n]),sep="")
1: king
2: object
3: 
Read 2 items
oing
> n=min(sapply(y<-strsplit(scan(,"",sep="\n"),""),length));cat(mapply(max,el(y)[1:n],y[[2]][1:n]),sep="")
1: lab0ur win.
2: the "super bowl"
3: 
Read 2 items
the0usuwir.

Hã? Max funciona assim? TIL
JAD



4

V , 28, 24 , 21 bytes

Í./&ò
dd{JdêHPÎúúx
Íî

Experimente online!

Hexdump:

00000000: cd2e 2f26 f20a 6464 7b4a 64ea 4850 cefa  ../&..dd{Jd.HP..
00000010: fa78 0acd ee                             .x...

Três bytes salvos graças a @ nmjcman101!

Explicação:

Í             " Globally substitute:
 .            "   Any character
  /           " With:
   &          "   That character
    ò         "   And a newline
dd            " Delete this line
  {           " Move to the first empty line
   J          " Delete this line
    dê        " Columnwise delete the second word
      HP      " Move to the first line, and paste the column we just deleted
        Î     " On every line:
         úú   "   Sort the line by ASCII value
           x  "   And delete the first character
Í             " Remove all:
 î            "   Newlines

É dGnecessário? Todas as novas linhas não são removidas Íî?
precisa saber é o seguinte

@ nmjcman101 É necessário caso as seqüências tenham comprimentos diferentes.
DJMcMayhem

3

CJam , 12 bytes

q~z{1/~e>o}%

Entrada é uma lista de duas cadeias. O programa sai com um erro (após produzir a saída correta) se as duas seqüências tiverem comprimentos diferentes.

Experimente online!

Explicação

q~              e# Read input and evaluate
  z             e# Zip: list of strings of length 2, or 1 if one string is shorter
   {      }%    e# Map this block over list
    1/          e# Split the string into array of (1 or 2) chars
      ~         e# Dump the chars onto the stack
       e>       e# Maximum of two chars. Error if there is only one char
         o      e# Output immediately, in case the program will error

3

Clojure, 31 bytes

#(map(comp last sort list)% %2)

Yay para a composição da função :) Retorna uma sequência de caracteres em vez de uma string, mas eles geralmente funcionam da mesma maneira no Clojure, exceto ao imprimir ou corresponder a expressões regulares.

Infelizmente maxnão funciona com personagens.


maxnão funciona, mas max-keyfunciona. #(map(partial max-key int)% %2)É exatamente a mesma contagem de bytes, no entanto.
madstap

Oh legal, eu tinha esquecido disso. Muito mais simples do que por exemplo (ffirst (sort-by second ...).
NikoNyrh

3

Javascript (ES2015), 66 63 49 bytes

a=>b=>[...a].map((c,i)=>c>b[i]?c:b[i]||'').join``

Explicação:

a=>b=>                       // Function with two string parameters
  [...a]                     // Split a into array of characters
    .map((c, i) =>           // Iterate over array
      c>b[i] ? c : b[i]||'') //   Use the character with the larger unicode value until the end of the larger string
    .join``                  // Join the array into a string

Versões prévias:

//ES2015
a=>b=>[...a].map((c,i)=>c>b[i]?c:b[i]).slice(0,b.length).join``    //63
a=>b=>a.split``.map((c,i)=>c>b[i]?c:b[i]).slice(0,b.length).join`` //66
a=>b=>a.split``.map((c,i)=>c>b[i]?c:b[i]).slice(0,Math.min(a.length,b.length)).join``   //85
a=>b=>{for(i=-1,c='';++i<Math.min(a.length,b.length);)c+=a[i]>b[i]?a[i]:b[i];return c}  //86
a=>b=>{for(i=-1,c='';++i<Math.min(a.length,b.length);)c+=a[d='charCodeAt'](i)>b[d](i)?a[i]:b[i];return c}   //105
a=>b=>a.split``.map((c,i)=>c[d='charCodeAt']()>b[d](i)?c:b[i]).slice(0,Math.min(a.length,b.length)).join``  //106

//With array comprehensions
a=>b=>[for(i of a.split``.map((c,i)=>c>b[i]?c:b[i]))i].slice(0,b.length).join``                             //79
a=>b=>[for(i of a.split``.map((c,i)=>c>b[i]?c:b[i]))i].slice(0,Math.min(a.length,b.length)).join``          //98
a=>b=>[for(i of ' '.repeat(Math.min(a.length,b.length)).split``.map((_,i)=>a[i]>b[i]?a[i]:b[i]))i].join``   //105
a=>b=>[for(i of Array.apply(0,Array(Math.min(a.length,b.length))).map((_,i)=>a[i]>b[i]?a[i]:b[i]))i].join`` //107
a=>b=>[for(i of a.split``.map((c,i)=>c[d='charCodeAt']()>b[d](i)?c:b[i]))i].slice(0,Math.min(a.length,b.length)).join``        //119
a=>b=>[for(i of ' '.repeat(Math.min(a.length,b.length)).split``.map((_,i)=>a[d='charCodeAt'](i)>b[d](i)?a[i]:b[i]))i].join``   //124
a=>b=>[for(i of Array.apply(0,Array(Math.min(a.length,b.length))).map((_,i)=>a[d='charCodeAt'](i)>b[d](i)?a[i]:b[i]))i].join`` //127

Bem-vindo ao PPCG! Bom primeiro post!
Rɪᴋᴇʀ

3

Retina , 55 36 bytes

^
¶
{O`¶.*
}`¶.(.*)¶(.)
$2¶$1¶
1!`.*

Experimente online! Explicação: Uma linha é prefixada para conter o resultado. Enquanto as duas strings ainda têm caracteres restantes, as entradas são classificadas e o caractere inicial com o ponto de código mais alto é movido para o resultado enquanto o outro caractere principal é excluído. Finalmente, o resultado é impresso.


3

Casca , 2 bytes

z▲

Experimente online!

"Ungolfed" / Explained

Faz uso zip fdisso trunca a lista mais curta, de modo que sempre haja dois argumentos para f, por exemplo zip f [1,2] [3,4,5] == zip f [1,2] [3,4] == [f 1 3, f 2 4]:

z   -- zip the implicit lists A,B with  - e.g. "ab" "bcd" (lists of characters)
 ▲  -- maximum                          -      [max 'a' 'b', max 'b' 'c']
    -- implicitly print the result      -      "bc"


2

PowerShell, 75 bytes

-join(1..(($a,$b=$args)|sort l*)[0].length|%{(,$a[$_-1],$b[$_-1]|sort)[1]})
#            ^input array unpack
#       ^string index generation offset by 1
#                         ^sort by length property, so output length matches shorter input
#                                           ^loop over indices
#                                       max of the two characters^
# ^output join

Salve como arquivo .ps1 e execute

PS C:\> .\Get-MultipliedString.ps1 'hello,' 'world!'
worlo,

Anteriormente, 78 bytes:

$i=0;-join$(while(($a=$args[0][$i])-and($b=$args[1][$i++])){($a,$b)[$b-gt$a]})

2

J, 25 bytes

>./&.(a.&i.)@(<.&#{."1,:)

explicação

metade dos bytes é resolvida, garantindo que as duas entradas tenham o menor comprimento de entrada (adoraria ver uma melhoria nessa parte, se alguém tiver uma):

(<.&#{."1,:)

<.&#é o mínimo dos dois comprimentos e {."1,:leva muitos caracteres de ambas as linhas da tabela de 2 linhas que consistem na sequência esquerda empilhada na parte superior direita.

>./&.(a.&i.)

Use o verbo Under &.para converter cada caractere em seu índice ascii, use o máximo dos dois números e depois converta novamente em caracteres.

Experimente online!


11
21 bytes[:>./&.(3&u:)<.&#$&>;
milhas

@miles, combinação elegante de trem e conjunção - preciso usar mais esse truque para evitar parênteses. também u:foi um TIL para mim.
Jonah

2

Coleções Java 8 + Eclipse, 70 64 bytes

a->b->a.zip(b).collect(p->(char)Math.max(p.getOne(),p.getTwo()))

ae bsão MutableList<Character>das coleções eclipse.


2

Adicionar ++ , 8 bytes

D,f,@@,^

Experimente online!

Nas versões 0.4 a 1.11, ^expoente dois números ou "multiplica" duas seqüências de caracteres, dependendo do tipo dos argumentos.


Isso é mais contra o espírito do código-golfe, postar uma pergunta sabendo que seu próprio idioma (que ninguém mais usa) possui um built-in que lhe confere um monopólio. Felizmente, a concisão de Jelly vence novamente.
FlipTack

12
@FlipTack você leu a primeira linha da pergunta? Mesmo se fosse 0 bytes, não venceria.
caird coinheringaahing

11
@ Stephenos Parece que o recurso inspirou o desafio, e não o contrário. O rótulo não concorrente é reservado para respostas que usam idiomas ou recursos que foram implementados somente após o desafio.
Martin Ender

1

Mathematica, 102 bytes

T=ToCharacterCode;L=Length;(a=T@#;b=T@#2;FromCharacterCode@Table[Max[a[[i]],b[[i]]],{i,L@a~Min~L@b}])&


entrada

["misturado", "negrito"]


L@a~Min~L@bsalva um byte
Greg Martin

1

APL (Dyalog) , 22 bytes

Toma duas (ou mais!) Seqüências de caracteres como argumento correto.

{⎕UCS⌈⌿⎕UCS↑⍵↑¨⍨⌊/≢¨⍵}

Experimente online!

{ uma função anônima em que o argumento correto é representado por

⎕UCS os símbolos a partir da L nicode C haracter S et que correspondem ao

⌈⌿ valor máximo em cada coluna de

⎕UCS os pontos de código a partir da L nicode C haracter S et pela

 matrified (matriz da lista de strings)

 argumentos

↑¨⍨ cada um tampado no

⌊/ mínimo de

≢¨ os comprimentos

 dos argumentos

}

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.