요소 별 문자열 곱셈


28

도전에 영감을 받아 (제목에 @cairdcoinheringaahing!), 두 가지 인쇄 가능한 ASCII 문자열을 가져 와서 다음 규칙에 따라 요소별로 곱하는 것입니다.

어떻게 작동합니까?

두 개의 문자열 (예 : splitisbn)이 주어지면 먼저 길이가 같은 긴 문자열을 자른 다음 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"

규칙

  • 설명 된 단계를 두 문자열로 구현하고 결과 문자열을 인쇄하거나 반환하는 프로그램 / 함수를 작성합니다.
  • 입력 형식은 유연합니다. 두 개의 문자열, 튜플 문자열, 문자열 목록 등을 취할 수 있습니다.
  • 입력은 하나 또는 두 개의 빈 문자열로 구성 될 수 있습니다.
  • 입력 가능한 범위의 문자가 입력됩니다 ([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 번째 테스트 사례에서 사용 했습니다 ".


출력에 후행 공백이 허용됩니까?
Outgolfer Erik

@EriktheOutgolfer 예. 죄송합니다. 게시 후 추가했습니다.
ბიმო

문자열 배열 배열을 취할 수 있습니까? abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
완전히 인간적인

@totallyhuman 나는 그렇게 말하지 않을 것입니다. 비록 당신의 언어에서 문자열이 문자 배열이고 문자가 문자열과 동일한 유형을 가지고 있다면, 그것은 유효한 것 같습니다.
ბიმო

문자열 목록으로 입력 할 수 있습니까?
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€‘ịØṖ

온라인으로 사용해보십시오!

Jonathan Allan 에게 -3 감사합니다 .


후행 공백의 부적절한 남용. ;)
Dennis

@Dennis 글쎄, 그것은 규칙에, 왜 그것을 남용하지?
Outgolfer Erik

난 당신이 인쇄 가능한 문자에 대한 무항 원자를 사용하여 3 바이트를 저장할 수 있습니다 생각 ØṖ으로 z⁶O_32P€‘ịØṖ- 가장 한 번 확인을하려는 연산 작동하지만 그.
Jonathan Allan

@JonathanAllan 물론입니다.
Outgolfer Erik


5

파이썬 2 , 75 70 바이트

shooqie의 제안에 대한 Dennis의 제안 덕분에 -3 바이트. Zacharý의 제안 덕분에 -2 바이트.

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 데니스를 때리는. +1
Zacharý

1
Eh, 실제로는 아니지만을 사용하는 대신 목록 이해로 변경했습니다 map. 나는 약간 늦었다.
완전히 인간적인

5

하스켈 , 60 57 바이트

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

온라인으로 사용해보십시오!

첫 번째 줄은 두 가지 인수를 취하는 익명 함수입니다.

이것은 알고리즘의 간단한 구현입니다. zipWith두 문자열을 모두 가져와 주어진 함수를 문자 쌍에 적용합니다. 잘림을 처리하고 빈 문자열에서도 작동합니다. fromEnumtoEnum에 대한 대안 ordchr긴 가져 오기를하지 않아도 캐릭터와 자신의 ASCII 값 사이의 스위치는.

편집 : Bruce Forte 덕분에 -3 바이트.


괄호 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;}

Bruce Forte 덕분에 -40 바이트
Zacharý 덕분에 -39 바이트

다른 사람들의 답변에서 영감을 얻은 버전 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에 오신 것을 환영합니다!
마틴 엔더

사이트에 오신 것을 환영합니다! 답변 주셔서 감사합니다. 감사합니다. 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ý



2

C # (. NET 코어) , 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));}

온라인으로 사용해보십시오!

@ Zacharý 덕분에 -4 바이트

증분을 이동하여 -1 바이트

람다를 사용하고 문자가 기본적으로 정수라는 사실을 남용합니다.


사용할 수 있습니까 (l[i]-32)*(n[i]-32)%95+32?
Zacharý

왜 그렇습니까? 감사!
jkelm

1
정규화해야 Console하며 바이트를 저장하기 위해 카레를 사용할 수 있습니다. Action<string, Action<string>>같은 것으로 컴파일 l=>n=>하고 호출("word")("string")
TheLethalCoder

2

수학, 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
ok ....................................
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

온라인으로 사용해보십시오!

Emigna가 지적한 경우 -1이 푸시 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

자바 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)... 거기에
파 렌스를



1

파이썬 2 , 95 73 바이트

  • 4 바이트에 대한 @ Zacharý에게 감사드립니다 : 불필요한 괄호가 제거되었습니다.
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

펄 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

, 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 ]

따옴표 (lambda)이며 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

자바 스크립트 (ES6), 89 바이트

자바 스크립트와 긴 함수 이름의 저주 ...

카레와 잘못된 위치에서 호출 할 때 charCodeAt반환 되는 사실을 사용 합니다 NaN. 출력에 후미 널이있을 수 있습니다.

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.