«Умножить» две строки


29

Это было вдохновлено функцией, которую я недавно добавил в свой язык Add ++ . Поэтому я добавлю короткий ответ в Add ++, но я не приму его, если он победит (это было бы нечестно)

Разве ты не ненавидишь, когда умножаешь числа, а не строки? Таким образом, вы должны исправить это, верно?

Вы должны написать функцию или полную программу, которая принимает две непустые строки в качестве входных данных и выводит их умноженную версию.

Как вы умножаете строки? Я вам скажу!

Чтобы умножить две строки, вы берете две строки и сравниваете каждый символ. Символ с наивысшей кодовой точкой затем добавляется к выводу. Если они равны, просто добавьте символ к выводу.

Строки не гарантируются равными по длине. Если длины отличаются, длина последней строки равна длине самой короткой строки. Ввод всегда будет в нижнем регистре и может содержать любой символ в диапазоне ASCII для печати ( 0x20 - 0x7E), за исключением заглавных букв.

Вы можете выводить данные в любом приемлемом формате, таком как строка, список и т. Д. Будьте внимательны, целые числа не являются разумным способом вывода в этой задаче.

С помощью входов hello,и world!вот как это работает

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

Так что окончательный вывод для hello,и world!будет worlo,!

Больше тестов

(без шагов)

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.

Это поэтому выигрывает самый короткий код! Luok!


35
Это поэлементный максимум строк, верно? Это не похоже на умножение.
xnor

5
Nitpick: PPCG закончил, мы просто еще не получили новый дизайн.
Деннис

Ответы:


53

Haskell, 11 байт

zipWith max

Попробуйте онлайн!

Ничего особенного объяснить.


7
И я подумал, что у Mathematica есть странные встроенные модули
Mr. Xcoder

@ Mr.Xcoder Mathematica имеет zipWith, он называется MapThread
michi7x7

2
@ Mr.Xcoder на самом деле, zipWithне так уж странно. Это довольно распространенный функциональный примитив. Идея «сжать» два списка вместе возникает во многих проблемах, и как только вы это сделаете, вам часто захочется применить некоторую функцию к результирующим 2-элементным элементам, отсюда и часть «с».
Иона


6

Perl 6 , 22 байта

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

В качестве бонуса он принимает любое количество множителей, а не только два.


6

Japt , 16 байт

ñl g îUy ®¬ñ oÃq

Проверьте это онлайн! Принимает ввод как массив из двух строк.

Отсутствие встроенных модулей минимума и максимума вредит Джапту, но ему все же удается добиться несколько приличного результата ...

объяснение

 ñ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

Желе , 5 байт

żœ-"«

Попробуйте онлайн!

Как это работает

żœ-"«  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.

пример

Пусть s = смешанный и t = жирный .

żдоходность ["bb", "lo", "el", "nd", 'd', 'e', 'd']. Последние три элемента являются символами.

«это векторизация, диадический минимум, поэтому он дает ['b', 'l', 'e', 'd', 'd', 'e', 'd'].

œ-"удаляет ровно одно вхождение n- го символа во втором массиве из n- й строки / символа в первом массиве, приводя к результату ["b", "o", "l", "n", "", "", ""]. œ-является мультимножественным атомом вычитания , и быстрый "делает его векторизованным.

Когда напечатано, это просто читает boln .


Итак, это сжатие, затем взятие мультимножественной разницы чего-либо, затем есть несколько хороших двойных кавычек таинственного значения и, наконец, минимум. Хорошо ... Объяснение, пожалуйста? : D
Лев

1
Я добавил работающий пример.
Деннис


6

Алиса , 8 байт

/oI\
@m+

Попробуйте онлайн!

объяснение

У Алисы также есть этот оператор (который я назвал наложением ), но он не ограничивает вывод длиной более короткой строки (вместо этого добавляются оставшиеся символы более длинной строки). Тем не менее, он также имеет оператор для усечения более длинной из двух строк до длины более короткой.

/   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

Сетчатка , 28 байт

