Penambahan Aneh


19

Tantangan

Hitung jumlah aneh dua bilangan alami (juga dikenal sebagai penambahan bulan):

Diberikan A=... a2 a1 a0dan B=... b2 b1 b0dua bilangan asli ditulis dalam basis desimal, jumlah aneh didefinisikan, berdasarkan operasi maksimum , sebagai: A+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)

Memasukkan

Dua bilangan alami

Semua yang berikut ini diizinkan:

  • String nol-empuk (panjang yang sama)
  • String kiri-ruang-empuk
  • String ruang-empuk kanan
  • Array dua string berlapis
  • Array ruang-empuk 2D

Keluaran

Bilangan alami

Contoh

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

Aturan

  • Input dan output dapat diberikan dalam format yang sesuai (pilih format yang paling sesuai untuk bahasa / solusi Anda).
  • Tidak perlu menangani nilai negatif atau input yang tidak valid
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

3
juga dikenal sebagai penambahan bulan
TFeld

3
Bisakah kita mengambil input sebagai string nol-empuk (panjang yang sama)?
TFeld

1
Saya pikir ini agak terlalu sepele. Aneh yang belum pernah ditanyakan sebelumnya
Kue Kincir Angin

1
Bisakah kita memiliki angka dengan panjang yang sama? Suka 17210 00701, bukan 17210 701?
Windmill Cookies

7
Saya gagal melihat format input apa yang diizinkan dengan tepat. Format input sangat penting dalam tantangan ini, karena beberapa format memungkinkan pemrosesan lebih mudah. Apa dari yang berikut ini yang diizinkan? 1) Tali berlapis-nol (panjang yang sama) 2) Tali berlapis-ruang kiri 3) Tali berlapis-ruang-kanan. 4) Array dua string berlapis. 5) 2D array char ruang-empuk. Memilih untuk menutup dan menurunkan untuk saat ini; Saya akan dengan senang hati menghapus suara saya ketika dipecahkan
Luis Mendo

Jawaban:




7

R , 68 65 byte

function(x)apply(outer(x,10^(max(nchar(x)):1-1),`%/%`)%%10,2,max)

Cobalah online!

Input sebagai bilangan bulat, output sebagai daftar digit.

Jika daftar zero-padding digit diizinkan, maka pmaxcukuplah sudah cukup.


6

MATL , 2 byte

X>

Pilih format yang paling sesuai untuk bahasa / solusi Anda

Format input adalah: array char 2D dari dua baris, masing-masing sesuai dengan satu baris, dengan jumlah yang lebih pendek diisi dengan spasi. Sebagai contoh

17210
  701

yang dalam MATL didefinisikan sebagai

['17210'; '  701']

Cobalah online!

Penjelasan

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

5

Python 2 , 73 60 56 byte

lambda a,b:map(max,zip(a.rjust(len(b)),b.rjust(len(a))))

Cobalah online!

Mengambil input sebagai dua string, dan mengembalikan daftar digit


Alternatif:

Mengambil input sebagai dua bilangan bulat; output yang sama

Python 2 , 60 59 byte

lambda*i:map(max,zip(*['%*d'%(len(`max(i)`),v)for v in i]))

Cobalah online!


5

Java 10, 78 57 byte

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

Input sebagai dua array karakter berlapis ruang.

Memodifikasi array input pertama alih-alih mengembalikan yang baru untuk menghemat 21 byte (terima kasih kepada @ OlivierGrégoire ).

Cobalah online.

Penjelasan:

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 byte ). Gunakan kembali asebagai output untuk mendapatkan banyak, banyak byte.
Olivier Grégoire

@ OlivierGrégoire Ah, tidak percaya saya tidak memikirkan itu. Terima kasih! : D
Kevin Cruijssen


4

Japt, 9 8 7 byte

Mengambil input sebagai array array digit.

mÔÕÔËrw

Cobalah

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

Jika mengambil array nol-empuk sebagai input diizinkan (saat ini akan jatuh di bawah "format yang nyaman" tapi saya menduga itu bukan maksud penantang) maka ini bisa menjadi 3 byte.

íwV

Cobalah

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

