แปลงตัวเลขเป็น 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
... หรืออาร์เรย์ของตัวเลข
Shaggy

1
@Tau ดูเหมือนความตั้งใจที่จะยอมรับสตริง - "คุณอาจถือว่าไม่มีอักขระที่ไม่ใช่ตัวเลข"; เราควรถามว่า "เราจะนำเข้าเป็นจำนวนเต็มหรือไม่"
Jonathan Allan

1
ฉันลงคะแนนให้ปิดไม่ชัดเจนจนกว่าจะมีการระบุประเด็นข้างต้น แต่อย่าลังเลที่จะ ping ฉันเมื่อมันได้รับการแก้ไขเพื่อที่ฉันจะได้ถอนการโหวตหรือโหวตให้เปิดใหม่
Arnauld

1
@Tau ฉันถูกถามเพราะนี้ OP ต้องการคำตอบ
mbomb007

คำตอบ:


5

Japt , 29 24 ไบต์

-5 ไบต์ขอบคุณ @Shaggy

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

รับอินพุตเป็นสตริง

ลองออนไลน์!


ยินดีต้อนรับสู่ Japt :) m@สามารถถูกแทนที่ด้วย£เพื่อบันทึกไบต์ แต่สามารถทำได้ใน24 ไบต์โดยใช้การแปลงฐาน
Shaggy

อุ๊ปส์ดูเหมือนว่านี่ไม่ใช่โซลูชัน Japt แรกของคุณ! คุณยังคงมีสิทธิ์ได้รับรางวัลนี้แต่ถ้าคุณต้องการลอง
Shaggy


5

05AB1E , 26 ไบต์

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

ลองออนไลน์!


สิ่งนี้ไม่ทำงานสำหรับตัวเลขที่มีหลายหลัก
izlin

1
@izlin: แน่นอน ฉันไม่ได้ตระหนักว่าเป็นส่วนหนึ่งของความท้าทาย แก้ไขในขณะนี้แม้ว่า ขอบคุณ :)
Emigna


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

ตัวอย่าง:

"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("")

ประการที่สองคำตอบเดิมของฉันซึ่งใช้ regex ที่ยาวขึ้นและบีบอัดอินพุตแรกลงในสตริงซึ่งใช้ได้กับทั้งอินพุตประเภทตัวเลขและสตริงของตัวเลขอินพุต

ฉันแรกบังคับอินพุตเป็นสตริงซึ่งจะถูกทำลายลงในอาร์เรย์โดยใช้การแพร่กระจาย es6 แล้วฉัน map มันผ่าน CB จับคู่ที่คว้าอิโมติคอนที่ถูกต้องจากอาร์เรย์ที่ทำด้วย /.{1,2}/gregex ในที่สุดอาร์เรย์ผลลัพธ์ของอิโมติคอนจะถูกรวมเข้ากับสตริง

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
เหตุใดจึงมีช่องว่างรอบ ๆ=>ลูกศรในแผนที่ ที่สามารถบันทึกสองไบต์ใช่ไหม
Charlie Harding

1
และฉันเชื่อว่า regex /../gทำงานเหมือนกันประหยัดอีกสี่ไบต์
Charlie Harding

ในที่สุดหากการป้อนข้อมูลจำเป็นต้องมีสตริงก็[...(""+n)]สามารถทำให้ง่ายขึ้นเพื่อ[...n]ประหยัดอีกห้าไบต์
Charlie Harding

1
mapและการค้นหา regex มีการคิดต้นทุนตัวอักษรของคุณที่นี่ 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องค์ประกอบ TH (!!)ทุก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โดยมีการจัดเรียงใหม่เล็กน้อย ลองออนไลน์!
Aaron Hayman


2

PowerShell , 64 60 59 ไบต์

-1 byte ขอบคุณ mazzy

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

ลองออนไลน์!

ใช้สตริงแยกออกtoCharArrayแล้วทำดัชนีลงในคีย์อีโมจิโดยการหล่ออักขระเป็นค่าตัวเลขเพิ่มเป็นสองเท่าเพราะอีโมจิแต่ละตัวมีความกว้างสองตัวจากนั้นนำsubstringจากจุดนั้นบวกหนึ่งที่สูงกว่า ในที่สุดมันจะรวมสิ่งนี้ทั้งหมดเข้าไปในสายเดียวและผลักมันออกไป



@ mazzy ใช่ฉันเว้นระยะในการส่งไปยัง int โดยไม่ได้รับค่า ASCII ขอบคุณ
Veskah


2

C # (Visual C # Interactive Compiler) , 87 , 86 , 82 , 67 ไบต์

อุปกรณ์ประกอบฉากเพื่อ @Aththoll และ @someone เพื่อช่วยในการเพิ่มประสิทธิภาพ

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

ลองออนไลน์!


1
คุณสามารถบันทึก 2 ไบต์ 1 ไบต์ถ้าคุณใช้SubstringแทนSkip& Takeและ 1 ไบต์ถ้าคุณ hardcode ค่าถ่านเป็นศูนย์
Artholl

@ ขอบคุณมาก! คุณช่วยแสดงให้ฉันดูว่าคุณหมายถึงอะไรโดยการเข้ารหัสค่าถ่านไร้ค่าให้เป็นศูนย์?
Innat3

อย่างที่คุณเห็นในตัวอย่าง เพียงแค่เขียนแทน48 '0'
Artholl

การปรับให้เหมาะสมง่าย ๆ หลายอย่าง; 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}

ผลลัพธ์นี้):แทนที่จะ(:เป็น3
Herman L

@ เฮอร์แมน L ใช่ขอบคุณ!
Naruyoko


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.