{O^`
G`.
^.+$

M!\*`^.
Rm`^.

Попробуйте онлайн!

объяснение

{O^`

{Говорит Retina , чтобы запустить всю программу в цикле до тех пор, пока не сможет изменить рабочую строку. Oделает это этапом сортировки, который по умолчанию сортирует непустые строки. ^Опция меняет результат. Таким образом, по сути, мы получаем обратную сортировку двух строк, если они не пустые, помещая строку с большим начальным символом вверху.

G`.

Откажитесь от пустых строк, если они есть.

^.*$

Если осталась только одна строка, одна из строк была пуста, и мы также удаляем другую, чтобы остановить процесс.

M!\*`^.

Здесь много настроек Это соответствует ( M) первому символу в рабочей строке ( ^.), возвращает его ( !), печатает его без завершающего перевода строки ( \), а затем возвращает рабочую строку к ее предыдущему значению ( *). Другими словами, мы просто печатаем первый символ рабочей строки (который является максимальным начальным символом) без фактического изменения строки.

Rm`^.

Наконец, мы удаляем первый символ из каждой строки, чтобы следующая итерация обрабатывала следующий символ.


Когда вы прокомментировали мой ответ на вопрос, насколько высоки монолиты, мне пришло в голову, что мой ответ на этот вопрос был слишком длинным и что, возможно, я переставлял неэффективно. Посмотрев, как сработало ваше предложение о транспозиции, я решил, что в конце концов он не подходит для этого вопроса. Затем я придумал новый подход, который сэкономил мне 19 байт ... и затем прокрутил вниз, чтобы найти, что вы уже придумали лучшую версию ...
Нил

Вы можете сохранить 3 байта, так как в G`.этом нет необходимости, хотя при этом выводится дополнительный символ новой строки, который можно удалить с помощью ^.+¶$или с помощью префикса a \в начале ответа.
Нил

@ Нил О, хорошо. Я также мог бы использовать последний коммит (которого пока нет на TIO и, вероятно, не будет), где я сделал печать без конечного перевода строки по умолчанию (тогда я мог бы также удалить другой \).
Мартин Эндер


6

JavaScript (ES6), 47 45 байт

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>

Удобно c>b[i]возвращает ложь за конец b. Редактировать: 2 байта сохранены благодаря @ETHproductions.


Здесь в моем мобильном телефоне этот код не может быть выполнен. На рабочем столе ПК приведенные выше примеры могут работать нормально, но не позволяют изменять ввод для функций ... Почему бы вместо этого не использовать Tio?
РосЛюП

@RosLuP Когда ввод прост (в данном случае 2 строки), я предпочитаю использовать фрагмент стека, который обычно облегчает изменение входов, а выход обновляется также динамически.
Нил


5

Mathematica, 78 байт

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

В Mathematica уже есть другой ответ . Этот ответ принимает входные данные в виде списка строк, поэтому /@может использоваться #вместо {##}. И мы можем просто Mapдлинное имя функции на объекте вместо того, чтобы назначать его переменным. (фактически каждое имя встроенного символа Mathematica используется в функции не более одного раза)


5

Java 8, 124 120 117 63 байта

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

-4 байта благодаря @ Khaled.K .
-3 байта благодаря @Jakob .

Входные данные представляют собой два символьных массива и заканчиваются символом ArrayIndexOutOfBoundsException.

Объяснение:

Попробуй это здесь.

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 байт

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

C # имеет неявный charдля intпреобразования (потому что charна самом деле intпод ним), и это приятно, и вместо того , чтобы искать кратчайшие строки просто попробовать до отказа


1
Обыграй меня! Однако сохраните один байт с каррированием a=>b=>, скомпилировав в Func<string, Func<string, string>>. Вы можете удалить скобки вокруг цикла for, чтобы сохранить 2 байта.
TheLethalCoder

Примечание: C# has implicit char to int conversionверно, потому charчто intвнизу.
TheLethalCoder

@TheLethalCoder: Не совсем. sizeof(int) == 4но sizeof(char) == 2.
рекурсивный

4

MATL , 8 байт

otX>cwA)

Ввод - это массив ячеек строк в формате {'abcd' 'efg'}

Попробуйте онлайн!

Кроме того, это также работает для более чем двух строк .

объяснение

Рассмотрим ввод {'blended' 'bold'}. Стек показан вверх ногами, более свежие элементы представлены ниже.

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 байта

Код:

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

Тестовые случаи:

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

А? Макс так работает? ТИЛ
JAD



4

V , 28, 24 , 21 байт

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

Попробуйте онлайн!

HexDump:

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

Три байта сохранены благодаря @ nmjcman101!

Объяснение:

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

Это dGнеобходимо? Не все ли новые строки удаляются вместе с Íîanyways?
nmjcman101

@ nmjcman101 Это необходимо, если строки имеют разную длину.
DJMcMayhem

3

CJam , 12 байт

q~z{1/~e>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 байт

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

Yay для композиции функций :) Возвращает последовательность символов вместо строки, но в Clojure они в основном работают одинаково, за исключением случаев печати или сопоставления регулярных выражений.

К сожалению max, не работает с персонажами.


maxне работает, но max-keyработает. #(map(partial max-key int)% %2)Это точно такой же счетчик байтов.
madstap

О, круто, я забыл об этом. Намного проще, чем, например (ffirst (sort-by second ...).
NikoNyrh

3

Javascript (ES2015), 66 63 49 байтов

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

Объяснение:

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

Предыдущие версии:

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

Добро пожаловать в PPCG! Хороший первый пост!
Rɪᴋᴇʀ

3

Retina , 55 36 байт

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

Попробуйте онлайн! Объяснение: Строка имеет префикс для хранения результата. В то время как в обеих строках по-прежнему остаются символы, входные данные сортируются, и начальный символ с самой высокой кодовой точкой перемещается в результат, а другой ведущий символ удаляется. Наконец результат печатается.


3

Шелуха , 2 байта

z▲

Попробуйте онлайн!

"Ungolfed" / Разъяснения

Использует zip fэто, усекает более короткий список так, что всегда есть два аргумента для f, например 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"

3

Котлин, 50 41 37 байт

-9 байтов с синтаксисом ссылки на функцию -4 байта с функцией расширения

fun String.x(o:String)=zip(o,::maxOf)

Если s и x находятся в области видимости, а не в функции, этот метод составляет всего 16 байт.

s.zip(x,::maxOf)

демонстрация



2

PowerShell, 75 байт

-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

Сохранить как файл .ps1 и запустить

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

Ранее 78 байтов:

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

2

J, 25 байт

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

объяснение

половина байтов идет на решение, гарантируя, что оба входа имеют более короткую длину входных данных (хотелось бы видеть улучшение в этой части, если у кого-то есть):

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

<.&#является минимумом из двух длин и {."1,:принимает столько символов из обеих строк двухстрочной таблицы, которая состоит из левой строки, расположенной сверху правой строки.

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

Используйте глагол Under, &.чтобы преобразовать каждый символ в его индекс ascii, возьмите максимум двух чисел и затем преобразуйте обратно в символы.

Попробуйте онлайн!


1
21 байт[:>./&.(3&u:)<.&#$&>;
миль

@ миль, элегантное сочетание поезда и соединения - мне нужно больше использовать этот трюк, чтобы избежать прощения. также u:был ТИЛ для меня.
Иона

2

Коллекции Java 8 + Eclipse, 70 64 байта

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

aи bоба MutableList<Character>из коллекций затмения.


2

Добавить ++ , 8 байт

D,f,@@,^

Попробуйте онлайн!

В версиях с 0.4 по 1.11 ^экспоненты имеют два числа или «умножают» две строки в зависимости от типа аргументов.


Это скорее противоречит духу code-golf, чтобы задавать вопрос, зная, что ваш собственный язык (который никто больше не использует) имеет встроенную функцию, которая дает ему монополию. К счастью, краткость Jelly снова побеждает.
FlipTack

12
@FlipTack ты прочитал первую строчку вопроса? Даже если бы это было 0 байтов, это не победило бы.
17

1
@ StefhenS Кажется, что эта функция вдохновила вызов, а не наоборот. Неконкурентная метка зарезервирована для ответов, которые используют языки или функции, которые были реализованы только после испытания.
Мартин Эндер

1

Mathematica, 102 байта

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


вход

["смешанный", "жирный"]


L@a~Min~L@bсохраняет один байт
Грег Мартин

1

APL (Dyalog) , 22 байта

Принимает две (или более!) Строки в качестве правильного аргумента.

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

Попробуйте онлайн!

{ анонимная функция, где правильный аргумент представлен

⎕UCS символы из U- Никода C характерно S et, которые соответствуют

⌈⌿ максимальное значение в каждом столбце

⎕UCS кодовые точки из U Никод С Характер S et для

 Matrified (матрица из списка строк)

 аргументы

↑¨⍨ каждый ограничен в

⌊/ минимум

≢¨ длина

 аргументов

}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.