1
Inilah solusi 8 byte lain dengan strategi berbeda dan format input yang lebih sederhana. mungkin Anda bisa mencukur byte dari itu?
Kamil Drakari

@KamilDrakari: Luar Biasa - Saya baru saja memperbarui dengan solusi yang sama persis!
Shaggy

Menariknya, versi yang memisahkan langkah "transpos" dan "kurangi" juga 8 byte karena pintasan yang lebih baik
Kamil Drakari

@ KamilDrakari, oh, kita punya jalan pintas untuk ysaat ini? Saya tidak tahu hal itu. Berikut cara lain , juga 8 byte.
Shaggy

Ooh, itu tipuan yang bagus '. Saya tidak tahu apakah itu akan menghemat byte, tapi itu pasti keren.
Kamil Drakari


4

05AB1E , 9 6 5 byte

-3 Terima kasih kepada Emigna
-1 terima kasih untuk Shaggy

íζ€àR

Mengambil input sebagai daftar daftar digit

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

Cobalah online! atau Coba semua test case


€Rbisa í. Juga, saya tidak berpikir Anda perlu €þsebagainumber > space
Emigna

@Emigna Terima kasih! Saya pikir saya sudah mencobanya tanpa €þdan itu tidak berhasil, tapi sekarang berhasil ...
Riley

Apakah Anda memerlukannya Jdi akhir?
Shaggy

@ Shaggy Tidak, kurasa tidak. Terima kasih!
Riley

Itu payah, tapi aturannya mengizinkan solusi 3 byte dengan mengambil array char berlapis-ruang 2D ..
Kevin Cruijssen

4

Perl 6 , 15 byte

{[~] [Zmax] $_}

Cobalah online!

Mengambil input sebagai daftar array karakter yang diisi spasi, meskipun untuk tantangan ini format input yang longgar membuatnya agak membosankan. Atau, inilah program yang mengambil daftar dua bilangan bulat sebagai gantinya:

Perl 6 , 41 byte

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

Cobalah online!

Jika Anda tidak keberatan dengan ruang kosong dalam jumlah besar, Anda juga dapat menghapus + dari depan.

Penjelasan:

{                                       }  # 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 byte

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

Input / output sebagai string, coba online!

Penjelasan

Fungsi pmenggantikan setiap karakter dengan spasi, menggunakan p b++adanp a++b dengan demikian panjangnya sama. Dengan cara ini kita dapat menggunakan zipWithtanpa kehilangan elemen apa pun, menggunakan maxdengan itu berfungsi karena (spasi) memiliki codepoint lebih rendah daripada salah satu karakter ['0'..'9'].


3

JavaScript (ES6), 51 49 byte

NB: Jawaban ini diposting sebelum format I / O yang longgar diizinkan secara eksplisit. Dengan susunan digit nol-empuk, ini bisa dilakukan di 33 byte , (tetapi jauh lebih menarik, IMHO).

Mengambil input sebagai dua bilangan bulat. Mengembalikan bilangan bulat.

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

Cobalah online!

Berkomentar

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

Versi alternatif

Format I / O yang sama.

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

Cobalah online!


Anda bisa mendapatkan lebih pendek jika Anda menganggap input Anda menjadi array char 2d ruang empuk.
kamoroso94

Hai! Bisakah Anda memberikan penjelasan? Saya "" mencoba "" untuk melakukan tantangan ini dalam JavaScript tetapi saya gagal dan ingin melihat bagaimana solusi Anda bekerja :)
Neyt

1
@Tidak Saya sudah menambahkan versi berkomentar. Versi alternatif menggunakan logika yang sama; satu-satunya perbedaan adalah bahwa kita menambahkan digit berikutnya ke kiri sebagai string alih-alih mengalikan hasil panggilan rekursif dengan 10.
Arnauld

@Arnauld Terima kasih! :)
Neyt

2

Tcl , 156 byte

proc S a\ b {join [lmap x [split [format %0[set l [expr max([string le $a],[string le $b])]]d $a] ""] y [split [format %0$l\d $b] ""] {expr max($x,$y)}] ""}

Cobalah online!

