Garip Ekleme


19

Meydan okuma

İki doğal sayının garip toplamını hesaplayın (ay ilavesi olarak da bilinir):

Ondalık tabanda yazılan A=... a2 a1 a0ve B=... b2 b1 b0iki doğal sayı verildiğinde , garip toplam maksimum işleme göre şu şekilde tanımlanır : 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)

Giriş

İki doğal sayı

Aşağıdakilerin tümüne izin verilir:

  • Sıfır dolgulu dizeler (aynı uzunlukta)
  • Sol boşluk dolgulu dizeler
  • Sağ alan dolgulu dizeler
  • İki dolgulu dizgiden oluşan dizi
  • 2B boşluk destekli karakter dizisi

Çıktı

Doğal sayılar

Misal

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

kurallar

  • Giriş ve çıkış herhangi bir uygun formatta verilebilir (diliniz / çözümünüz için en uygun formatı seçin).
  • Negatif değerleri veya geçersiz girişi işlemeye gerek yok
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Mümkünse, diğer kişilerin kodunuzu deneyebilmesi için lütfen bir çevrimiçi test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.


3
Girişi sıfır dolgulu dizeler olarak alabilir miyiz (aynı uzunlukta)?
TFeld

1
Bence bu biraz fazla önemsiz. Daha önce sorulmamış garip
Yel Değirmeni Çerezleri

1
Numaraları aynı uzunlukta alabilir miyiz? 17210 701 yerine 17210 00701 gibi mi?
Yel Değirmeni Çerezleri

7
Hangi giriş biçimlerine tam olarak izin verildiğini göremiyorum. Giriş formatı bu meydan okumada çok önemlidir, çünkü bazı formatlar daha kolay işlemeye izin verir. Aşağıdakilerden hangisine izin verilir? 1) Sıfır dolgulu dizeler (aynı uzunlukta) 2) Sol boşluk dolgulu dizeler 3) Sağ boşluk dolgulu dizeler. 4) İki yastıklı diziden oluşan dizi. 5) 2B boşluk dolgulu karakter dizisi. Şimdilik kapatmak ve oy vermek için oylama;
Luis Mendo

Yanıtlar:




7

R , 68 65 bayt

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

Çevrimiçi deneyin!

Tamsayı olarak giriş, rakam listesi olarak çıktı.

Sıfır dolgulu basamak listelerine izin verildiyse, o pmaxzaman yeterlidir.


6

MATL , 2 bayt

X>

Diliniz / çözümünüz için en uygun formatı seçin

Giriş formatı: Her biri bir satıra karşılık gelen iki satırdan oluşan 2D karakter dizisi, daha kısa sayı boşluklarla soldadır. Örneğin

17210
  701

MATL'de şu şekilde tanımlanır:

['17210'; '  701']

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

Girdiyi iki dize olarak alır ve bir basamak listesi döndürür


Alternatif:

Girdiyi iki tamsayı olarak alır; aynı çıktı

Python 2 , 60 59 bayt

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

Çevrimiçi deneyin!


5

Java 10, 78 57 bayt

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

İki boşluk dolgulu karakter dizisi olarak giriş yapın.

21 bayt kaydetmek için yenisini döndürmek yerine ilk girdi dizisini değiştirir ( @ OlivierGrégoire sayesinde ).

Çevrimiçi deneyin.

Açıklama:

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 bayt ). Yeniden açıktı olarak çok, çok bayt kazanmak için.
Olivier Grégoire

@ OlivierGrégoire Ah, bunu düşünmediğime inanamıyorum. Teşekkürler! : D
Kevin Cruijssen


4

Japt, 9 8 7 bayt

Girişi bir dizi dizi dizisi olarak alır.

mÔÕÔËrw

Dene

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

Girişe izin verildiği gibi sıfır dolgulu diziler alınıyorsa (şu anda "uygun bir format" ın altına düşecektir, ancak bunun meydan okuyucunun amacı olmadığını sanıyorum) bu 3 bayt olabilir.

