奇妙な追加


19

チャレンジ

2つの自然数の奇妙な合計を計算します(月の加算とも呼ばれます)。

10進数で記述された2つの自然数が与えられるA=... a2 a1 a0と、最大演算に基づいて、次のように奇妙な合計が定義されます。 B=... b2 b1 b0A+B=... max(a2,b2) max(a1,b1) max(a0,b0)

   ...         a2         a1         a0
 + ...         b2         b1         b0
 ----------------------------------------
   ...  max(a2,b2) max(a1,b1) max(a0,b0)

入力

2つの自然数

次のすべてが許可されます。

  • ゼロが埋め込まれた文字列(同じ長さ)
  • 左スペースが埋め込まれた文字列
  • 右スペースが埋め込まれた文字列
  • 2つの埋め込み文字列の配列
  • 2Dスペースが埋め込まれたchar配列

出力

自然数

1999+2018-->2999
17210+701-->17711
32+17-->37
308+250-->358
308+25-->328

ルール

  • 入力と出力は、任意の便利な形式で指定できます(言語/ソリューションに最適な形式を選択してください)。
  • 負の値や無効な入力を処理する必要はありません
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試せるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。


3
入力をゼロパディング文字列(同じ長さ)として使用できますか?
TFeld

1
これは少し簡単すぎると思います。以前に聞かれたことのない奇妙な
Windmill Cookies

1
数字を同じ長さにすることはできますか?17210 701の代わりに17210 00701が好きですか?
ウィンドミルクッキー

7
どの入力形式が正確に許可されているかがわかりません。一部の形式では処理がはるかに簡単になるため、この課題では入力形式が非常に重要です。次のうち何が許可されていますか?1)ゼロ詰め文字列(同じ長さ)2)左スペース詰め文字列3)右スペース詰め文字列。4)2つの埋め込み文字列の配列。5)2Dスペースが埋め込まれたchar配列。今のところ、クローズとダウン投票への投票。解決したら投票を喜んで削除します
ルイスメンドー

回答:





6

MATL、2バイト

X>

言語/ソリューションに最適な形式を選択してください

入力形式は次のとおりです。2行の2D char配列。それぞれが1行に対応し、短い数字の左側にスペースが埋め込まれます。例えば

17210
  701

MATLでは次のように定義されています

['17210'; '  701']

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

説明

      % Implicit input: 2D char array with two rows 
X>    % Take maximum of (code points of) each column
      % Implicit display


5

Java 10、 10、78 57バイト

a->b->{for(int i=a.length;i-->0;)if(a[i]<b[i])a[i]=b[i];}

2つのスペースが埋め込まれた文字配列として入力します。

21バイトを節約するために新しい配列を返す代わりに、最初の入力配列を変更します(ありがとう @OlivierGrégoireに)。

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

説明:

a->b->{            // Method with two char-array parameters and String return-type
  for(int i=a.length;i-->0;)
                   //  Loop `i` in the range (length, 0]:
    if(a[i]<b[i])  //   If the `i`'th character in input `a` is smaller than in input `b`:
      a[i]=b[i];}  //    Change the `i`'th character in `a` to the `i`'th character of `b`

1
a->b->{for(int i=a.length;i-->0;)if(a[i]<b[i])a[i]=b[i];}57バイト)。a大量のバイトを得るために出力として再利用します。
オリビエグレゴワール

@OlivierGrégoireああ、私はそれを考えていなかったとは信じられません。ありがとう!:D
ケビンクルーイッセン

4

J14 12バイト

-Jonahのおかげで2バイト

(>./@,:)&.|.

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

数字のリストとしての入出力


1
12バイト:(>./@,:)&.|.オンラインでお試しください!
ジョナ

1
@ジョナもちろん!ありがとうございました!
ガレンイワノフ

1
課題を探している場合は、この怪物を改善できるかどうかを確認してください:codegolf.stackexchange.com/a/175968/15469
Jonah

4

ジャプト、9 8 7バイト

入力を数字配列の配列として受け取ります。

mÔÕÔËrw

それを試してみてください

m            :Map
 Ô           :  Reverse
  Õ          :Transpose
   Ô         :Reverse
    Ë        :Map
     r       :  Reduce by
      w      :  Maximum

入力としてゼロが埋め込まれた配列を取ることが許可されている場合(現在は「便利な形式」に該当しますが、チャレンジャーの意図ではないと思われます)、これは3バイトになります。

íwV

それを試してみてください

í       :Interleave the first input
  V     :With the second
 w      :Reduce each pair by maximum

1
別の戦略とより単純な入力形式を使用した別の8バイトソリューションを次に示します。多分あなたはそこからバイトを剃ることができますか?
カミルドラカリ

@KamilDrakari:不気味-私はちょうど同じソリューションでアップデートしていました!
シャギー

