Перетворити числа в математику Emoji [закрито]


13

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

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

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

Це , тому найкоротша відповідь у байтах виграє.


4
Чи дозволяється нам приймати вхідний номер як рядок?
Тау

3
... Або масив цифр.
Кошлатий

1
@Tau звучить так, що наміром було прийняти рядок - "Ви можете припустити відсутність нечислових символів."; ми повинні запитати "Чи можемо ми сприймати введення як ціле число?"
Джонатан Аллан

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

1
@Tau я просив через це . ОП повинен відповісти.
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

Довелося нарешті зареєструватися на кодегольфі, оскільки це була така весела маленька проблема!

Найменш мінімальна форма оригінальної відповіді, коли очікується лише введення рядка:

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

По-друге, моя оригінальна відповідь, яка використовує довший регулярний вираз і спочатку примушує введення в рядок. Це працює як з введенням типу номера, так і з рядком введення цифр.

Спочатку я примушую вводити рядок, який потім деструктурується в масив, використовуючи спред es6. Потім я відображаю його через matb 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

Хаскелл, 64 56 лайконі байт

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

Спробуйте в Інтернеті

Безумовно

Застосуйте функцію wordsдо нашого розділеного пробілом рядка символів, ":) =( (: )= :( ): =) (= :| |: "щоб отримати список, і отримати n- й елемент (!!)для кожного n у нашому вхідному рядку, поєднуючи результати. nb (=<<) еквівалентно concatMapв цьому випадку, зіставленням рядка зі списком рядків та об'єднанням результатів. read . pureперетворює символ у int, піднімаючи символ до рядка, потім reading до 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 # Interactive Compiler) , 87 , 86 , 82 , 67 байт

Реквізити @Artholl та @someone за допомогу в оптимізації

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

Спробуйте в Інтернеті!


1
Ви можете зберегти 2 байти . 1 байт, якщо ви використовуєте Substringзамість Skip& Takeта 1 байт, якщо ви жорстко кодуєте нульове значення char.
Артхолл

@Artholl дякую! Не могли б ви показати мені, що ви маєте на увазі під твердим кодуванням нульового значення char?
Innat3

Як ви бачите на прикладі. Просто напишіть 48замість '0'.
Артхолл

Кілька простих оптимізацій; 67 байт. Спробуйте в Інтернеті!
мій займенник monicareinstate

1
@someone не знав, що зміна типу виводу дозволена поза функцією
Innat3



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.