Конвертировать числа в 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.