"Gandakan" dua string


29

Ini terinspirasi oleh fungsi yang baru-baru ini saya tambahkan ke bahasa saya Tambah ++ . Karena itu saya akan mengirimkan jawaban singkat di Add ++ tetapi saya tidak akan menerimanya jika menang (itu tidak adil)

Tidakkah kamu membencinya ketika kamu bisa melipatgandakan angka tetapi tidak membalikan? Jadi Anda harus memperbaikinya, bukan?

Anda harus menulis fungsi atau program lengkap yang mengambil dua string yang tidak kosong sebagai input dan output versi yang dikalikan.

Bagaimana Anda mengalikan string? Aku akan memberitahu Anda!

Untuk mengalikan dua string, Anda mengambil dua string dan membandingkan setiap karakter. Karakter dengan titik kode tertinggi kemudian ditambahkan ke output. Jika mereka sama, cukup tambahkan karakter ke output.

String tidak dijamin panjangnya sama. Jika panjangnya berbeda, panjang string terakhir adalah panjang string terpendek. Masukan akan selalu huruf kecil dan mungkin mengandung karakter apa pun dalam rentang ASCII yang dapat dicetak ( 0x20 - 0x7E), tidak termasuk huruf besar.

Anda dapat menampilkan dalam format apa pun yang masuk akal, seperti string, daftar dll. Jadilah masuk akal, bilangan bulat bukanlah cara yang masuk akal untuk menghasilkan dalam tantangan ini.

Dengan input hello,dan world!, beginilah cara kerjanya

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

Jadi hasil akhir untuk hello,dan world!akan worlo,!

Lebih banyak kasus uji

(tanpa langkah)

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.

Ini adalah sehingga kode terpendek menang! Luok!


35
Ini adalah maksimum string, bukan? Itu tidak tampak seperti mengalikan.
xnor

5
Nitpick: PPCG telah lulus, kami belum mendapatkan desain baru.
Dennis

Jawaban:


53

Haskell, 11 byte

zipWith max

Cobalah online!

Tidak banyak yang bisa dijelaskan.


7
Dan saya pikir Mathematica memiliki built-in yang aneh
Tn. Xcoder

@ Mr.Xcoder Mathematica memiliki zipWith, namanya MapThread
michi7x7

2
@ Mr.Xcoder sebenarnya, zipWithtidak terlalu aneh. Ini primitif fungsional yang cukup umum. Gagasan "zip" dua daftar bersama muncul dalam banyak masalah, dan begitu Anda melakukannya, Anda sering ingin menerapkan beberapa fungsi ke item 2-elemen yang dihasilkan, maka bagian "dengan".
Jonah


6

Perl 6 , 22 byte

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

Sebagai bonus, ia menerima sejumlah multiplikasi, bukan hanya dua.


6

Japt , 16 byte

ñl g îUy ®¬ñ oÃq

Uji secara online! Mengambil input sebagai array dari dua string.

Kurangnya min dan max built-in melukai Japt di sini, tetapi masih berhasil melakukan skor yang lumayan ...

Penjelasan

 ñ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

Jelly , 5 byte

żœ-"«

Cobalah online!

Bagaimana itu bekerja

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

Contoh

Misalkan s = blended dan t = bold .

żhasil panen ["bb", "lo", "el", "nd", 'd', 'e', 'd']. Tiga elemen terakhir adalah karakter.

«adalah vektorisasi, minimum diadik, sehingga menghasilkan ['b', 'l', 'e', 'd', 'd', 'e', 'd'].

œ-"menghapus tepat satu kemunculan karakter ke- n di larik kedua dari string ke- n / karakter di larik pertama, menghasilkan . adalah atom pengurangan multiset , dan cepat membuatnya menjadi vektor.["b", "o", "l", "n", "", "", ""]œ-"

Saat dicetak, ini hanya membaca boln .


Jadi, ini adalah zip, kemudian mengambil perbedaan multiset dari sesuatu, lalu ada beberapa tanda kutip ganda yang bagus dari makna misterius, dan akhirnya minimum. Bagus ... Tolong, penjelasannya? : D
Leo

1
Saya telah menambahkan contoh yang berfungsi.
Dennis


6

Alice , 8 byte

/oI\
@m+

Cobalah online!

Penjelasan

Alice juga memiliki operator ini (yang saya sebut superimpose ) tetapi tidak membatasi output dengan panjang string yang lebih pendek (sebagai gantinya, karakter yang tersisa dari string yang lebih panjang ditambahkan). Namun, ia juga memiliki operator untuk memotong lebih panjang dari dua string dengan panjang yang lebih pendek.

/   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 byte

