การคูณสตริงที่ชาญฉลาด


28

แรงบันดาลใจจากความท้าทายนี้ (ขอบคุณ @cairdcoinheringaahing สำหรับชื่อเรื่อง!) งานของคุณคือการใช้สาย ASCII สองสายที่พิมพ์ได้และคูณองค์ประกอบด้วยกฎต่อไปนี้

มันทำงานยังไง?

รับสองสาย (ตัวอย่างsplitและisbn) คุณจะแรกตัดทอนให้ยาวขึ้นเพื่อให้มีความยาวเท่ากันจากนั้นกำหนดรหัส ASCIIของพวกเขา:

split -> spli -> [115, 112, 108, 105]
isbn  -> isbn -> [105, 115,  98, 110]

ขั้นตอนต่อไปคือการแมปไปยังช่วง[0..94]โดยการลบ32แต่ละรหัส:

[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115,  98, 110] -> [73, 83, 66, 78]

ตอนนี้คุณจะคูณโมดูโลแบบองค์ประกอบ95(เพื่อให้อยู่ในช่วงที่พิมพ์ได้):

[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]

เพิ่ม32เพื่อกลับไปที่ช่วง[32..126]:

[74, 85, 76, 89] -> [106, 117, 108, 121]

และขั้นตอนสุดท้ายคือการแมปกลับไปที่อักขระ ASCII:

[106, 117, 108, 121] -> "july"

กฎระเบียบ

  • คุณจะเขียนโปรแกรม / ฟังก์ชั่นที่ใช้ขั้นตอนที่อธิบายไว้ในสองสายและพิมพ์หรือส่งคืนสตริงผลลัพธ์
  • รูปแบบอินพุตมีความยืดหยุ่น: คุณสามารถรับได้สองสาย, tuple ของสตริง, รายการของสตริงเป็นต้น
  • อินพุตอาจประกอบด้วยสตริงว่างหนึ่งหรือสองสตริง
  • อินพุตจะเป็นอักขระในช่วงที่สามารถพิมพ์ได้ ( [32..126])
  • เอาต์พุตถูกพิมพ์ไปที่คอนโซลหรือคุณส่งคืนสตริง
  • การส่งออกได้รับอนุญาตให้มีช่องว่างต่อท้าย

กรณีทดสอบ

"isbn", "split"                  -> "july"
"", ""                           -> ""
"", "I don't matter"             -> ""
"             ", "Me neither :(" -> "             "
"but I do!", "!!!!!!!!!"         -> "but I do!"
'quotes', '""""""'               -> 'ck_iKg'
"wood", "hungry"                 -> "yarn"
"tray", "gzip"                   -> "jazz"
"industry", "bond"               -> "drop"
"public", "toll"                 -> "fall"
"roll", "dublin"                 -> "ball"
"GX!", "GX!"                     -> "!!!"
"4 lll 4", "4 lll 4"             -> "4 lll 4"
"M>>M", "M>>M"                   -> ">MM>"

หมายเหตุ : คำพูดนี้เป็นเพียงสำหรับการอ่านในกรณีทดสอบที่ 6 ผมใช้แทน'"


คุณได้รับอนุญาตให้มีช่องว่างต่อท้ายในเอาต์พุตของคุณหรือไม่
Erik the Outgolfer

@EriktheOutgolfer ใช่ ขออภัยฉันเพิ่มว่าหลังจากโพสต์
ბიმო

เราสามารถใช้อาร์เรย์ของสตริงได้หรือไม่? abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
มนุษย์โดยรวม

@tallyallyhuman ฉันจะไม่พูดเช่นนั้น แม้ว่าถ้าในสายภาษาของคุณเป็นอาร์เรย์ของตัวอักษรและตัวอักษรที่มีชนิดเดียวกันกับสตริงแล้วมันจะถูกต้องฉันเดา
ბიმო

เราอนุญาตให้ป้อนข้อมูลเป็นรายการสตริงหรือไม่
Zacharý

คำตอบ:


9

MATLขนาด 12 ไบต์

c32-p95\32+c

ลองออนไลน์!

คำอธิบาย

c      % Implicitly input cell array of 2 strings. Convert to 2-row char matrix.
       % This pads the shorter string with spaces
32-    % Subtract 32, element-wise. Each char is interpreted as its ASCII code.
       % Note that padding spaces will give 0.
