숫자를 그림 이모티콘으로 변환 [닫기]


13

비디오 게임 Keep Talking And Nobody Explodes에 대한 사용자 제작 모듈 인 Emoji Math에서 숫자는 이모티콘 문자열로 작성되며 각 이모티콘은 기본 10 자리를 나타냅니다. 아래는 숫자와 이모티콘 사이의 변환 표입니다.

Digit | Emoticon
  0   |    :) 
  1   |    =(  
  2   |    (: 
  3   |    )=  
  4   |    :(    
  5   |    ):  
  6   |    =)  
  7   |    (= 
  8   |    :|  
  9   |    |: 

숫자가 주어지면 Emoji Math 인코딩으로 출력하십시오. 숫자가 아닌 문자가 없다고 가정 할 수 있습니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


4
입력 번호를 문자열로 사용할 수 있습니까?
Tau

3
... 또는 숫자 배열.
얽히고 설킨

1
@Tau는 "-숫자가 아닌 문자가 없다고 가정 할 수 있습니다."; "입력을 정수로 취해도 될까요?"
Jonathan Allan

1
위의 요점이 해결 될 때까지 불분명하다고 결론을 내 렸습니다. 그러나 일단 수정되면 주저하지 말고 투표를 취소하거나 다시 열 수 있도록 투표하십시오.
Arnauld

1
@Tau 나는 이것 때문에 묻고 있었다 . OP가 답변해야합니다.
mbomb007 19

답변:


5

Japt , 29 24 바이트

@Shaggy 덕분에 -5 바이트

s":)=((:)=:():=)(=:||:"ò

입력을 문자열로받습니다

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


JAPT에 오신 것을 환영합니다 :) m@로 대체 할 수 £바이트를 저장합니다. 그러나 이것은 기본 변환을 사용하여 24 바이트 로 수행 할 수 있습니다 .
Shaggy

죄송합니다. 이것이 실제로 첫 번째 Japt 솔루션이 아닌 것 같습니다! 그래도 시도하고 싶다면 이 현상금을 받을 자격 있습니다.
얽히고 설킨




4

TI-BASIC, 79 바이트