Tidak terlalu pegolf, tetapi saya harus mencobanya. Akankah golf nanti!


Tcl, 159 byte Gagal outgolf
sergiol

2

Batch, 120 byte

@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%

Mengambil input sebagai parameter baris perintah. Versi 188-byte bekerja pada bilangan bulat panjang acak:

@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%

Mengambil input pada STDIN.


2

Ranting , 125 byte

Ketika saya melihat tantangan ini, saya berpikir: "biarkan saya menggunakan bahasa templat! Tentu sangat cocok"

Saya salah ... sangat salah .... ... Tapi menyenangkan!

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

Ini mengharuskan "strict_variables" disetel ke false(nilai default).

Untuk menggunakan makro ini, Anda bisa melakukan ini:

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

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

Harus menampilkan 167.

Anda dapat mencoba ini di https://twigfiddle.com/rg0biy
("strict_variables" dimatikan, aktif secara default di situs web)


1

Sekam , 5 byte

↔¤żY↔

Dengan mudah mengambil input / output sebagai daftar digit, coba online atau verifikasi semua!

Penjelasan

↔¤żY↔  -- example inputs [1,4] [3,2]
 ¤  ↔  -- reverse the arguments of: [4,1] [2,3]
  żY   -- | zipWith (keeping elements of longer) max: [4,3]
↔      -- reverse: [3,4]

1

Stax , 5 byte

|>E:o

Jalankan dan debug itu

Program ini mengambil input sebagai array string.

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

Jalankan yang ini

Ini adalah pertama kalinya saya melihat penggunaan untuk instruksi overlay "di alam liar".



1

Pyth, 5 byte

meSdC

Mengambil input sebagai array dari dua string ruang-empuk.

meSd       map greatest
    C      on the transpose of input

Coba di sini .



1

Ceylon, 55/99

Dengan 0 atau string ruang-padded dengan panjang yang sama (mengembalikan karakter yang dapat diubah):

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

Dengan string 0 atau spasi-empuk (mengembalikan String):

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

Dengan string dengan panjang yang mungkin berbeda (mengembalikan String):

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


1

Ruby , 25 byte

->a,b{a.zip(b).map &:max}

Cobalah online!

Daftar pra-empuk, bla bla. (Meskipun rasanya sedikit seperti selingkuh.)


1

Retina 0.8.2 , 39 byte

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

Cobalah online! Tautan termasuk test suite. Versi Retina 1 45-byte sebelumnya menerima string yang tidak ditambahkan:

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

Cobalah online! Tautan termasuk test suite. Penjelasan:

P^`.+

Pad kedua nilai dengan panjang yang sama. (Hanya Retina 1. Ada cara untuk meniru ini di Retina 0.8.2 tetapi mereka tidak terlalu golf.)

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

Transposis nilainya.

%O`.

Urutkan setiap pasangan ke dalam urutan.

¶.?

Hapus semua digit rendah dan surplus baris baru.


1

Arang , 8 byte

⭆θ⌈⟦ι§ηκ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 θ          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

Versi 10-byte "menambahkan" sejumlah string berlapis:

⭆§θ⁰⌈Eθ§λκ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Versi 14 byte sebelumnya menerima string yang tidak ditambahkan:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  θ             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

Versi 17-byte "menambahkan" sejumlah string:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.


Pertanyaannya telah diubah sehingga string dapat dimasukkan sebagai padded
ASCII-only

Nitpicking, tetapi Anda melewatkan paren dekat dalam versi verbose pertama: P
ASCII-satunya

@ Khusus ASCII Jika hanya TIO yang cocok dengan parens untuk saya ;-)
Neil

0

Mathematica 50 byte

a = 543; b = 791;

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

(* 793 *)


1
Bisakah Anda menambahkan TIO? Saya tidak tahu Mathematica tetapi saya menduga ini mungkin gagal jika 2 input tidak memiliki jumlah digit yang sama.
Shaggy

1
Saya pikir Anda mengambil input melalui variabel yang telah ditentukan, yang akan membuat ini potongan, yang tidak diperbolehkan. Pengajuan harus berupa fungsi atau program lengkap
Jo King
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.