Конвертировать числа в Emoji Math [закрыто]


13

В Emoji Math, созданном пользователем модуле для видеоигры Keep Talking And Nobody Exploses, числа записываются в виде строк смайликов, где каждый смайлик представляет собой основную 10 цифру. Ниже приведена таблица перевода цифр и смайликов.

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

Учитывая число, выведите его в кодировке Emoji Math. Вы можете предположить отсутствие нечисловых символов.

Это , поэтому выигрывает самый короткий ответ в байтах.


4
Разрешено ли нам принимать входной номер в виде строки?
— Тау

3
... или массив цифр.
— Лохматый

1
@Tau звучит так, как будто намеревался принять строку - «Вы можете предположить отсутствие нечисловых символов.»; мы должны спросить "Можем ли мы принять входные данные как целое число?"
— Джонатан Аллан

1
Я проголосовал за закрытие как неясное, пока не будут рассмотрены пункты выше. Но не стесняйтесь пинговать меня, как только он будет исправлен, чтобы я мог отозвать свой голос или проголосовать, чтобы открыть заново.
— Арно

1
@ Тау я спрашивал из-за этого . ОП должен ответить.
— mbomb007

Ответы:


5

Japt , 29 24 байта

-5 байт благодаря @Shaggy

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

Принимает ввод в виде строки

Попробуйте онлайн!


Добро пожаловать в Japt :) m@можно заменить, £чтобы сохранить байт. Но это можно сделать за 24 байта, используя базовое преобразование.
— Лохматый

К сожалению, на самом деле это не ваше первое решение 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

Java 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 байт

До 66 благодаря предложениям от @Charlie Harding и @asgallant

Пришлось наконец-то создать аккаунт на Codegolf, так как это было очень забавно!

Наиболее минимальная форма исходного ответа, когда ожидается ввод только строки:

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

Во-вторых, мой оригинальный ответ, который использует более длинное регулярное выражение и сначала приводит ввод в строку. Это работает как с вводом числового типа, так и с вводом строки цифр.

Сначала я ввожу входные данные в строку, которая затем деструктурируется в массив с использованием es6 spread. Затем я сопоставляю его с помощью сопоставляющего 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
Почему =>на карте есть пробелы вокруг стрелки? Это может сэкономить два байта, не так ли?
— Чарли Хардинг

1
И я верю, что регулярное выражение /../gтоже делает то же самое, сохраняя еще четыре байта
— Чарли Хардинг

Наконец, если входными [...(""+n)][...n]
— Чарли Хардинг

1
mapи поиск регулярных выражений на самом деле стоит вам символов здесь; replaceи substrработать так же хорошо, с меньшим количеством символов: 58 байт: n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))при условии ввода в виде строки цифр.
— asgallant

чувак, это replaceотличный способ использовать @asgallant! Кажется, мне тоже нужно познакомиться со своими струнными функциями :)
— Roope

3

Haskell, 64 56 Laikoni байтов

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

Попробуйте онлайн

Ungolfed

Примените функцию wordsк нашей строке символов, разделенных пробелами, ":) =( (: )= :( ): =) (= :| |: "чтобы получить список, и получите n- й элемент (!!)для каждого n в нашей входной строке, объединяя результаты. nb (=<<) эквивалентно concatMapв этом случае отображению строки в список строк и объединению результатов. read . pureпреобразует символ в int, поднимая символ в строку, а затем readв int.

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 байт. Попробуйте онлайн!
— Аарон Хейман


2

PowerShell , 64 60 59 байт

-1 байт благодаря маззи

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

Попробуйте онлайн!

Берет строку, разбивает ее toCharArray, а затем индексирует в ключ смайликов, приводя символ к его числовому значению, удваивает его, потому что каждый смайлик имеет ширину два, а затем берет substringс этого места плюс один выше. Наконец, он объединяет все это в одну строку и подталкивает к выводу.



@mazzy Да, я разобрался с тем, как приводить к int без получения значения ASCII, спасибо.
— Веска


2

C # (интерактивный компилятор Visual C #) , 87 , 86 , 82 , 67 байт

Поддерживает @Artholl и @someone за помощь в оптимизации

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

Попробуйте онлайн!


1
Вы можете сохранить 2 байта . 1 байт, если вы используете Substringвместо Skip&, Takeи 1 байт, если вы жестко задаете нулевое значение символа.
— Артолл

@ Артхолл спасибо! Не могли бы вы показать мне, что вы подразумеваете под жестким кодированием нулевого значения символа?
— Innat3

Как вы можете видеть на примере. Просто пиши 48вместо '0'.
— Артолл

Несколько простых оптимизаций; 67 байт. Попробуйте онлайн!
— мое местоимение monicareinstate

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}

Это выводит ):вместо (:for3
— Herman L

@ Герман Л Да, спасибо!
— Наруёко


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.