p      % Product of each column. Since (padding) spaces have been mapped to 0, the
       % product effectively eliminates those colums. So the effect is the same as
       % if string length had been limited by the shorter one
95\    % Modulo 95, element-wise
32+    % Add 32, element-wise
c      % Convert to char. Implicitly display

1
วิธีการจัดการความแตกต่างของความยาวสตริงอย่างชาญฉลาด
Sanchises

6

เยลลี่ , 15 12 ไบต์

z⁶O_32P€‘ịØṖ

ลองออนไลน์!

-3 ขอบคุณที่โจนาธานอัลลัน


การละเมิดอย่างไม่ระมัดระวังของช่องว่างต่อท้าย ;)
Dennis

@Dennis ดีอยู่ในกฎทำไมไม่ละเมิดมันได้หรือไม่
Erik the Outgolfer

ฉันเชื่อว่าคุณสามารถบันทึกได้ 3 ไบต์โดยใช้อะตอม niladic สำหรับตัวอักษรที่พิมพ์ØṖได้ด้วยz⁶O_32P€‘ịØṖ- คุณควรตรวจสอบซ้ำว่าการคำนวณทางคณิตศาสตร์นั้นดีที่สุดหรือไม่
Jonathan Allan

@JanathanAllan แน่นอน
Erik the Outgolfer


5

Python 2 , 75 70 ไบต์

-3 ไบต์ขอบคุณคำแนะนำของ Dennis สำหรับคำแนะนำของ shooqie -2 ไบต์ขอบคุณคำแนะนำของZacharý

lambda*l:''.join(chr((ord(i)-32)*(ord(j)-32)%95+32)for i,j in zip(*l))

ลองออนไลน์!


2
เคล็ดลับแบบเดียวกันกับที่แนะนำไว้ในคำตอบของฉัน:lambda*t:''.join(chr(((ord(i)-32)*(ord(j)-32))%95+32)for i,j in zip(*t))
Dennis

2
และเช่นเดียวกับที่ฉันแนะนำให้มาก: ((ord(i)-32)*(ord(j)-32))%95+32=> (ord(i)-32)*(ord(j)-32)%95+32...
Zacharý

o_o เต้น Dennis +1
Zacharý

1
mapเอ๊ะไม่ได้จริงๆผมก็เปลี่ยนไปเป็นความเข้าใจรายการแทนการใช้ ฉันมาสายเล็กน้อย
มนุษย์โดยรวม

5

Haskell , 60 57 ไบต์

zipWith(\a b->toEnum$f a*f b`mod`95+32)
f=(-32+).fromEnum

ลองออนไลน์!

บรรทัดแรกคือฟังก์ชันที่ไม่ระบุชื่อโดยรับสองอาร์กิวเมนต์

นี่เป็นการดำเนินการของอัลกอริทึมแบบตรงไปข้างหน้า: zipWithรับทั้งสตริงและใช้ฟังก์ชันที่กำหนดให้กับคู่ของอักขระ มันจัดการการตัดและยังใช้งานสำหรับสตริงที่ว่างเปล่า fromEnumและtoEnumเป็นทางเลือกให้กับordและchrเพื่อสลับระหว่างตัวอักษรและค่า ASCII ของพวกเขาซึ่งไม่ต้องการนำเข้าที่มีความยาว

แก้ไข: -3 ไบต์ขอบคุณ Bruce Forte


คุณสามารถบันทึก3ไบต์โดยการดึงออก-32และบันทึกวงเล็บเหล่านั้นให้ดูที่นี่
ბიმო

5

C ++, 331 291 282 270 268 ไบต์, รุ่น 2 = 178 176 150 148 ไบต์

รุ่นเดิม :

#include<string>
#include<algorithm>
#define L length()
#define S std::string
S m(S a,S b){S c;int m=a.L<b.L?a.L:b.L;auto l=[m](S&s){s=s.substr(0,m);std::for_each(s.begin(),s.end(),[](char&c){c-=32;});};l(a);l(b);for(int i=0;i<m;++i){c+=a[i]*b[i]%95+32;}return c;}

-40 ไบต์ขอบคุณ Bruce Forte
-39 ไบต์ขอบคุณZacharý

รุ่น 2 แรงบันดาลใจจากคำตอบของคนอื่น

#include<string>
#define L length()
using S=std::string;S m(S a,S b){S c;for(int i=0;i<(a.L<b.L?a.L:b.L);++i)c+=(a[i]-32)*(b[i]-32)%95+32;return c;}