íwV

Dene

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

1
İşte 'Farklı strateji ve basit girdi formatı ile başka 8 bayt çözüm bu. belki bundan bir bayt tıraş edebilirsin?
Kamil Drakari

@KamilDrakari: Uncanny - Tam olarak aynı çözümle güncelleme yapıyordum!
Shaggy

İlginç bir şekilde, "devrik" ve "azaltma" adımlarını ayıran sürüm de daha iyi kısayollar nedeniyle 8 bayt
Kamil Drakari

@KamilDrakari, ah, yşimdilik bir kısayolumuz var mı? Bunu bilmiyordum. İşte başka bir yol , ayrıca 8 bayt.
Shaggy

Ooh, bu temiz bir numara '. Bunun bayt tasarruf edip etmeyeceğini bilmiyorum, ama kesinlikle harika.
Kamil Drakari


4

05AB1E , 9 6 5 bayt

Shaggy sayesinde Emigna
-1 sayesinde -3

íζ€àR

Girdileri rakam listelerinin listesi olarak alır

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

Çevrimiçi deneyin! veya Tüm test senaryolarını deneyin


€Rolabilir í. Ayrıca, sana ihtiyacım olduğunu sanmıyorum €þolaraknumber > space
Emigna

@Emigna Teşekkürler! Ben olmadan denedim düşündüm €þve işe yaramadı, ama şimdi işe yarıyor ...
Riley

JSonunda ihtiyacınız var mı?
Shaggy

@Shaggy Hayır, sanırım bilmiyorum. Teşekkürler!
Riley

Bu topal, ancak kurallar 2B boşluk dolgulu bir char dizisi alarak 3 baytlık bir çözüm sağlar ..
Kevin Cruijssen

4

Perl 6 , 15 bayt

{[~] [Zmax] $_}

Çevrimiçi deneyin!

Girdiyi karakter dolgulu karakter dizilerinin bir listesi olarak alır, ancak bu zorluk için gevşek giriş formatı onu oldukça sıkıcı hale getirir. Alternatif olarak, bunun yerine iki tamsayının listesini alan program:

Perl 6 , 41 bayt

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

Çevrimiçi deneyin!

Çok fazla boşluk sakıncası yoksa +, önden de kaldırabilirsiniz .

Açıklama:

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

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

Giriş / çıkış olarak dize, çevrimiçi deneyin!

açıklama

Fonksiyon pkullanılarak, bir boşluk, her bir karakteri yerine p b++ave p a++bbu nedenle, aynı uzunluktadır. Bu şekilde zipWith, herhangi bir öğeyi kaybetmeden kullanabiliriz , maxonunla birlikte çalışır, çünkü (boşluk) herhangi bir karakterden daha düşük kod noktasına sahiptir ['0'..'9'].


3

JavaScript (ES6), 51 49 bayt

Not: Bu yanıt, gevşek G / Ç biçimlerine açıkça izin verilmeden önce gönderildi. Sıfır dolgulu basamak dizileriyle, bu 33 baytta yapılabilir (ancak çok daha az ilginçtir, IMHO).

Girdiyi iki tamsayı olarak alır. Bir tamsayı döndürür.

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

Çevrimiçi deneyin!

Yorumlananlar

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

Alternatif sürüm

Aynı G / Ç formatı.

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

Çevrimiçi deneyin!


Girişinizin 2d boşlukla doldurulmuş bir char dizisi olduğunu varsayarsanız çok daha kısa alabilirsiniz.
kamoroso94

Selam! Biraz açıklama yapabilir misiniz? JavaScript'te bu görevi yerine getirmeye "" çalıştım "ama başarısız oldum ve çözümünüzün nasıl çalıştığını görmek istiyorum :)
Neyt

1
@Neyt Bir yorum ekledim. Alternatif sürüm aynı mantığı kullanıyor; tek fark, yinelenen çağrının sonucunu 10 ile çarpmak yerine bir sonraki basamağı sola dize olarak eklememizdir.
Arnauld