興味深いことに、「転置」を分離したバージョンは、とのステップがあり、「減らす」も8バイトあるため、より良いショートカットの
カミルDrakari

@KamilDrakari、ああ、y今のところショートカットがありますか?私は知りませんでした。別の方法、これも8バイトです。
シャギー

ああ、それはのきちんとしたトリック'です。それがバイトを節約できるかどうかはわかりませんが、それは間違いなくクールです。
カミルドラカリ


4

05AB1E9 6 5バイト

-3 エミニャに
感謝-1 シャギーに感謝

íζ€àR

入力を数字のリストのリストとして取得します

í      # Reverse both inputs
 ζ     # Zip
  ۈ   # Keep the bigger digits
    R  # Reverse

オンラインでお試しください!またはすべてのテストケースを試す


€Rすることができますí。また、私はあなたが必要€þとは思わないnumber > space
エミグナ

@Emignaありがとう!せずに試してみた€þがうまくいかなかったと思ったが、今では…
ライリー

J最後に必要ですか?
シャギー

@Shaggyいいえ、そうではないと思います。ありがとう!
ライリー

それのラメが、ルールが可能3バイトソリューション 2Dスペースが詰めchar配列をとることにより...
ケビンCruijssen

4

Perl 6、15バイト

{[~] [Zmax] $_}

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

入力をスペースで埋められた文字の配列のリストとして取得しますが、このチャレンジでは、入力形式が緩いため、かなり退屈になります。あるいは、代わりに2つの整数のリストを受け取るプログラムがあります。

Perl 6、41バイト

{+[~] [Zmax] $_>>.fmt("%{.max}d")>>.comb}

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

大量の空白を気にしない場合は、削除することもできます +は、前面から。

説明:

{                                       }  # Anonymous code block
             $_>>    # Map each integer to 
                 .fmt("%{.max}d") # The number padded by the max of the list spaces
                                 >>.comb   # And split each to list of characters
      [Zmax]  # Get the max of each digit at each index
              # This works because space is coerced to 0
              # Otherwise we would have to add a 0 to the formatting string
  [~]   # Join the list of digits and spaces
 +      # And coerce the string to a number to get rid of leading whitespace

3

Haskell、40バイト

a#b=zipWith max(p b++a)$p a++b
p=(' '<$)

文字列としての入出力、オンライン試してみてください!

説明

この関数はp使用し、スペースで各文字を置き換えるp b++aと、p a++bこれと同じ長さです。この方法ではzipWith、要素を失うことなく使用できますがmax(space)のコードポイントはどの文字よりも低いため、それを使用すると機能し['0'..'9']ます。


3

JavaScript(ES6)、51 49バイト

注意:この回答は、ルーズI / Oフォーマットが明示的に許可される前に投稿されました。ゼロで埋められた数字の配列では、これは33バイトで実行できます。で(ただし、あまり面白くない、IMHO)。

入力を2つの整数として受け取ります。整数を返します。

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0

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

コメント済み

f = (                     // f = recursive function taking:
  a,                      //   a = first integer
  b,                      //   b = second integer
  t = 10                  //   t = 10 (which is used 6 times below)
) =>                      //
  a | b                   // bitwise OR between a and b to test whether at least one of
                          // them still has an integer part
  &&                      // if not, stop recursion; otherwise:
  (                       //
    a % t < b % t ? b : a // if a % 10 is less than b % 10: use b; otherwise: use a
  ) % t +                 // isolate the last decimal digit of the selected number
  t *                     // add 10 times the result of
  f(a / t, b / t)         // a recursive call with a / 10 and b / 10
  | 0                     // bitwise OR with 0 to isolate the integer part

代替バージョン

同じI / O形式。

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0

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


入力が2次元のスペースで埋められたchar配列であると仮定すると、はるかに短くなります。
kamoroso94

こんにちは!説明してください。JavaScriptでこのチャレンジを「試み」
ました

1
@Neytコメント付きバージョンを追加しました。代替バージョンは同じロジックを使用しています。唯一の違いは、再帰呼び出しの結果に10を掛ける代わりに、次の数字を文字列として左に追加することです
。– Arnauld

@Arnauldありがとうございます!:)
ネイト


2

バッチ、120バイト

@set/aw=1,x=%1,y=%2,z=0
@for /l %%i in (0,1,9)do @set/a"z+=w*((v=y%%10)+(v-=x%%10)*(v>>4)),y/=10,x/=10,w*=10
@echo %z%

入力をコマンドラインパラメーターとして受け取ります。188バイトバージョンは、任意の長さの整数で動作します。