Ans→Str1:" :For(I,1,length(Str1:Ans+sub(":)=((:)=:():=)(=:||:",1+2expr(sub(Str1,I,1)),2:End:sub(Ans,2,length(Ans)-1

입력은의 숫자 문자열입니다 Ans.
출력은 Emoji Math 인코딩 숫자입니다.

예 :

"134
134
prgmCDGF1C
:)(:)=
"2213894
2213894
prgmCDGF1C
(:(:=()=:||::(

설명:

Ans→Str1                                                 ;store the input in Ans
"                                                        ;leave " " in Ans
For(I,1,length(Str1                                      ;loop over each character in the
                                                         ; input string
Ans+sub(":)=((:)=:():=)(=:||:",1+2expr(sub(Str1,I,1)),2  ;convert the current character
                                                         ; to a number and use it as the
                                                         ; index into the encoding string
                                                         ; then append the encoded digit
End
sub(Ans,2,length(Ans)-1                                  ;remove the prepended space and
                                                         ; store the result in Ans
                                                         ;implicit print of Ans

또는 문자열 대신 숫자를 입력으로 사용 하는 94 바이트 솔루션이 있습니다.

int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans→L₁:" :For(I,dim(L₁),1,-1:Ans+sub(":)=((:)=:():=)(=:||:",1+2L₁(I),2:End:sub(Ans,2,length(Ans)-1

예 :

134
             134
prgmCDGF1C
:)(:)=
2213894
         2213894
prgmCDGF1C
(:(:=()=:||::(

설명:

int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans→L₁     ;generate a list of the input's digits
                                             ; reversed and store it in L₁
"                                            ;leave " " in Ans
For(I,dim(L₁),1,-1                            ;loop over L₁ backwards
Ans+sub(":)=((:)=:():=)(=:||:",1+2L₁(I),2     ;use the value of the I-th element in L₁ as
                                              ; the index into the encoding string then
                                              ; append the encoded digit
End
sub(Ans,2,length(Ans)-1                       ;remove the prepended space and store the
                                              ; result in Ans
                                              ;implicit print of Ans

노트:



3

자바 8, 80 바이트

n->n.forEach(i->System.out.print(":)=((:)=:():=)(=:||:".split("(?<=\\G..)")[i]))

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

설명:

n->                           // Method with IntStream parameter and no return-type
  n.forEach(i->               //  For each digit `i` in the input:
    System.out.print(         //   Print without newline:
      ":)=((:)=:():=)(=:||:"  //    Push this String
        .split("(?<=\\G..)")  //    Split into parts of size 2
          [i]))               //    And print the `i`'th part

3

JS ES6, 77 66 바이트

@Charlie Harding과 @asgallant의 제안으로 66까지 감소

이것이 재미있는 작은 도전 이었으므로 마침내 codegolf에 대한 계정을 만들어야했습니다!

문자열 전용 입력을 기대할 때 가장 간단한 형태의 원래 답변 :

n=>[...n].map(c=>":)=((:)=:():=)(=:||:".match(/../g)[c]).join("")

둘째, 더 긴 정규 표현식을 사용하고 입력을 문자열로 강제 변환하는 원래의 대답은 숫자 유형 입력과 숫자 입력 문자열 모두에서 작동합니다.

먼저 입력을 문자열로 강제 변환 한 다음 es6 spread를 사용하여 배열로 구조화합니다. 그런 다음 정규 표현식으로 만든 배열에서 올바른 이모티콘을 가져 오는 matcher cb를 통해 매핑합니다 /.{1,2}/g. 마지막으로 결과 이모티콘 배열이 문자열로 다시 결합됩니다.

n=>[...(""+n)].map(c=>":)=((:)=:():=)(=:||:".match(/.{1,2}/g)[c]).join("")

JS 배열은 재미있다. 나는 여전히 최적화의 여지가 있다고 확신한다. 이것은의 모든 루프에서 정규식을 다시 일치시킨다 map.

다음과 같이 테스트했습니다.

let emoticonize = n=>[...(""+n)].map(c=>":)=((:)=:():=)(=:||:".match(/../g)[c]).join("")

let test = arr => 
console.log(arr.map(x => ({ask:x, ans: emoticonize(x)})))

test([1,40,3697, 2330])
test(["1","40","3697", "2330"])


1
=>지도 에서 화살표 주위에 공백이있는 이유는 무엇 입니까? 그것은 2 바이트를 절약 할 수 없었습니까?
찰리 하딩

1
그리고 정규식이 믿는 /../g또 다른 4 바이트를 절약도 같은 일을
찰리 하딩에게

마지막으로, 반드시 문자열은 입력이되는 경우 [...(""+n)]에 간단하게 할 수 [...n]더 오 바이트를 저장
찰리 하딩

1
map그리고 정규식 검색은 실제로 당신에게 문자를 요합니다; replace그리고 substr적은 문자 단지뿐만 아니라 작품 : 58 바이트 : n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2)), 숫자의 문자열로 입력을 가정.
asgallant

남자, 그것은 replace@asgallant 를 사용하는 깔끔한 방법입니다 ! 문자열 함수도 알아야합니다 :)
Roope

3

하스켈, 64 56 라이 코니 바이트

((words":) =( (: )= :( ): =) (= :| |: "!!).read.pure=<<)

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

언 골프

words공백으로 구분 된 기호 문자열에 함수 를 적용하여 ":) =( (: )= :( ): =) (= :| |: "목록을 가져오고 결과를 결합하여 입력 문자열의 모든 n 에 대해 n 번째 요소 (!!)를 가져옵니다 . 이 경우 nb 는 문자열을 문자열 목록에 매핑하고 결과를 연결하는 것과 같습니다. 문자를 문자열로 들어 올린 다음 int로 씀으로써 문자를 int로 변환합니다 . (=<<)concatMapread . pureread

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x


3

[R], 59 48 바이트

다른 접근법 :

 substr(":)=((:)=:():=)(=:||:",n<-2*scan()+1,n+1)

다시 나를 안내해 준 @aaron에게 감사합니다 :)

기발한:

 el(strsplit(":)x=(x(:x)=x:(x):x=)x(=x:|x|:","x",T))[scan()]

박동

 c(":)","=(","(:",")=",":(","):","=)","(=",":|","|:")[scan()]

1 바이트


1
다른 접근 방식은 약간 떨어져 있습니다. 두 배로 스캔 한 번호에 하나를 추가해야 2*scan()+1하지만 약간의 재 배열을 통해 48 바이트로 유지할 수 있습니다. 온라인으로 사용해보십시오!
Aaron Hayman


2

PowerShell , 64 60 59 바이트

매지 덕분에 -1 바이트

-join($args|% t*y|%{':)=((:)=:():=)(=:||:'|% S*g(2*"$_")2})

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

문자열을 가져 와서 분할 toCharArray한 다음 문자를 숫자 값으로 캐스트하여 이모 지 키로 인덱싱하고 각 이모지가 두 개의 너비이므로 두 배로 늘린 다음 substring해당 지점에서 더 높은 값 을 가져옵니다 . 마지막 으로이 모든 것을 하나의 문자열로 결합하고 출력으로 푸시합니다.



@mazzy 예, ASCII 값을 얻지 않고 int로 캐스팅하는 방법에 대해 간격을 두었습니다. 감사합니다.
Veskah


2

C # (Visual C # Interactive Compiler) , 87 , 86 , 82 , 67 바이트

최적화를 돕는 @Artholl 및 @someone에 대한 소품

n=>$"{n}".SelectMany(x=>":)=((:)=:():=)(=:||:".Substring(x*2-96,2))

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


1
2 바이트를 절약 할 수 있습니다 . & Substring대신에 1 바이트를 사용 하고 0 문자 값을 하드 코딩하면 1 바이트. SkipTake
Artholl

@Artholl 감사합니다! 0의 char 값을 하드 코딩하여 무슨 의미인지 알려 주시겠습니까?
Innat3

예제에서 볼 수 있듯이 48대신에 쓰십시오 '0'.
Artholl


1
@someone은 함수 외부에서 허용되는 출력 유형 변경을 몰랐습니다
Innat3

1

JavaScript (ES6), 87 바이트

n=>{for(s=":)=((:)=:():=)(=:||:",i=0;i<20;)n=n.split(i/2).join(s[i++]+s[i++]);return n}

이 출력 ):대신 (:3
허먼 L

@Herman L 네, 감사합니다!
Naruyoko


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.