@Arnauld Teşekkürler! :)
Neyt


2

Toplu, 120 bayt

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

Girişi komut satırı parametreleri olarak alır. 188 baytlık sürüm keyfi uzunluk tamsayıları üzerinde çalışır:

@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 üzerine girdi alır.


2

Dal , 125 bayt

Bu zorluğu gördüğümde, "bir şablon dili kullanmama izin verin!

Yanılmışım ... çok yanılmışım .... ... Ama eğlenceliydi!

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

Bu, "strict_variables" değerinin false (varsayılan değer) .

Bu makroyu kullanmak için aşağıdakileri yapabilirsiniz:

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

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

167 göstermelidir.

Bunu https://twigfiddle.com/rg0biy
("katı_değişkenler" kapalı olarak ayarlayarak deneyebilirsiniz , varsayılan olarak web sitesinde açıktır)


1

Kabuk , 5 bayt

↔¤żY↔

Kolayca giriş / çıkış basamak listesi olarak alır, çevrimiçi deneyin veya hepsini doğrulayın!

açıklama

↔¤ż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 bayt

|>E:o

Çalıştır ve hata ayıkla

Bu program girdiyi dizeler dizisi olarak alır.

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

Bunu çalıştır

Bu "vahşi doğada" bindirme talimatı için ilk kez bir kullanım gördüm.



1

Pyth, 5 bayt

meSdC

Girdiyi boşlukla doldurulmuş iki dizenin dizisi olarak alır.

meSd       map greatest
    C      on the transpose of input

Burada deneyin .



1

Seylan, 55/99

Aynı uzunlukta 0- veya boşlukla doldurulmuş dizelerle (yinelenebilir karakter döndürme):

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

0- veya boşlukla doldurulmuş dizelerle (bir Dize döndürme):

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

Farklı uzunluktaki dizelerle (bir Dize döndürme):

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



1

Retina 0.8.2 , 39 bayt

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

Çevrimiçi deneyin! Bağlantı test paketini içerir. Önceki 45 bayt Retina 1 sürümü unpadded dizeleri kabul eder:

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

Çevrimiçi deneyin! Bağlantı test paketini içerir. Açıklama:

P^`.+

Her iki değeri de aynı uzunlukta doldurun. (Sadece Retina 1. Retina 0.8.2'de bunu taklit etmenin yolları vardır, ancak bunlar çok golfçü değildir.)

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

Değerleri aktarın.

%O`.

Her çifti sırayla sıralayın.

¶.?

Tüm düşük rakamları ve artı yeni satırları silin.


1

Kömür , 8 bayt

⭆θ⌈⟦ι§ηκ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

 θ          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 baytlık sürüm herhangi bir sayıda dolgulu dizeyi "ekler":

⭆§θ⁰⌈Eθ§λκ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Önceki 14 baytlık sürüm, unpadded dizeleri kabul eder:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

  θ             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 baytlık sürüm herhangi bir sayıda dizeyi "ekler":

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur.


Soru değiştirildi, böylece dizeler dolgulu olarak girilebiliyor
sadece ASCII-sadece

Nitpicking, ama ilk ayrıntılı sürümünde yakın bir paren kaçırdın: P
sadece ASCII sadece

@ ASCII-only Sadece TIO benim için ebeveynleri eşleştirdiyse ;-)
Neil

0

Mathematica 50 bayt

a = 543; b = 791;

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

(* 793 *)


1
Bir TIO ekleyebilir misiniz? Mathematica bilmiyorum ama 2 giriş eşit sayıda basamak yoksa bu başarısız olabilir şüpheli.
Shaggy

1
Bence bu izin verilmeyen bir pasaj yapacak ön tanımlı değişkenler yoluyla girdi alıyoruz. Başvurular bir işlev veya tam bir program olmalıdır
Jo King
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.