@set/px=
@set/py=
@set z=
:l
@if %x:~-1% gtr %y:~-1% (set z=%x:~-1%%z%)else set z=%y:~-1%%z%
@set x=%x:~,-1%
@set y=%y:~,-1%
@if "%x%" neq "" if "%y%" neq "" goto l
@echo %x%%y%%z%

STDINで入力を受け取ります。


2

小枝、125バイト

この挑戦を見たとき、私は「テンプレート言語を使用させてください!確かにぴったりです」

私は間違っていた...とても間違っていた.... ...しかし、楽しかった!

{%macro a(a,b,s='')%}{%for k,x in a|reverse|split('')%}{%set s=max(x,(b|reverse|split('')[k]))~s%}{%endfor%}{{s}}{%endmacro%}

これには、「strict_variables」が false(デフォルト値)にます。

このマクロを使用するには、次のようにします。

{% import 'file.twig' as my_macro %}

{{ my_macro.a(195,67) }}

167が表示されます。

https://twigfiddle.com/rg0biyでこれを試すことができます
(「strict_variables」はオフに設定され、ウェブサイトではデフォルトでオンになっています)



1

スタックス、5バイト

|>E:o

実行してデバッグする

このプログラムは、文字列の配列として入力を受け取ります。

|>  Right align inputs (filling with \0)
E   "Explode" array onto stack separately
:o  "Overlay" Keep the maximum element respective element from two arrays.

これを実行する

「インザワイルド」のオーバーレイ命令の使用を見たのはこれが初めてです。



1

Pyth、5バイト

meSdC

2つのスペースが埋め込まれた文字列の配列として入力を受け取ります。

meSd       map greatest
    C      on the transpose of input

ここで試してみてください



1

セイロン、55/99

同じ長さの0またはスペースで埋められた文字列の場合(反復可能な文字を返します):

function t(String a,String b)=>zipPairs(a,b).map(max);

0またはスペースで埋められた文字列(文字列を返す):

String t(String a,String b)=>String(zipPairs(a,b).map(max));

おそらく異なる長さの文字列(文字列を返す):

String u(String a,String b)=>String(zipPairs(a.padLeading(b.size),b.padLeading(a.size)).map(max));



1

Retina 0.8.2、39バイト

+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4
%O`.
¶.?

オンラインでお試しください!リンクにはテストスイートが含まれています。以前の45バイトのRetina 1バージョンは、パッドなしの文字列を受け入れます。

P^`.+
+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4
%O`.
¶.?

オンラインでお試しください!リンクにはテストスイートが含まれます。説明:

P^`.+

両方の値を同じ長さに埋め込みます。(Retina 1のみ。Retina0.8.2でこれをエミュレートする方法がありますが、あまりゴルフではありません。)

+`^(.*)(.)¶(.*)(.)
$1¶$3¶$2$4

値を転置します。

%O`.

各ペアを順番に並べ替えます。

¶.?

すべての下位桁と余剰改行を削除します。


1

木炭、8バイト

⭆θ⌈⟦ι§ηκ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

 θ          First input
⭆           Map over characters and join
  ⌈         Maximum of
   ⟦        List of
    ι       Current character of first input and
      η     Second input
     §      Indexed by
       κ    Current index
            Implicitly print

10バイトバージョンは、任意の数の埋め込み文字列を「追加」します。

⭆§θ⁰⌈Eθ§λκ

オンラインでお試しください!リンクは、コードの詳細バージョンです。以前の14バイトバージョンは、パディングなしの文字列を受け入れます。

⭆◧θLη⌈⟦ι§◧ηLθκ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

  θ             First input
 ◧              Padded to
   L            Length of
    η           Second input
⭆               Map over characters and join
     ⌈          Maximum of
      ⟦         List of
       ι        Current character of first input and
          η     Second input
         ◧      Padded to
           L    Length of
            θ   First input
        §       Indexed by
             κ  Current index
                Implicitly print

17バイトバージョンは、任意の数の文字列を「追加」します。

≔⌈EθLιη⭆η⌈Eθ§◧ληκ

オンラインでお試しください!リンクは、コードの詳細バージョンです。


文字列がパディングとして入力することができますので質問が変更されました
ASCIIのみの

Nitpicking、しかしあなたは最初の冗長バージョンで近い括弧を逃しました:P
ASCIIのみ

@ ASCII-only TIOのみが私のために括弧に一致した場合;-)
ニール

0

Mathematica 50バイト

a = 543; b = 791;

FromDigits@MapThread[Max, IntegerDigits /@ {a, b}]

(* 793 *)


1
TIOを追加できますか?Mathematicaを知りませんが、2つの入力の桁数が等しくない場合、これは失敗する可能性があります。
シャギー

1
事前定義された変数を介して入力を取得しているため、これはスニペットになりますが、許可されていません。提出は、機能または完全なプログラムのいずれかである必要があります
ジョーキング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.