İkili “çarpın”


29

Bu, son zamanlarda dilime Add ++ ekledim bir işlevden ilham aldı . Bu nedenle Add ++ 'da kısa bir cevap sunacağım ancak kazanırsa kabul etmem (adil olmaz)

Rakamları çoğaltabildiğiniz, ancak karakter dizilemediğinizden nefret etmiyor musunuz? Demek düzeltmelisin, değil mi?

Boş olmayan iki dizeyi giriş olarak alan ve çarpılmış versiyonlarını çıkaran bir fonksiyon veya tam program yazacaksınız.

Dizeleri nasıl çarparsın? Sana anlatacağım!

İki dizgiyi çarpmak için iki dizge alır ve karakterleri karşılaştırırsınız. En yüksek kod noktasına sahip karakter daha sonra çıkışa eklenir. Eşitlerse, karakteri çıktıya eklemeniz yeterlidir.

Dizelerin uzunluk bakımından eşit olmaları garanti edilmez. Uzunlukları farklıysa, son dizenin uzunluğu en kısa dizenin uzunluğudur. Giriş her zaman küçük harf olur ve yazdırılabilir ASCII aralığında ( 0x20 - 0x7E), büyük harfler hariç herhangi bir karakter içerebilir .

Dize, liste vb. Gibi makul herhangi bir formatta çıktı alabilirsiniz.

Girişleri ile hello,ve world!, bu nasıl çalışır

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

Yani için son çıktı hello,ve world!olacaktıworlo, !

Daha fazla test vakası

(adımsız)

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.

Bu bir yani en kısa kod kazanır! Luok!


35
Bu, dizgelerin elementwise maksimumudur, değil mi? Bu çarpma gibi bir şey görünmüyor.
xnor,

5
Nitpick: PPCG mezun oldu, henüz yeni bir tasarım almadık.
Dennis,

Yanıtlar:


53

Haskell, 11 bayt

zipWith max

Çevrimiçi deneyin!

Açıklayacak çok bir şey yok.


7
Ve Mathematica'nın garip yapıları olduğunu düşündüm
Bay Xcoder

@ Mr.Xcoder Mathematica'da zipWith var, buna MapThread denir
michi7x7

2
@ Mr.Xcoder aslında, zipWithçok garip değil. Bu oldukça yaygın bir işlevsel ilkeldir. İki listeyi bir araya getirme fikri birçok problemde ortaya çıkar ve bunu bir kez yaptığınızda, sonuçta 2 elemanlı öğelere, dolayısıyla "with" kısmına bazı fonksiyonlar uygulamak istersiniz.
Jonah


6

Perl 6 , 22 bayt

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

Bir bonus olarak, sadece iki tane değil, herhangi bir sayıda çoklu kopya kabul eder.


6

Japt , 16 bayt

ñl g îUy ®¬ñ oÃq

Çevrimiçi test edin! Girdiyi iki karakter dizisi olarak alır.

Min ve maksimum yapıdaki eksiklik Japt'u burada incitti, ama yine de biraz iyi bir puan çekmeyi başarıyor ...

açıklama

 ñ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

Jöle , 5 bayt

żœ-"«

Çevrimiçi deneyin!

Nasıl çalışır

żœ-"«  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.

Örnek

Let s = harmanlanmış ve t kalın = .

żverim ["bb", "lo", "el", "nd", 'd', 'e', 'd']. Son üç element karakterdir.

«minimum, vektörleştirme, minimum, yani elde edilir ['b', 'l', 'e', 'd', 'd', 'e', 'd'].

œ-"Tam bir oluşumunu ortadan kaldırır N inci ikinci dizideki karakteri N inci birinci dizideki dize / karakter, sonuçta ["b", "o", "l", "n", "", "", ""]. œ-olduğu multiset çıkarma atomu ve hızlı" onu vectorize eder.

Basıldığında bu sadece cıvatayı okur .


Yani, bu sıkıştırılıyor, daha sonra bir şeylerin çoklu ayar farkını alarak, o zaman gizemli anlamdaki bazı güzel çift tırnak işaretleri var ve nihayetinde minimum. Güzel ... Açıklama, lütfen? : D
Leo

