«Помножте» два рядки


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.

Це тому найкоротший виграш коду! Луок!


35
Це максимальний елемент струн, правда? Це не схоже на множення.
xnor

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

Відповіді:


53

Haskell, 11 байт

zipWith max

Спробуйте в Інтернеті!

Нічого багато для пояснення.


7
І я думав, що у Mathematica є дивні вбудовані
елементи

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

2
@ Mr.Xcoder насправді, zipWithне надто дивно. Це досить поширений функціональний примітив. Ідея "скомпонувати" два списки разом виникає у багатьох проблемах, і як тільки ви це зробите, ви часто хочете застосувати якусь функцію до отриманих двоелементних елементів, звідси і частини "з".
Йона


6

Perl 6 , 22 байти

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

Як бонус він приймає будь-яку кількість мультиплікацій, а не лише два.


6

Japt , 16 байт

ñl g îUy ®¬ñ oÃq

Перевірте це в Інтернеті! Приймає вхід як масив з двох рядків.

Відсутність мінімуму та максимуму вбудованих ушкоджень зачепило тут Japt, але все-таки вдається витягти дещо гідну оцінку ...

Пояснення

 ñ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", "", "", ""]. œ-є атомом віднімання мультисетів , і швидкий "робить його векторизованим.

Під час друку це просто читається напівжирним шрифтом .


Отже, це блискавка, потім прийняття різницевої різниці чогось, потім є кілька приємних подвійних цитат загадкового значення, і нарешті мінімум. Приємно ... Пояснення, будь ласка? : D
Лев

1
Я додав відпрацьований приклад.
Денніс

6

PHP> = 7,1, 52 байти

for(;$t=min(~$argv[1][$i],~$argv[2][$i++]);)echo~$t;

PHP Пісочниця Інтернет

PHP> = 7,1, 69 байт

for([,$a,$b]=$argv;(~$c=$a[$i])&&~$d=$b[$i++];)$r.=max($c,$d);;echo$r;

PHP Пісочниця Інтернет

PHP> = 7,1, 70 байт

for([,$a,$b]=$argv;(~$c=$a[$i])&&~$d=$b[$i++];)$r.=$c>$d?$c:$d;echo$r;

PHP Пісочниця Інтернет


1
Злегка golfed: for(;$t=min(~$argv[1][$i],~$argv[2][$i++]);)echo~$t;.
user63956

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 \до початку відповіді.
Ніл

@Neil О, хороший момент. Я також міг би скористатись останньою фіксацією (яка ще не є 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

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


5

Математика, 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 .

Введення - це два масиви символів, і він зупиняється на an 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знаходиться a 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.

Так? Макс працює так? TIL
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потрібне? Чи все одно не видаляються всі нові рядки Íî?
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)

Так, для композиції функції :) Повертає послідовність символів замість рядка, але вони в основному працюють аналогічно в 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

Сітківка , 55 36 байт

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

Спробуйте в Інтернеті!Пояснення: рядок має префікс для утримання результату. Хоча в обох рядках все ще є символи, ліві входи сортуються, а провідний символ з найвищою кодовою точкою переміщується до результату, а інший ведучий символ видаляється. Нарешті результат друкується.


3

Лушпиння , 2 байти

z▲

Спробуйте в Інтернеті!

«Безголів» / Пояснив

Використовує, 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,:займає стільки символів з обох рядків 2-рядкової таблиці, що складається з лівого рядка, розміщеного вгорі правого.

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

Використовуйте дієслово Under, &.щоб перетворити кожного символу в його індекс ascii, взяти максимум двох чисел, а потім перетворити назад в символи.

Спробуйте в Інтернеті!


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

@miles, елегантне поєднання поїзда та сполучення - мені потрібно використовувати цей трюк більше, щоб уникнути парен. також u:був для мене TIL.
Йона

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, ^експоненти два числа або "множення" двох рядків, залежно від типу аргументів.


Це скоріше проти духу коду-гольфу, щоб ставити питання, знаючи, що ваша власна мова (якою ніхто більше не користується) має вбудований, який дає їй монополію. На щастя, лаконічність Джеллі знову виграє.
FlipTack

12
@FlipTack ти прочитав перший рядок питання? Навіть якби це було 0 байт, воно не виграє.
caird coinheringaahing

1
@StephenS Здається, що ця функція надихнула виклик, а не навпаки. Неконкурентна мітка зарезервована для відповідей, які використовують мови або функції, які були реалізовані лише після виклику.
Мартін Ендер

1

Математика, 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- вузла C- характера S et для

 матрифікований (матриця зі списку рядків)

 аргументи

↑¨⍨ кожен обмежений на

⌊/ мінімум

≢¨ довжини

 аргументів

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.