2つの文字列を「乗算」する


29

これは、言語Add ++に最近追加した関数に触発されました。したがって、Add ++で短い回答を送信しますが、勝った場合は受け入れません(公平ではありません)

数字を掛けることはできるが、文字列は掛けられないときは嫌いではありませんか?だから、あなたはそれを修正するべきですよね?

入力として2つの空でない文字列を取り、乗算されたバージョンを出力する関数または完全なプログラムを作成します。

文字列をどのように乗算しますか?私が教えてやろう!

2つの文字列を乗算するには、2つの文字列を取り、各文字を比較します。次に、最高のコードポイントを持つ文字が出力に追加されます。それらが等しい場合は、単に文字を出力に追加します。

文字列の長さが等しいとは限りません。長さが異なる場合、最終文字列の長さは最短文字列の長さになります。入力は常に小文字で、0x20 - 0x7E大文字を除く印刷可能なASCII範囲内の任意の文字()を含めることができます。

文字列、リストなど、合理的な形式で出力できます。賢明なことに、整数はこのチャレンジで出力する賢明な方法ではありません。

入力を持つ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
Nitpick:PPCGは卒業しましたが、新しいデザインはまだ得られていません。
デニス

回答:


53

Haskell、11バイト

zipWith max

オンラインでお試しください!

説明することはあまりありません。


7
そして、私はMathematicaは奇妙なビルトインを持っていたと思った
氏Xcoder

@ Mr.Xcoder MathematicaにはzipWithがあり、MapThread
michi7x7

2
実際、@ Mr.Xcoder zipWithはそれほど奇妙ではありません。これはかなり一般的な機能プリミティブです。2つのリストを一緒に「圧縮」するというアイデアは多くの問題で発生します。それを実行すると、結果の2要素項目に何らかの機能を適用することがよくあります。
ジョナ



6

Japt、16バイト

ñl g îUy ®¬ñ oÃq

オンラインでテストしてください!入力を2つの文字列の配列として受け取ります。

ここで最小と最大のビルトインの欠如は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']。最後の3つの要素は文字です。

«は、ベクトル化、2項式の最小値であるため、が得られ['b', 'l', 'e', 'd', 'd', 'e', 'd']ます。

œ-"最初の配列のn 番目の文字列/文字から、2番目の配列のn 番目の文字を1回だけ削除して、を生成します。はマルチセット減算アトムであり、クイックはそれをベクトル化します。["b", "o", "l", "n", "", "", ""]œ-"

印刷すると、これは単にbolnを読み取ります


だから、これはジッピングし、何かのマルチセットの違いを取り、不思議な意味の素敵な二重引用符があり、最後に最小値があります。ニース...説明してください?: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+

オンラインでお試しください!

説明

Aliceにもこの演算子(superimposeと呼びます)がありますが、出力を短い文字列の長さに制限しません(代わりに、長い文字列の残りの文字が追加されます)。ただし、2つの文字列の長い方を短い方の長さに切り捨てる演算子もあります。

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

{それは、作業文字列を変更するために失敗するまでループでプログラム全体を実行するために、網膜に指示します。Oこれはデフォルトで空でない行をソートするソート段階になります。^オプションでは、結果を逆転させます。したがって、実際には、空でない場合は2行の逆の並べ替えが行われ、先頭に大きな文字が配置された行が配置されます。

G`.

空行がある場合は破棄します。

^.*$

1行しか残っていない場合、1行は空でしたが、もう1行も削除してプロセスを停止します。

M!\*`^.

ここで多くの設定が行われています。これMは、作業文字列の最初の文字()に一致し()、^.それを返し(!)、末尾の改行なしで印刷し(\)、作業文字列を前の値に戻します(*)。つまり、実際に文字列を変更せずに、作業文字列の最初の文字(最大の先頭文字)を単に印刷します。

Rm`^.

最後に、各行から最初の文字を削除して、次の反復で次の文字を処理します。


私のモノリスの答えの高さについてコメントしたとき、この質問に対する私の答えが長すぎること、そしておそらく私が非効率的に移調していることがわかりました。あなたの移調提案がどのように機能したかを見て、結局この質問にはふさわしくないと判断しました。その後、19バイトを節約する新しいアプローチを思いつきました...そして、スクロールダウンして、より良いバージョンをすでに見つけていることを見つけ
ニール

G`.これは不要なので3バイト節約できますが、これは余分な改行を出力しますが、これを使用する^.+¶$\、回答の先頭に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]の終わりを過ぎると便利にfalseを返しますb。編集:@ETHproductionsのおかげで2バイト保存されました。