1
Çalıştığım bir örnek ekledim.
Dennis,


6

Alice , 8 bayt

/oI\
@m+

Çevrimiçi deneyin!

açıklama

Alice, bu operatöre ( üst üste dediğim ) sahiptir ancak çıktıyı daha kısa dize uzunluğuyla sınırlamaz (bunun yerine, uzun dize kalan karakterleri eklenir). Bununla birlikte, iki dizginin uzunluğunu kısa olanın uzunluğuna kesecek bir operatöre de sahiptir.

/   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

Retina , 28 bayt

{O^`
G`.
^.+$

M!\*`^.
Rm`^.

Çevrimiçi deneyin!

açıklama

{O^`

{İşçi dizesini değiştirmek için başarısız kadar bir döngü içinde tüm programı çalıştırmak için Retina söyler. Obunu, boş olmayan satırları varsayılan olarak sıralayan bir sıralama aşaması yapar. ^Opsiyon sonucunu tersine çevirir. Sonuç olarak, eğer boş değilse, iki satırın tersini alırız, çizgiyi daha büyük baş karaktere getirir.

G`.

Varsa boş satırları atın.

^.*$

Yalnızca bir satır kalırsa, satırlardan biri boştu ve diğerini de işlemi durdurmak için kaldırıyoruz.

M!\*`^.

Burada birçok yapılandırma var. Bu, ( M) dizesindeki ilk karakterle ( ) eşleşir ^., onu döndürür ( !), onu izleyen satır beslemesi olmadan basar ( \) ve sonra çalışma dizesini önceki değerine ( *) geri döndürür . Başka bir deyişle, yalnızca dizeyi değiştirmeden çalışma dizesinin ilk karakterini (bu, en büyük satır karakteridir) basarız.

Rm`^.

Son olarak, ilk karakteri her satırdan kaldırırız, böylece bir sonraki yineleme sonraki karakteri işler.


Monolitlerin cevaplarının ne kadar uzun olduğu konusunda yorum yaptığınızda, bu soruya verdiğim cevabın çok uzun olduğu ve belki de verimsiz bir şekilde aktardığım aklıma geldi. Aktarım önerinizin nasıl çalıştığına baktıktan sonra, bu soru için sonuçta uygun olmadığına karar verdim. Sonra bana 19 bayt kazandıran yeni bir yaklaşımla geldim ... ve daha iyi bir sürümle geleceğini bulmak için aşağıya kaydırıldım ...
Neil

Gerekmediği için 3 byte tasarruf edebilirsiniz G`., bununla birlikte , cevabın başına ^.+¶$ya da ön ekini kullanarak çıkarabileceğiniz ekstra bir yeni satır çıkarır \.
Neil

@Neil Oh iyi nokta. Ayrıca, varsayılan TEFE'leri izlemeden baskı yaptığım (daha sonra diğerini de düşürebilirim), (henüz TIO'da değil ve muhtemelen bir süre olmayacak) son sözleri kullanabilirim \.
Martin Ender


6

JavaScript (ES6), 47 45 bayt

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>

Elverişli c>b[i]sonunun false döndürür b. Düzenleme: @ETHproductions sayesinde 2 bayt kaydedildi.


İşte cep telefonumda yukarıdaki kod çalıştırılamıyor. PC masaüstünde yukarıdaki örnekler tamam çalıştırabilir, ancak işlevler için girişi değiştiremezler ... Neden Tio kullanmıyorsunuz?
RosLuP

@RosLuP Giriş basit olduğunda (bu durumda 2 acı) Girişleri ve çıkış güncellemelerini de dinamik olarak değiştirmeyi kolaylaştıran bir Stack Snippet'i kullanmayı tercih ederim.
Neil


5

Mathematica, 78 bayt

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

Mathematica'da zaten başka bir cevap var . Bu cevap dizelerin bir listesi olarak girdi alır, bu yüzden yerine /@kullanılabilir . Ve onu değişkenlere atamak yerine sadece uzun işlev ismini nesnede bulabiliriz. (aslında, her bir Mathematica yerleşik sembol adı, işlevde en çok bir kez kullanılır)#{##}Map


5

Java 8, 124 120 117 63 bayt

a->b->{for(int i=0;;i++)System.out.print(a[i]>b[i]?a[i]:b[i]);}

@ Khaled.K sayesinde -4 byte . @ Jakob
sayesinde -3 bayt .

Girişler iki karakter dizisidir ve bir ile durur ArrayIndexOutOfBoundsException.

Açıklama:

Burada dene.

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 bayt

a=>b=>{var s="";try{for(int q=0;;q++)s+=a[q]>b[q]?a[q]:b[q];}catch{}return s;}

C # örtülü vardır chariçin int(a nedeniyle dönüşüm charbir aslında intgüzel altına) ve bunun yerine en kısa dize arayan sadece başarısızlık kadar deneyin


1
Beni yen! Bununla birlikte, a ile a=>b=>derleyerek, bir bayt'ı kurutma ile kaydedin Func<string, Func<string, string>>. 2 bayttan tasarruf etmek için for döngüsü etrafındaki parantezleri kaldırabilirsiniz.
TheLethalCoder

Yan Not: C# has implicit char to int conversionBir nedeni doğrudur charbir olduğunu intaltından.
TheLethalCoder

@TheLethalCoder: Pek değil. sizeof(int) == 4ama sizeof(char) == 2.
özyinelemeli

4

MATL , 8 bayt

otX>cwA)

Giriş, biçimindeki bir hücre dizesi dizisidir {'abcd' 'efg'}

Çevrimiçi deneyin!

Bir kenara, bu da ikiden fazla dize için çalışır .

açıklama

Girişi düşünün {'blended' 'bold'}. Yığın baş aşağı, daha yeni elemanlar aşağıda gösterilmiştir.

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 bayt

Kod:

n=min(sapply(y<-strsplit(scan(,"",sep="\n"),""),length));cat(mapply(max,el(y)[1:n],y[[2]][1:n]),sep="")

Test durumları:

> 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.

Ha? Max böyle mi çalışıyor? TIL
JAD



4

V , 28, 24 , 21 bayt

Í./&ò
dd{JdêHPÎúúx
Íî

Çevrimiçi deneyin!

HexDump:

00000000: cd2e 2f26 f20a 6464 7b4a 64ea 4850 cefa  ../&..dd{Jd.HP..
00000010: fa78 0acd ee                             .x...

@ Nmjcman101 sayesinde üç bayt kurtarıldı!

Açıklama:

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

dGgerekli? Tüm yeni satırlar yine de kaldırılmıyor Íîmu?
nmjcman101

@ nmjcman101 İplerin farklı uzunluklarda olması gerekir.
DJMcMayhem

3

CJam , 12 bayt

q~z{1/~e>o}%

Giriş iki dizenin bir listesidir. İki dizenin farklı uzunlukları varsa program bir hatayla (doğru çıktıyı ürettikten sonra) çıkar.

Çevrimiçi deneyin!

açıklama

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 bayt

#(map(comp last sort list)% %2)

İşlev bileşimi için Yay :) Dizge yerine bir karakter dizisi döndürür, ancak yazdırma veya regex eşleşmesi dışında çoğunlukla Clojure'da aynı şekilde çalışır.

Ne yazık ki maxkarakterlerle çalışmıyor.


maxçalışmıyor, çalışıyor max-key. #(map(partial max-key int)% %2)Yine de aynı byte sayısı.
madstap

Harika, bunu unutmuştum. Örneğin çok daha basit (ffirst (sort-by second ...).
NikoNyrh

3

Javascript (ES2015), 66 63 49 bayt

a=>b=>[...a].map((c,i)=>c>b[i]?c:b[i]||'').join``

Açıklama:

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

Önceki sürümler:

//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'ye Hoşgeldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ

3

Retina , 55 36 bayt

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

Çevrimiçi deneyin!Açıklama: Sonucu tutmak için bir satır eklenmiştir. Her iki dizede hala karakter kaldıysa, girişler sıralanır ve en yüksek kod noktasına sahip baş karakter diğer baş karakter silinirken sonuca taşınır. Sonunda sonuç yazdırılır.


3

Kabuğu , 2 bayt

z▲

Çevrimiçi deneyin!

"Ungolfed" / Açıklaması

Markalar kullanımı zip fiçin iki argüman her zaman vardır, öyle ki o kesikler kısa listeyi förn 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"


2

PowerShell, 75 bayt

-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 dosyası olarak kaydedin ve çalıştırın

PS C:\> .\Get-MultipliedString.ps1 'hello,' 'world!'
worlo,

Önceden, 78 bayt:

$i=0;-join$(while(($a=$args[0][$i])-and($b=$args[1][$i++])){($a,$b)[$b-gt$a]})

2

J, 25 bayt

>./&.(a.&i.)@(<.&#{."1,:)

açıklama

baytların yarısı, her iki girdinin de daha kısa girdi uzunluğuna sahip olmasını sağlamaya çalışmaktadır (biri varsa, bu bölümde bir iyileşme görmeyi çok ister):

(<.&#{."1,:)

<.&#iki uzunluk minimumdur {."1,:ve sağdaki üste yığılmış sol diziden oluşan 2-satırlı tablonun her iki satırından da birçok karakter alır.

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

&.Her bir karakteri kendi ascii dizinine dönüştürmek, iki sayının en fazlasını almak ve sonra tekrar karakterlere dönüştürmek için Under fiilini kullanın .

Çevrimiçi deneyin!


1
21 bayt[:>./&.(3&u:)<.&#$&>;
mil

miller, zarif tren ve kavşak kombinasyonu - bu hileyi parenleri önlemek için daha fazla kullanmam gerekiyor. Ayrıca u:benim için bir TIL oldu.
Jonah

2

Java 8 + Eclipse Koleksiyonları, 70 64 bayt

a->b->a.zip(b).collect(p->(char)Math.max(p.getOne(),p.getTwo()))

ave bikisi de MutableList<Character>tutulma koleksiyonlarındandır.


2

++ , 8 bayt ekle

D,f,@@,^

Çevrimiçi deneyin!

0.4 ile 1.11 arasındaki sürümlerde, ^iki sayıya neden olur veya bağımsız değişkenlerin türüne bağlı olarak iki dizeyi "çarpar".


Bu daha ziyade kod-golf ruhuna aykırıdır, kendi dilinizin (başka kimsenin kullanmadığı) kendi başına bir tekel olduğunu bilen bir soru sormak için. Neyse ki, Jelly özlü tekrar kazanır.
FlipTack

12
@FlipTack, sorunun ilk satırını okudunuz mu? Bu 0 bayt olsaydı bile kazanmazdı.
caird coinheringaahing

1
@StephenS Bu özellik tam tersi değil, mücadeleye ilham verdi. Rekabet etmeyen etiket, dilleri veya sadece mücadeleden sonra uygulanan özellikleri kullanan cevaplar için ayrılmıştır.
Martin Ender

1

Mathematica, 102 bayt

T=ToCharacterCode;L=Length;(a=T@#;b=T@#2;FromCharacterCode@Table[Max[a[[i]],b[[i]]],{i,L@a~Min~L@b}])&


giriş

["karışımlı", "kalın"]


L@a~Min~L@bbir bayt kaydeder
Greg Martin

1

APL (Dyalog) , 22 bayt

İki (veya daha fazla!) Dizgiyi doğru argüman olarak alır.

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

Çevrimiçi deneyin!

{ Doğru argümanın ile temsil edildiği isimsiz bir fonksiyon

⎕UCSU nikotu C haracter S ve  sembollerine karşılık gelen semboller

⌈⌿ her sütunda bulunan maksimum değer

⎕UCS kod, ABD’nin U nikel C haracter S ve

 matrified (dizeler listesinden matris)

 argümanlar

↑¨⍨ her biri

⌊/ en az

≢¨ uzunluklar

 argümanların

}

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.