{O^`
G`.
^.+$

M!\*`^.
Rm`^.

Cobalah online!

Penjelasan

{O^`

The {memberitahu Retina untuk menjalankan seluruh program dalam satu lingkaran sampai gagal mengubah string yang berfungsi. Omenjadikan ini tahap penyortiran yang mengurutkan garis-garis yang tidak kosong secara default. The ^pilihan membalikkan hasilnya. Jadi, pada dasarnya, kita mendapatkan dua baris terbalik jika tidak kosong, menempatkan garis dengan karakter utama yang lebih besar di bagian atas.

G`.

Buang baris kosong jika ada.

^.*$

Jika hanya satu baris yang tersisa, salah satu baris kosong, dan kami menghapus yang lain juga untuk menghentikan proses.

M!\*`^.

Banyak konfigurasi terjadi di sini. Ini cocok dengan ( M) karakter pertama dalam string yang bekerja ( ^.), mengembalikannya ( !), mencetaknya tanpa trafeed linefeed ( \) dan kemudian mengembalikan string yang bekerja ke nilai sebelumnya ( *). Dengan kata lain, kita cukup mencetak karakter pertama dari string yang berfungsi (yang merupakan karakter utama maksimal) tanpa benar-benar mengubah string.

Rm`^.

Akhirnya, kami menghapus karakter pertama dari setiap baris, sehingga iterasi berikutnya memproses karakter berikutnya.


Ketika Anda mengomentari seberapa tinggi jawaban monolit saya, terpikir oleh saya bahwa jawaban saya untuk pertanyaan ini terlalu lama, dan mungkin saya mentranspos secara tidak efisien. Setelah melihat bagaimana saran transposisi Anda bekerja, saya memutuskan bahwa itu tidak sesuai untuk pertanyaan ini. Saya kemudian datang dengan pendekatan baru yang menyelamatkan saya 19 byte ... dan kemudian menggulir ke bawah untuk menemukan Anda sudah datang dengan versi yang lebih baik ...
Neil

Anda dapat menyimpan 3 byte karena G`.tidak perlu, meskipun ini menghasilkan baris baru tambahan yang dapat Anda hapus dengan menggunakan ^.+¶$atau dengan awalan a \ke awal jawaban.
Neil

@Neil Oh, bagus. Saya juga bisa menggunakan komit terbaru (yang belum pada TIO dan mungkin tidak akan untuk sementara waktu) di mana saya telah membuat pencetakan tanpa membuntuti linefeeds default (saya kemudian bisa juga menjatuhkan yang lain \).
Martin Ender


6

JavaScript (ES6), 47 45 byte

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>

Mudah c>b[i]mengembalikan false melewati akhir b. Sunting: Disimpan 2 byte berkat @ETHproductions.


Di sini, di ponsel saya bahwa kode di atas tidak dapat dieksekusi. Di PC desktop contoh di atas saya katakan bisa berjalan ok, tetapi tidak mengizinkan untuk mengubah input untuk fungsi ... Mengapa tidak menggunakan Tio sebagai gantinya?
RosLuP

@RosLuP Ketika input sederhana (2 sengatan dalam kasus ini) Saya lebih suka menggunakan Stack Snippet yang biasanya membuatnya lebih mudah untuk mengubah input dan output juga memperbarui secara dinamis.
Neil


5

Mathematica, 78 byte

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

Ada jawaban lain di Mathematica . Jawaban ini mengambil input sebagai daftar string, sehingga /@dapat digunakan #sebagai ganti {##}. Dan kita bisa hanya Mapnama fungsi panjang pada objek daripada menugaskannya ke variabel. (pada kenyataannya, setiap nama simbol bawaan Matematika digunakan paling banyak sekali dalam fungsi)


5

Java 8, 124 120 117 63 byte

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

-4 byte terima kasih kepada @ Khaled.K .
-3 byte terima kasih kepada @Jakob .

Input adalah dua array karakter, dan berhenti dengan ArrayIndexOutOfBoundsException.

Penjelasan:

Coba di sini.

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 byte

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

C # memiliki implisit charuntuk intkonversi (karena charsebenarnya adalah di intbawahnya) yang bagus, dan alih-alih mencari string terpendek coba saja sampai gagal


1
Kalahkan aku! Namun, simpan satu byte dengan currying a=>b=>dengan mengkompilasi ke a Func<string, Func<string, string>>. Anda dapat menghapus kawat gigi di sekitar loop untuk menyimpan 2 byte.
TheLethalCoder

Catatan: C# has implicit char to int conversionbenar karena a charadalah di intbawahnya.
TheLethalCoder

@TheLethalCoder: Tidak cukup. sizeof(int) == 4tapi sizeof(char) == 2.
rekursif

4

MATL , 8 byte

otX>cwA)

Input adalah array sel string, dalam format {'abcd' 'efg'}

Cobalah online!

Selain itu, ini juga berfungsi untuk lebih dari dua string .

Penjelasan

Pertimbangkan input {'blended' 'bold'}. Tumpukan ditampilkan terbalik, dengan elemen yang lebih baru di bawah ini.

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 byte

Kode:

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

Kasus uji:

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

Hah? Max bekerja seperti itu? TIL
JAD,



4

V , 28, 24 , 21 byte

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

Cobalah online!

Hexdump:

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

Tiga byte disimpan berkat @ nmjcman101!

Penjelasan:

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

Apakah itu dGperlu? Bukankah semua baris baru dihapus dengan Íîanyways?
nmjcman101

@ nmjcman101 Diperlukan jika string panjangnya berbeda.
DJMcMayhem

3

CJam , 12 byte

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

Input adalah daftar dua string. Program keluar dengan kesalahan (setelah menghasilkan output yang tepat) jika kedua string memiliki panjang yang berbeda.

Cobalah online!

Penjelasan

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 byte

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

Yay untuk komposisi fungsi :) Mengembalikan urutan karakter alih-alih string, tetapi sebagian besar bekerja dengan cara yang sama di Clojure kecuali saat mencetak atau mencocokkan regex.

Sedihnya maxtidak bekerja dengan karakter.


maxtidak bekerja, tetapi max-keytidak. #(map(partial max-key int)% %2)Ini adalah jumlah byte yang sama persis.
madstap

Oh keren, saya sudah lupa tentang itu. Jauh lebih sederhana daripada misalnya (ffirst (sort-by second ...).
NikoNyrh

3

Javascript (ES2015), 66 63 49 byte

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

Penjelasan:

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

Versi sebelumnya:

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

Selamat datang di PPCG! Posting pertama yang bagus!
R

3

Retina , 55 36 byte

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

Cobalah online! Penjelasan: Baris diawali untuk menampung hasilnya. Sementara kedua string masih memiliki karakter yang tersisa, input diurutkan dan karakter utama dengan titik kode tertinggi dipindahkan ke hasil sementara karakter utama lainnya dihapus. Akhirnya hasilnya dicetak.


3

Sekam , 2 byte

z▲

Cobalah online!

"Tidak Disatukan" / Dijelaskan

Memanfaatkannya zip fmemotong daftar yang lebih pendek sehingga selalu ada dua argumen untuk f, misalnya 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 byte

-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

Simpan sebagai file .ps1 dan jalankan

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

Sebelumnya, 78 byte:

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

2

J, 25 byte

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

penjelasan

setengah dari byte digunakan untuk menyelesaikan memastikan kedua input memiliki panjang input yang lebih pendek (akan senang melihat peningkatan pada bagian ini, jika ada yang memilikinya):

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

<.&#adalah minimum dari dua panjang, dan {."1,:mengambil banyak karakter dari kedua baris dari tabel 2-baris yang terdiri dari string kiri ditumpuk di atas yang kanan.

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

Gunakan kata kerja Di Bawah &.untuk mengonversikan setiap karakter ke indeks ascii-nya, ambil maksimum dua angka, dan kemudian konversikan kembali ke karakter.

Cobalah online!


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

@ Miles, kombinasi elegan antara kereta dan konjungsi - saya perlu menggunakan trik itu lebih banyak untuk menghindari parens. juga u:merupakan TIL untuk saya.
Jonah

2

Koleksi Java 8 + Eclipse, 70 64 byte

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

adan bkeduanya MutableList<Character>dari koleksi gerhana.


2

Tambahkan ++ , 8 byte

D,f,@@,^

Cobalah online!

Dalam versi 0.4 hingga 1.11, ^eksponen dua angka atau "mengalikan" dua string, tergantung pada jenis argumen.


Ini agak bertentangan dengan semangat kode-golf, untuk mengirim pertanyaan mengetahui bahwa bahasa Anda sendiri (yang tidak digunakan orang lain) memiliki built-in yang memberikan monopoli. Syukurlah, keringkasan Jelly menang lagi.
FlipTack

12
@FlipTack apakah Anda membaca baris pertama pertanyaan? Bahkan jika ini 0 byte, itu tidak akan menang.
caird coinheringaahing

1
@StephenS Tampaknya fitur tersebut menginspirasi tantangan, bukan sebaliknya. Label yang tidak bersaing dicadangkan untuk jawaban yang menggunakan bahasa atau fitur yang hanya diterapkan setelah tantangan.
Martin Ender

1

Mathematica, 102 byte

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


memasukkan

["blended", "bold"]


L@a~Min~L@bmenghemat satu byte
Greg Martin

1

APL (Dyalog) , 22 byte

Mengambil dua (atau lebih!) String sebagai argumen yang benar.

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

Cobalah online!

{ fungsi anonim di mana argumen yang tepat diwakili oleh

⎕UCS simbol dari U nicode C haracter S et yang sesuai dengan

⌈⌿ nilai maksimum di setiap kolom

⎕UCS poin kode dari U nicode C haracter S et untuk

 matrified (matriks dari daftar string)

 argumen

↑¨⍨ masing-masing dibatasi pada

⌊/ minimum

≢¨ panjangnya

 argumen

}

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.