ここで私の携帯電話では、上記のコードは実行できません。PCデスクトップでは、上記の例は問題なく実行できますが、関数の入力を変更できません...代わりにTioを使用してください。
-RosLuP

@RosLuP入力が単純​​な場合(この場合は2本の刺し傷)、私は通常、入力の変更と出力の更新も動的に簡単にするStack Snippetを使用することを好みます。
ニール


5

Mathematica、78バイト

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

Mathematicaにはすでに別の答えがあります。この回答は文字列のリストとして入力を受け取るため/@、の#代わりに使用できます{##}。そしてMap、オブジェクトを変数に割り当てる代わりに、オブジェクトの長い関数名のみを使用できます。(実際、各Mathematica組み込みシンボル名は関数内で最大1回使用されます)


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]);}

@ Khaled.Kのおかげで-4バイト。@Jakobの
おかげで-3バイト。

入力は2つの文字配列で、で終わります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#は変換を暗黙的charint(a charは実際にはint下にあるので)持っていますが、これは最短の文字列を探すのではなく、失敗するまで試してください


1
それに私を打つ!ただし、にa=>b=>コンパイルすることにより、カリー化で1バイトを節約しますFunc<string, Func<string, string>>。forループを囲む括弧を削除して、2バイトを節約できます。
TheLethalCoder

サイドノート:C# has implicit char to int conversiona charint下にあるためtrue です。
TheLethalCoder

@TheLethalCoder:まったく違います。 sizeof(int) == 4しかしsizeof(char) == 2
再帰的

4

MATL、8バイト

otX>cwA)

入力は、次の形式の文字列のセル配列です。 {'abcd' 'efg'}

オンラインでお試しください!

余談ですが、これは3つ以上の文字列でも機能します

説明

入力を検討してください{'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

V28、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のおかげで3バイト節約できました!

説明:

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

入力は2つの文字列のリストです。2つの文字列の長さが異なる場合、プログラムはエラーで終了します(正しい出力を生成した後)。

オンラインでお試しください!

説明

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 ...)
ニコニール

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▲

オンラインでお試しください!

「Ungolfed」/説明

これを利用しzip fて、より短いリストを切り捨てて、の引数が常に2つになるようにします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

Kotlin、50 41 37バイト

関数参照構文では-9バイト、拡張関数では-4バイト

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

sおよびxが関数内ではなくスコープ内にある場合、このメソッドは16バイトのみです

s.zip(x,::maxOf)

デモ


try.kotlinlang.orgのリンクは次のとおり
キリルラクマン

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

<.&#は、2つの長さの最小値で{."1,:あり、右の文字列の上に左の文字列を重ねた2行のテーブルの両方の行からその文字数を取得します。

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

Under動詞&.を使用して、各文字をASCIIインデックスに変換し、2つの数字の最大値を取得してから、文字に戻します。

オンラインでお試しください!


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

Add ++、8バイト

D,f,@@,^

オンラインでお試しください!

バージョン0.4から1.11では^、引数のタイプに応じて、2つの数値を指数化するか、2つの文字列を「乗算」します。


これはコードゴルフの精神に反するものであり、あなた自身の言語(他の誰も使用していない言語)に独占を与える組み込み機能があることを知っている質問を投稿することです。ありがたいことに、ジェリーの簡潔さが再び勝ちます。
FlipTack

12
@FlipTackは質問の最初の行を読みましたか?これが0バイトであっても、勝ちません。
ケアニアンコヒーリングアーイング

1
@StephenSこの機能がチャレンジを引き起こしたのは、逆ではないようです。非競合ラベルは、チャレンジ後にのみ実装された言語または機能を使用する回答用に予約されています。
マーティンエンダー

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@b1バイトを節約
グレッグマーティン

1

APL(Dyalog)、22バイト

2つ(またはそれ以上)の文字列を正しい引数として受け取ります。

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

オンラインでお試しください!

{ 右引数が表され匿名関数

⎕UCS に対応するU nicode C haracter S et のシンボル

⌈⌿ の各列の最大値

⎕UCSU nicode C haracter S et  のコードポイント

 matrified(文字列のリストからの行列)

 引数

↑¨⍨ それぞれでキャップ

⌊/ 最小の

≢¨ 長さ

 引数の

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.