หากรุ่นแรกใช้แลมบ์ดานั่นเป็นเพราะฉันต้องการทดสอบ C ++ 11 std :: ฟังก์ชั่น async ที่ฉันเพิ่งเรียนรู้มาก่อนดังนั้นฉันจึงเก็บมันไว้โดยไม่มีเหตุผล ...

รุ่นที่อ่านเพิ่มเติมได้:

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

#define L length()
#define S string

//Function code for the original version
S m(S a,S b) {
    S c;
    int m = a.L < b.L ? a.L : b.L;

    auto l=[m](S&s){
        s = s.substr(0, m);
        for_each(s.begin(),s.end(),[](char&c){
            c -= 32;
        });
    };
    l(a);
    l(b);
    for(int i=0;i<m;++i) {
        c += a[i] * b[i] % 95 + 32;
    }
    return c;
}

//Code for the version 2
S m2(S a,S b) {
    S c;
    for(int i = 0; i < (a.L < b.L ? a.L : b.L); ++i) {
        c += (a[i] - 32) * (b[i] - 32) % 95 + 32;
    }
    return c;
}

int main() {
    string a, b, c;
    getline(cin, a);
    getline(cin, b);
    c = m(a, b);
    cout << c;
}

1
ยินดีต้อนรับสู่ PPCG!
Martin Ender

ยินดีต้อนรับสู่เว็บไซต์! ขอบคุณสำหรับคำตอบของคุณฉันขอขอบคุณ ฉันไม่มีประสบการณ์ในการเล่นกอล์ฟด้วย C ++ แต่ที่นี่คุณจะพบเคล็ดลับ สนุกกับเวลาของคุณที่นี่!
ბიმო

ฉันค่อนข้างมั่นใจว่าคุณสามารถส่งฟังก์ชั่นแบบนี้ได้
ბიმო

คุณไม่สามารถลบช่องว่างที่นี่: #include <string>=> #include<string>และ#include <algorithm>=> #include<algorithm>?
Zacharý

นอกจากนี้คุณควรจะสามารถสร้างแมโครที่เทียบเท่าstringและใช้งานได้ตามนั้น
Zacharý

3

Dyalog APL, 36 34 33 25 24 ไบต์

{⎕UCS 32+95|×⌿32-⎕UCS↑⍵}

ลองใช้ออนไลน์ (TryAPL)!

ลองออนไลน์ (TIO)!

อินพุตเป็นรายการของสตริงและมีช่องว่างต่อท้าย

นี่คือวิธีการทำงาน:

{⎕UCS 32+95|×⌿32-⎕UCS↑⍵}
                     ↑⍵ - the input as a 2d array
                 ⎕UCS   - codepoints
              32-       - subtract 32
            ×⌿          - element wise product reduction ([a,b]=>a×b)
         95|            - Modulo 95
      32+               - Add 32
 ⎕UCS                   - Unicode characters

ฉันไม่ได้รับอินเทอร์เฟซของtryapl.orgดังนั้นนี่คือ TIO สำหรับผู้ที่ต้องการลอง
ბიმო

ฉันใส่ทั้งคู่เข้าไปที่นั่น
Zacharý

3

FSharp 275 ไบต์

let f (p : string, q : string) =     
let l = if p.Length < q.Length then p.Length else q.Length
p.Substring(0,l).ToCharArray() |> Array.mapi (fun i x -> (((int(x) - 32) * (int(q.[i]) - 32)) % 95) + 32) |> Array.map (fun x -> char(x).ToString()) |> Array.fold(+) ""

ยินดีต้อนรับสู่ PPCG!
Martin Ender






2

C # (.NET Core) , 100 96 95 ไบต์

(l,n)=>{for(int i=0;i<l.Length&i<n.Length;)Console.Write((char)((l[i]-32)*(n[i++]-32)%95+32));}

ลองออนไลน์!

-4 bytes ต้องขอบคุณ @ Zacharý

-1 ไบต์โดยเลื่อนส่วนเพิ่ม

ใช้แลมบ์ดาและใช้ความจริงที่ว่าตัวละครนั้นมีความเป็นสากล


คุณสามารถใช้(l[i]-32)*(n[i]-32)%95+32?
Zacharý

ทำไมใช่ฉันทำได้ ขอบคุณ!
jkelm

