Конвертировать числа в 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! Тем не менее, вы все еще имеете право на эту награду , если хотите попробовать ее.
Лохматый
5

05AB1E , 26 байт

"|:(=):)=:)"2ôºJ2ô`Šr)sSèJ

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

Emigna
источник
Это не работает для чисел с несколькими цифрами.
Излин
1
@izlin: Действительно. Я не понял, что это было частью проблемы. Исправлено сейчас, хотя. Спасибо :)
Эминья
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
Чарли Хардинг
источник
2
56 байт: попробуйте онлайн!
Лайкони
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с этого места плюс один выше. Наконец, он объединяет все это в одну строку и подталкивает к выводу.

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

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

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

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

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

Innat3
источник
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}
Naruyoko
источник
Это выводит ):вместо (:for3
Herman L
@ Герман Л Да, спасибо!
Наруёко