1
คุณต้องมีคุณสมบัติครบถ้วนConsoleและคุณสามารถใช้การแกงเพื่อบันทึกไบต์ คอมไพล์ไปยังสิ่งที่Action<string, Action<string>>ชอบl=>n=>และชอบ("word")("string")
TheLethalCoder

2

Mathematica, 114 ไบต์

(a=Min@StringLength[x={##}];FromCharacterCode[Mod[Times@@(#-32&/@ToCharacterCode/@(StringTake[#,a]&/@x)),95]+32])&


อินพุต

[ "สาธารณะ", "โทร"]


มีวิธีลองออนไลน์หรือไม่
ბიმო

แน่นอนไปที่sandbox.open.wolframcloud.com/app/objectsวางรหัสวางข้อมูลที่ส่วนท้ายกด Shift + Enter
J42161217

สิ่งที่ "8 ตัวอักษร"?
J42161217

ขอโทษสำหรับความสับสน! ข้อความ "ขอบคุณ!" จะสั้นเกินไปที่จะโพสต์เช่นนี้มันต้อง 8 ตัวอักษรเพิ่มเติม
ბიმო

3
ตกลง ....................................
J42161217

2

ซ้อนกัน 52 ไบต์

[,:$#'"!MIN$take"![CS#.toarr]"!32-prod 95%32+#:''#`]

ลองออนไลน์!

ฟังก์ชันที่รับสองอาร์กิวเมนต์จากสแต็ก

คำอธิบาย

[,:$#'"!MIN$take"![CS#.toarr]"!32-prod 95%32+#:''#`]

ลองดูส่วนแรกโดยสมมติว่าสองรายการแรกสุด'split'และ'isbn':

,:$#'"!MIN$take"!      stack:                      ('split' 'isbn')
,                      pair top two:               (('split' 'isbn'))
 :                     duplicate:                  (('split' 'isbn') ('split' 'isbn'))
  $#'                  length function literal:    (('split' 'isbn') ('split' 'isbn') $#')
    "!                 execute on each:            (('split' 'isbn') (5 4))
      MIN              obtain the minimum:         (('split' 'isbn') 4)
         $take         "take" function literal:    (('split' 'isbn') 4 $take)
                       (e.g. `'asdf' 2 take` is `'as'`)
              "!       vectorized binary each:     (('spli' 'isbn'))

ส่วนนี้จะทำการปลูกพืช

แล้ว:

[CS#.toarr]"!     stack: (('spli' 'isbn'))
[         ]"!     perform the inside on each string
                  string `'spli'`:
 CS               convert to a character string:    $'spli'
   #.             vectorized "ord":                 (115 112 108 105)
     toarr        convert to array:                 (115 112 108 105)
                  (needed for empty string, since `$'' #.` == `$''` not `()`

จากนั้นส่วนสุดท้าย:

32-prod 95%32+#:''#`  stack: (((115 112 108 105) (105 115  98 110)))
32-                   subtract 32 from each character code:   (((83 80 76 73) (73 83 66 78)))
   prod               reduce multiplication over the array:   ((6059 6640 5016 5694))
        95%           modulus 95:                             ((74 85 76 89))
           32+        add 32:                                 ((106 117 108 121))
              #:      convert to characters:                  (('j' 'u' 'l' 'y'))
                ''#`  join:                                   ('july')

2

R , 88 ไบต์

function(r,s,u=utf8ToInt)intToUtf8((((u(r)-32)*(u(s)-32))%%95+32)[0:min(nchar(c(r,s)))])

ฟังก์ชั่นที่ไม่ระบุชื่อ; รับอินพุตเป็นสองสตริง อาร์กิวเมนต์ที่สามเป็นเพียงเพื่อให้แน่ใจว่านี่เป็นฟังก์ชันหนึ่งบรรทัดและบันทึกบางไบต์

ลิงค์ TIO ด้านล่างจะส่งคืนอาร์เรย์ที่มีรายการตั้งชื่อด้วยอินพุตแรก

ลองกรณีทดสอบทั้งหมด!




2

05AB1E , 16 15 ไบต์

.BÇ32-`*₃%32+çJ

ลองออนไลน์!

-1 Emigna ชี้ดัน95


                 # ['hi', 'you']
.B               # [['hi ', 'you']]
  Ç              # [[[104, 105, 32], [121, 111, 117]]]
   32-           # [[[72, 73, 0], [89, 79, 85]]]
      `          # [[72, 73, 0], [89, 79, 85]]
       *         # [[6408, 5767, 0]]
        ₃%       # [[43, 67, 0]]
          32+    # [[75, 99, 32]]
             ç   # [['K', 'c', ' ']]
              J  # ['Kc ']

.BÇ32-`*95%žQsèJ

เป็นอีก


บันทึกเป็นไบต์ แย่มากเกี่ยวกับอินพุตสตริงที่ว่างเปล่า มิฉะนั้นøจะประหยัดอีกไม่กี่
Emigna

2

Java 8, 127 115 97 95 ไบต์

a->b->{for(int i=0;i<a.length&i<b.length;System.out.printf("%c",(a[i]-32)*(b[i++]-32)%95+32));}

คำอธิบาย:

ลองที่นี่

a->b->{                       // Method with 2 char-array parameters and no return-type
  for(int i=0;                //  Index-integer, starting at 0
      i<a.length&i<b.length;  //  Loop over both arrays up to the smallest of the two
    System.out.printf("%c",   //   Print, as character:
      (a[i]-32)               //    Current char of `a` minus 32
      *(b[i++]-32)            //    multiplied with current char of `b` minus 32
      %95                     //    Take modulo-95 of that multiplied result
      +32));}                 //    And add 32 again

1

C #, 166 ไบต์

using System.Linq;s=>t=>{int e=s.Length,n=t.Length,l=e>n?n:e;return string.Concat(s.Substring(0,l).Select((c,i)=>(char)((((c-32)*(t.Substring(0,l)[i]-32))%95)+32)));}

ฉันแน่ใจว่าจะมีการเล่นกอล์ฟมากมาย แต่ตอนนี้ฉันไม่มีเวลา

ลองออนไลน์!

เวอร์ชั่นเต็ม / ฟอร์แมต:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<string, Func<string, string>> f = s => t =>
        {
            int e = s.Length, n = t.Length, l = e > n ? n : e;

            return string.Concat(s.Substring(0, l).Select((c, i) => (char)((((c - 32) * (t.Substring(0, l)[i] - 32)) % 95) + 32)));
        };

        Console.WriteLine(string.Concat(f("split")("isbn")));

        Console.ReadLine();
    }
}

ฉันคิดว่า(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)สามารถ((c-32)*(t.Substring(0,l)[i]-32)%95+32)(อาจเมาขึ้น parens ที่นั่น ... มันดูเหมือน lisp!)
Zacharý


1

Japt , 24 ไบต์

¬íVq)®®©c -HÃ×u95 +H dÃq

ส่งคืนสตริงที่มีการเติม null-chars ( \u0000) เมื่ออินพุตแรกยาวกว่าวินาที

ลองออนไลน์! ด้วย-Qแฟล็กเพื่อแสดงเอาต์พุตที่จัดรูปแบบรวมถึง null-chars

เรียกใช้กรณีทดสอบทั้งหมดโดยใช้ WIP CodePen ของฉัน


1

Python 2 , 95 73 ไบต์

  • ขอบคุณ @ Zacharýสำหรับ 4 ไบต์: ลบวงเล็บเหลี่ยมที่ไม่ต้องการออก
lambda x,y:''.join(chr((ord(i)-32)*(ord(j)-32)%95+32)for i,j in zip(x,y))

ลองออนไลน์!


3
คุณงามความดี ... เรียนรู้การใช้คำสั่งของการปฏิบัติการ! (((ord(x[i])-32)*(ord(y[i])-32))%95)+32=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Zacharý

1

ถ่าน 30 ไบต์

F⌊⟦LθLη⟧℅⁺³²﹪×⁻³²℅§θι⁻³²℅§ηι⁹⁵

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ฉันเขียนการคำนวณจริง(32 - ord(q)) * (32 - ord(h))เพราะมันหลีกเลี่ยงตัวอักษรตัวเลขที่ต่อเนื่องกัน แต่ฉันเดาว่าฉันน่าจะเขียน(ord(q) - ord(" ")) * (ord(h) - ord(" "))แทนได้


1

Perl 5 , 95 ไบต์

@a=<>=~/(.)/g;@b=<>=~/(.)/g;$#a=$#b if@a>@b;print chr 32+(-32+ord$_)*(-32+ord$b[$i++])%95 for@a

ลองออนไลน์!

คำอธิบาย:

@a=<>=~/(.)/g;@b=<>=~/(.)/g;  # Split the strings into 2 arrays
$#a=$#b if@a>@b;              # Truncate the first if longer than the second
print chr 32+(-32+ord$_)*(-32+ord$b[$i++])%95 for@a  # Multiply each character

1
ฉันคิดว่าคุณตัดทอนผลลัพธ์ไม่ถูกต้องตามความยาวของสตริงที่เล็กกว่า (ดูที่นี่ )
Dada

คุณถูก. แก้ไขที่ค่าใช้จ่ายจำนวนมากไบต์
Xcali

1

Pip , 19 ไบต์

(PA$* *(PA@?Zg)%95)

รับสตริงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

คำอธิบาย

(PA$* *(PA@?Zg)%95)
                     g is list of args; PA is string of all printable ASCII characters
            Zg       Zip items of g together: result is list of pairs of characters
        PA@?         Find index of each character in PA
       (      )      (Parentheses to get correct operator precedence)
   $* *              Map (fold on *) to the list: multiplies each pair of numbers
               %95   Take list items mod 95
(PA               )  Use those numbers to index into PA again
                     Print the resulting list of chars, concatenated together (implicit)

1

ปัจจัย , 45

[ [ [ 32 - ] bi@ * 95 mod 32 + ] "" 2map-as ]

มันเป็นใบเสนอราคา (แลมบ์ดา) callมันมีสองสายบนสแต็กปล่อยสตริงใหม่ไว้บนสแต็ก

เป็นคำ:

: s* ( s1 s2 -- ps ) [ [ 32 - ] bi@ * 95 mod 32 + ] "" 2map-as ;

"M>>M" "M>>M" s*      ! => ">MM>"
dup s*                ! => "M>>M"
dup s*                ! => ">MM>"
...

1

K (oK) , 26 ไบต์

วิธีการแก้:

`c$32+95!*/-32+(&/#:'x)$x:

ลองออนไลน์!

ตัวอย่าง:

`c$32+95!*/-32+(&/#:'x)$x:("split";"isbn")
"july"

คำอธิบาย:

ทำการประเมินจากขวาไปซ้าย:

`c$32+95!*/-32+(&/#:'x)$x: / the solution
                        x: / assign input to variable x
                       $   / pad right to length on left
               (  #:'x)    / count each x (return length of each char list in list)
                &/         / min-over, get the minimum of these counts
           -32+            / subtract 32, this automagically converts chars -> ints
         */                / multiply-over, product of the two lists
      95!                  / modulo 95
   32+                     / add 32 back again
`c$                        / convert to character array

0

PHP, 112 ไบต์

for($i=0;$i<min(strlen($a=$argv[1]),strlen($b=$argv[2]));$i++)echo chr((ord($a[$i])-32)*(ord($b[$i])-32)%95+32);

109 ไบต์: for($i=0;$i<strlen($a=$argv[1])&&$i<strlen($b=$argv[2]);)echo chr((ord($a[$i])-32)*(ord($b[$i++])-32)%95+32);นอกจากนี้ผมไม่แน่ใจว่าทั้งหมดถ้าแทนที่&&ด้วย&ยังอาจจะเป็นไปได้ใน PHP ลดได้โดยไบต์อีกครั้งเพื่อให้108
Kevin Cruijssen

0

JavaScript (ES6), 89 ไบต์

Javascript และคำสาปของชื่อฟังก์ชันที่มีความยาว ...

การใช้การแกงและข้อเท็จจริงที่charCodeAtส่งคืนNaNเมื่อถูกเรียกด้วยตำแหน่งที่ไม่ถูกต้อง อาจมีการต่อท้าย nulls ในการส่งออก

a=>b=>a.replace(/./g,(c,i)=>String.fromCharCode((z=x=>x.charCodeAt(i)-32)(a)*z(b)%95+32))

ทดสอบ

var f=
a=>b=>a.replace(/./g,(c,i)=>String.fromCharCode((z=x=>x.charCodeAt(i)-32)(a)*z(b)%95+32))

q=x=>'['+x+']'

;[["isbn", "split"],["", ""],["", "I don't matter"],["             ", "Me neither :("],
["but I do!", "!!!!!!!!!"],['quotes', '""""""'],["wood", "hungry"],["tray", "gzip"],
["industry", "bond"],["public", "toll"],["roll", "dublin"],["GX!", "GX!"],
["4 lll 4", "4 lll 4"],["M>>M", "M>>M"]]
.forEach(([a,b])=>console.log(q(a)+' x '+q(b)+' --> '+q(f(a)(b))))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.