หมายเลขเดิม (II)


18

ความท้าทายนี้เป็นหลักเหมือนกันกับคนนี้ที่มีเพียงหนึ่งความแตกต่าง: จะได้รับอนุญาตในขณะนี้เพื่อสับเปลี่ยนตัวอักษรใดก็ได้ในสตริง

สถานการณ์

จอห์นมีหมายเลขสำคัญและเขาไม่ต้องการให้คนอื่นเห็น

เขาตัดสินใจเข้ารหัสหมายเลขโดยใช้ขั้นตอนต่อไปนี้:

จำนวนของเขาเป็นลำดับที่ไม่ลดลงเสมอ (เช่น "1123" )

เขาแปลงแต่ละหลักให้เป็นคำภาษาอังกฤษ (เช่น"123" -> "ONETWOTHREE" )

จากนั้นจัดเรียงตัวอักษรแบบสุ่ม (เช่น"ONETWOTHREE" -> "EEWOOHRNTET" )

จอห์นรู้สึกว่าหมายเลขของเขาปลอดภัยในการทำเช่นนั้น ในความเป็นจริงการเข้ารหัสดังกล่าวสามารถถอดรหัสได้อย่างง่ายดาย :(


งาน

รับสายอักขระที่เข้ารหัส s งานของคุณคือการถอดรหัสและส่งกลับหมายเลขเดิม


กฎระเบียบ

  • นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ชนะ
  • คุณสามารถสันนิษฐานได้ว่าสตริงอินพุตนั้นใช้ได้เสมอ
  • สตริงอินพุตมีเฉพาะตัวอักษรตัวพิมพ์ใหญ่เท่านั้น
  • หมายเลขดั้งเดิมจะเรียงตามลำดับจากน้อยไปมาก
  • คุณอาจส่งคืนตัวเลขในรูปแบบสตริงหรือจำนวนเต็ม
  • ตัวอักษรจะถูกสับระหว่างคำเดียวไม่ใช่ระหว่างทั้งสตริงตัวอักษรสามารถสับได้ทุกที่ในสตริง
  • ตัวเลขจะมาจาก 1 ถึง 9 รวม ( ONEถึงNINE)

สตริง Unscrambled ที่เป็นไปได้

นี่คือรายการของสตริงหลังจากแปลงเป็นสตริงจากตัวเลข:

 1 -> ONE 
 2 -> TWO
 3 -> THREE
 4 -> FOUR
 5 -> FIVE
 6 -> SIX
 7 -> SEVEN
 8 -> EIGHT
 9 -> NINE

ตัวอย่าง

"NEO" -> 1

"NWEOOT" -> 12

"TOEERWNEHOT" -> 123

"IHNEVGENNEISTE" -> 789

"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789

"EWHEWROETOTTON" -> 1223

"ONEWESTV" -> 27 (ขอบคุณ ETHproductions!)


7
กรณีทดสอบที่แนะนำ: บางอย่างเช่น"ONEWESTV" -> 27(รวมถึงจำนวนที่ไม่ปรากฏจริง)
ETHproductions

@ETHproductions ความคิดที่ยอดเยี่ยม! ที่เพิ่ม
Cristian Lupascu

ทำไมไม่มี "ศูนย์"
RosLuP

@RosLuP จอห์นเกลียดผู้นำศูนย์ ...
Cristian Lupascu

คำตอบ:


9

Python 2 , 123 ไบต์

c=map(input().count,"OWHUFXSGIQ")
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
s=""
for n in c:i+=1;s+=`i`*n
print s

โปรแกรมเต็มรูปแบบที่รับอินพุตที่ยกมาและพิมพ์หมายเลขของจอห์น

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

มาทำงานกับตัวอย่าง "NEONSEXTOWNII" (ให้ผลตอบแทน 1269 และเป็นชุด Suite Larry -esque!)

ก่อนอื่นให้c=map(input().count,"OWHUFXSGIQ")ป้อนและนับจำนวนของแต่ละOWHUFXSGIQตัวอักษรเหล่านี้คือตัวอักษรที่ปรากฏในแต่ละหมายเลขตามลำดับจากน้อยไปมากด้วย 2,4,6 และ 8 มีตัวอักษร "ของตัวเอง" ( WUXG) รวมทั้งตัวอักษรพิเศษQเพื่อผนวกศูนย์ ไปยังจุดสิ้นสุดและทำให้ความยาวของรายการผลลัพธ์เท่ากัน ตัวอย่างเช่น

[2,1,0,0,0,1,1,0,2,0] <- c
 O W H U F X S G I Q  <- is the counts of these letters
 1 2 3 4 5 6 7 8 9 0  <- which "relate to" these digits in John's number
   2   4   6   8   0  <- these will be correct as the letters are unique to their words

รายการสำหรับ 1, 3, 5, 7 และ 9 จำเป็นต้องปรับเพื่อแก้ไขความอุดมสมบูรณ์ของตัวอักษรอื่น ๆ ดำเนินการโดยลูปถัดไป:

i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5

โปรดทราบว่ารายการที่จะปรับเป็นรายการสำรอง (1,3,5,7,9,1,3,5, ... ) ดังนั้นเราจึงสามารถเพิ่มตัวแปรดัชนีสองตัวในแต่ละขั้นตอนและโมดูโลได้ 10 เพื่ออยู่ใน ช่วงถ้าเราต้องการสำรวจมากกว่าหนึ่งครั้ง (ซึ่งเราทำ) หากต้องการบันทึกบางไบต์เราสามารถเพิ่มทีละหนึ่งและโมดูโลได้ 5 และใช้ดัชนีเป็นสองเท่า
ตั้งแต่การปรับ 9 ต้องทำงานมากที่สุดที่เราจะเริ่มมี - มันอยู่ที่ดัชนี 8 i=4ดังนั้นเราจึงเริ่มต้นที่ สตริง"71735539994"จะให้ดัชนีjของค่าที่จะลบในแต่ละขั้นตอน (ซึ่งเรามั่นใจว่าดัชนีที่เก้าจะมีศูนย์โดยใช้"Q"เมื่อสร้างc); c[i*2]-=c[int(j)]ดำเนินการปรับแต่ละบุคคลและi=-~i%5ย้ายiไปยังดัชนีถัดไป (ที่-~iเป็น-(-1-i)หรือภายในขอบเขตของi+1บันทึกวงเล็บ(i+1)%5)i*2c
ดังนั้นก่อนอื่นเราลบจำนวนที่ดัชนีj=7จากที่ที่ดัชนีi*2=8ลบจำนวน "G" s นับจากจำนวน "I" s ปรับ "NINE" นับถอยหลังด้วยจำนวน (ถูกต้อง) ของ "EIGHT" ( ซึ่งยังมี "ฉัน") จากนั้นเราย้ายไปที่i=0( -~4%5 = (4+1)%5 = 0), ดัชนีอ้างอิงi*2 = 0ซึ่งใช้สำหรับ "ONE" และลบค่าที่พบในดัชนีj=1การนับรายการ "W" และด้วยเหตุนี้ "TWO" ปรับการนับลงของ "O" ในตอนท้ายของลูปเรามีจำนวนที่แก้ไข:

[1,1,0,0,0,1,0,0,1,0] <- c   (for 1223333448 it would be: [1,2,4,2,0,0,0,1,0,0])
 1 2 3 4 5 6 7 8 9 0

ดังนั้นสิ่งที่เหลืออยู่ก็คือพิมพ์สิ่งที่cหมายถึง ( 1269) iตอนนี้กลับมาที่0ดังนั้นเราจึงเพิ่มขึ้นในช่วงเริ่มต้นของวงและใช้มันเป็นหลักของเรา:

s=""
for n in c:i+=1;s+=`i`*n
print s

เห็บกลับ`i`เป็น Python2 ชวเลขrepr(i)ที่ได้รับเป็นตัวแทนสตริงของวัตถุ (ตัวละครหลักในคำถามเป็นสตริง) และคูณสตริงโดย Creats จำนวนสตริงใหม่ที่ซ้ำหลาย (ที่นี่เราจะแสดงเฉพาะn=0การเปลี่ยน`i`จากการพูด"5"ถึง""และn=1เปลี่ยนการรักษาพูด"6"เป็น"6"แต่มันก็ยังทำงานได้สำหรับจำนวนเต็มบวกที่มีขนาดใหญ่จึง"3"*4กลายเป็น"3333"ตัวอย่าง)


8

05AB1E , 31 ไบต์

[{‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#NSèJ{Q#

ลองออนไลน์!

คำอธิบาย

[                                   # start loop
 {                                  # sort input
  ‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#            # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
                        N           # push the current iteration counter
                         S          # split to list of digits
                          è         # index into the list with each
                           J{       # join to string and sort
                             Q#     # if the strings are equal, exit loop
                                    # implicitly print iteration counter

ไม่มีประสิทธิภาพมากสำหรับอินพุตขนาดใหญ่


‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']: คุณช่วยอธิบายหน่อยได้ไหมฉันพยายามเข้าใจว่าจะสร้างสตริงได้อย่างไร
Cyril Gandon

1
@CyrilGandon: คั่นสตริงตัวพิมพ์ใหญ่ของคำที่คั่นด้วยช่องว่าง วิธีZ Zคู่อื่น ๆ ทั้งหมด 2 สัญลักษณ์แสดงคำที่บีบอัดจาก 05AB1E ของพจนานุกรม ดังนั้นสำหรับตัวอย่างเช่นแปลว่า€µ ONE
Emigna

ดีคุณบีบอัดสตริงมีในพจนานุกรมอย่างไร มีบางสิ่งที่มีค่า Unicode ของทั้งคู่
Cyril Gandon

1
@CyrilGandon: คุณใช้หมายเลขบรรทัดของคำใน Dict (2420 สวัสดี ) และลบ 1 2419นี้จะช่วยให้เรา สัญลักษณ์ที่เราต้องการเป็นสัญลักษณ์ที่จะตามมาด้วย24และ19ในเอกสาร ในกรณีของเรานี่คือ24=Ÿและ19=™ดังนั้นHELLOจะเป็น‘Ÿ™‘
Emigna

1
นอกจากนี้ยังมีคอมเพรสเซอร์ที่เขียนโดย Adnan คุณสามารถใช้งานได้ในหลายกรณี การเชื่อมโยงเป็นบิตนาน แต่คุณสามารถค้นหาได้ในห้องแชท 05AB1E ที่ยังเป็นสถานที่ที่ดีที่จะถามว่ามีคำถามเพิ่มเติมใด ๆ :)
Emigna

8

เรติน่า , 112 97 ไบต์

O`.
}`GH
8
X
6
H
3
+`F(.*)O(.*)U
4$1$2
+`O(.*)W
2$1
+`F(.*)V
5$1
+`N(.*)V
7$1
}`NO
1
NN
9
T`L
O`.

ลองออนไลน์!

-12 ไบต์ขอบคุณ @Neil

-3 ไบต์โดยใช้คลาสอักขระ L ในการขนย้าย

มันทำงานอย่างไร

โดยพื้นฐานแล้วสิ่งนี้ขึ้นอยู่กับความจริงที่ว่าตัวอักษรถูกใช้ในชื่อบางหมายเลขเท่านั้น ยกตัวอย่างเช่นเป็นชื่อเดียวที่มีSIX Xนี้ได้รับ trickier กับข้อเท็จจริงที่ว่าคำบางคำที่ทับซ้อนกันในตัวอักษรเช่นทั้งสองFIVEและใช้SEVEN Vซึ่งอาจได้รับการแก้ไขโดยการระบุด้วยFIVEF(.*)V


1
@RickHitchcock แก้ไขแล้ว การเรียกซ้ำไปยังการแปลงเป็น 8 ไม่ทำงานอย่างถูกต้อง
fireflame241

1
@RickHitchcock แก้ไขการสอบถามซ้ำทั้งหมด
fireflame241

รำคาญGHและNOจะเป็นที่อยู่ติดกันยกเว้นใด ๆ ก่อนหน้า8หรือ1จากเปลี่ยนตัวก่อน ...
นีล

บางที}`GH 8จะทำงานให้8- The }จะทำให้ตัวละครที่จะแยกอีกครั้งจึงวางใด ๆ ที่เหลือGและHร่วมกัน
Neil

@ นีลความคิดที่ดี ฉันสามารถทำเช่นนั้นได้NO -> 1ซึ่งสะดวก
fireflame241

5

Kotlin 1.1 , 359 352 331 327 325 ไบต์

ส่ง

fun r(r:String):String{var s=""
val f=r.split(s).groupingBy{it}.eachCount()
val c=Array(10,{0})
c[8]=f["G"]?:0
c[6]=f["X"]?:0
c[4]=f["U"]?:0
c[2]=f["W"]?:0
c[1]=(f["O"]?:0)-c[2]-c[4]
c[3]=(f["R"]?:0)-c[4]
c[7]=(f["S"]?:0)-c[6]
c[5]=(f["V"]?:0)-c[7]
c[9]=((f["N"]?:0)-c[1]-c[7])/2
for(i in 1..9)for(x in 1..c[i])s+=i
return s}

ไม่ทำงานบน TryItOnline เนื่องจาก Kotlin 1.1 ไม่ได้รับการสนับสนุน

ทดสอบ

fun r(r:String):String{
val f=r.split("").groupingBy{it}.eachCount()
val c=Array(10,{0})
c[8]=f["G"]?:0
c[6]=f["X"]?:0
c[4]=f["U"]?:0
c[2]=f["W"]?:0
c[1]=(f["O"]?:0)-c[2]-c[4]
c[3]=(f["R"]?:0)-c[4]
c[7]=(f["S"]?:0)-c[6]
c[5]=(f["V"]?:0)-c[7]
c[9]=((f["N"]?:0)-c[1]-c[7])/2
var s=""
for(i in 1..9)for(x in 1..c[i])s+=i
return s}

data class TestData(val input: String, val output: String)

fun main(vararg args:String) {
    val items = listOf(
    TestData("NEO" , "1"),
    TestData("NWEOOT" , "12"),
    TestData("TOEERWNEHOT" , "123"),
    TestData("IHNEVGENNEISTE" , "789"),
    TestData("WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" , "123456789"),
    TestData("EWHEWROETOTTON" , "1223")
    )
    for (item in items) {
        val out = r(item.input)
        if (out != item.output) {
            throw AssertionError("Bad result: $item : $out")
        }
    }
}

ตรรกะ

Crib sheet

ฉันใช้แผ่นด้านบนเพื่อหาวิธีที่ง่ายที่สุดในการแก้จดหมายแต่ละฉบับ

  • Green = แก้ไขด้วยตัวเอง
  • Blue = ต้องการผักเพื่อแก้ปัญหา
  • ส้ม = ต้องการสีน้ำเงินเพื่อแก้ปัญหา
  • Red = ต้องการส้มที่จะแก้ปัญหา

การแก้ไข

  • -7 - ช่องว่างมีการเปลี่ยนแปลงโดย w0lf
  • -21 - หดรายชื่อจาก Array
  • -4 - ลบวงเล็บเหลี่ยมที่ไม่ต้องการออก
  • 0 - เพิ่มตรรกะใน
  • -2 - การใช้สตริงว่างอีกครั้งขอบคุณ kevin-cruijssen

1
เพิ่งสังเกตเห็นว่าฉันผูกติดอยู่กับคุณกับคำตอบ Java 8 ของฉัน (127 bytes) โดยใช้วิธีการที่คล้ายกัน ;) แต่คำถามหนึ่งข้อ: คุณไม่สามารถเปลี่ยนvar s=""และreturn sไปr=""และreturn rนำกลับมาใช้อีกครั้งโดยป้อนสตริงซึ่งคุณไม่ต้องการอีกต่อไปแล้ว? ฉันไม่เคยตั้งโปรแกรมใน Kotlin มาก่อนดังนั้นอาจเป็นไปได้ว่าฉันพูดไร้สาระที่นี่ ; p
Kevin Cruijssen

1
แต่น่าเสียดายที่ไม่ได้> discuss.kotlinlang.org/t/...
jrtapsell

1
ใช่แล้วนั่นเป็นโอกาสที่แน่นอน พารามิเตอร์ที่เป็นfinalค่าเริ่มต้น อืมสิ่งอื่น ๆ ที่คุณอาจจะสามารถกอล์ฟ: วางvar s=""เป็นสิ่งแรกในวิธีการและแทนที่ด้วยval f=r.split(""). val f=r.split(s).อีกครั้งไม่มีความคิดถ้ามันใช้งานได้ น่าเสียดายที่ TIO ยังไม่สนับสนุน v1.1 มิฉะนั้นฉันจะลองทำตามคำแนะนำเหล่านี้ก่อนที่ฉันจะทำให้ตัวเองโง่
งงงวย

4

เยลลี่ , 37 ไบต์

1ðDị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»ŒuḲ¤ẎŒ!ċð1#

ลองออนไลน์!

-1 ขอบคุณที่โจนาธานอัลลัน


หมดเวลาสำหรับอินพุตบางตัวที่มากกว่า 7 ตัวอักษร (เช่น: NINEFIVE, THREEFIVE) มันเป็นข้อบกพร่องหรือเป็นรหัสที่ไม่มีประสิทธิภาพ?
Cristian Lupascu

@ w0lf หลัง ( Œ!หมายถึง "การเรียงสับเปลี่ยน")
Erik the Outgolfer

บันทึกไบต์โดยใช้ "AA" แทน "!":...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Jonathan Allan

@JanathanAllan โอ้คำพูดคือ AA?
Erik the Outgolfer

มันเป็นคำแรกในพจนานุกรมสั้น ๆ ใช่
Jonathan Allan

3

Java 8, 248 234 ไบต์

s->{int x=0,a[]=new int[10];for(String t:"2WO;4UORF;6XSI;8GI;5FI;7S;3R;1O;9I".split(";"))for(;s.indexOf(t.charAt(1))>=0;a[t.charAt(0)-48]++)for(String z:t.split(""))s=s.replaceFirst(z,"");for(s="";x++<9;)for(;a[x]-->0;)s+=x;return s;}

คำอธิบายรหัส:

s->{
    // Array to count how often which number appears
    int a[]=new int[10];
    // The first character behind the number serves the identification
    // the other characters get removed to identify the other numbers later
    for(String t:"2WO;4UORF;6XSI;8GI;5FI;7S;3R;1O;9I".split(";"))
        // Check if the string contains the id 
        for(;s.indexOf(t.charAt(1))>=0;a[t.charAt(0)-48]++)
            // Remove the relevant charcters
            for(String z:t.split(""))
                s=s.replaceFirst(z,"");
    // Clear the string to write the output
    s="";
    // write the numbers sequential into the output 
    for(int x=0;x++<9;)
        for(;a[x]-->0;)
            s+=x;
    return s;
}

-14 ขอบคุณ Olivier Grégoire



2

Java 8, 346 345 344 336 327 ไบต์

s->{int g=c(s+=" ","G"),u=c(s,"U"),w=c(s,"W"),x=c(s,"X"),f=c(s,"F")-u,h=c(s,"H")-g,v=c(s,"V")-f,o=c(s,"O")-u-w,i=c(s,"I")-f-x-g;return d(s=d(s=d(s=d(s=d(s=d(s=d(s=d(s=d("",o,1),w,2),h,3),u,4),f,5),x,6),v,7),g,8),n,9);}int c(String...s){return~-s[0].split(s[1]).length;}String d(String s,int i,int n){for(;i-->0;s+=n);return s;}

ลองที่นี่

คำอธิบายทั่วไป:

ฉันได้ดูเหตุการณ์ที่เกิดขึ้นของตัวละครแต่ละตัวในตัวอักษร:

E 13357789
F 45
G 8
H 38
I 5689
N 1799
O 124
R 34
S 67
T 238
U 4
V 57
W 2
X 6
  • ฉันนับเหตุการณ์ที่เกิดขึ้นครั้งแรกของอักขระการจับคู่เดี่ยวทั้งหมด: G=8; U=4; W=2; X=6ครั้งแรกที่ผมนับเกิดขึ้นทั้งหมดในตัวละครเดียวที่ตรงกัน:
  • จากนั้นทั้งหมดของตัวละครที่จับคู่สองตัวซึ่งตรงกับหนึ่งในสี่ด้านบนซึ่งฉันสามารถลบออกจากการนับของพวกเขา: F=5; H=3จากนั้นเกิดขึ้นทั้งหมดของตัวละครทั้งสองจับคู่ซึ่งยังตรงกับหนึ่งในสี่ข้างต้นซึ่งฉันสามารถลบออกจากการนับจำนวนของพวกเขา
  • จากนั้นฉันก็ทำเช่นเดียวกันอีกครั้งสำหรับV=7(โดยการลบF=5 )
  • จากนั้นเหมือนกันสำหรับตัวละครสามตัวที่เหลือทั้งหมด: O=1; N=9 .
    • แต่เนื่องจากNมีเหตุการณ์เกิดขึ้นสองเหตุการณ์NINEฉันจึงต้องเพิ่ม-1ทุกเหตุการณ์Nดังนั้นฉันจึงใช้I=9แทน (โดยลบการแข่งขันสามครั้งก่อนหน้านี้แทนที่จะเป็นสองครั้ง)

คำอธิบายรหัส:

s->{                    // Method with String as parameter and return-type
  int g=c(s+=" ","G"),  //  Amount of 8s (and append a space to `s` first, for the .split)
      u=c(s,"U"),       //  Amount of 4s
      w=c(s,"W"),       //  Amount of 2s
      x=c(s,"X"),       //  Amount of 6s
      f=c(s,"F")-u,     //  Amount of 5s
      h=c(s,"H")-g,     //  Amount of 3s
      v=c(s,"V")-f,     //  Amount of 7s
      o=c(s,"O")-u-w,   //  Amount of 1s
      i=c(s,"I")-f-x-g; //  Amount of 9s
  return d(             //  Return the result by:
   s=d(
    s=d(
     s=d(
      s=d(
       s=d(
        s=d(
         s=d(
          s=d("",       //   Making the input String `s` empty, since we no longer need it
                 o,1),  //   Append all 1s to `s`
         w,2),          //   Append all 2s to `s`
        h,3),           //   Append all 3s to `s`
       u,4),            //   Append all 4s to `s`
      f,5),             //   Append all 5s to `s`
     x,6),              //   Append all 6s to `s`
    v,7),               //   Append all 7s to `s`
   g,8),                //   Append all 8s to `s`
  i,9);                 //   And then returning `s` + all 9s
}                       // End of method

int c(String...s){  // Separate method with String-varargs parameter and int return-type
                    //  `s[0]` is the input-String
                    //  `s[1]` is the character to check
  return~-s[0].split(s[1]).length;
                    //  Return the amount of times the character occurs in the String
}                   // End of separated method (1)

String d(String s,int i,int n){
               // Separate method with String and two int parameters and String return-type
  for(;i-->0;  //  Loop from the first integer-input down to 0
      s+=n     //   And append the input-String with the second input-integer
  );           //  End of loop
  return s;    //  Return the resulting String
}              // End of separated method (2)

1
ประณามฉันคิดว่าการเพิ่มไปยังรายการแล้วการเรียงลำดับจะสั้นกว่า (ไม่ใช่) ทำได้ดี!
Olivier Grégoire

1
ในที่สุดฉันก็ชนะคุณแต่ไม่มากนัก)
โอลิเวียร์เกรโกร์


1

Python 3 , 225 ไบต์

def f(s):
	r=[]
	for i,w in zip([2,4,6,8,3,5,7,1,9],["WTO","UFOR","XSI","GEIHT","HTREE","FIVE","VSEEN","ONE","NINE"]):
		while s.count(w[0]):
			r+=[i]
			for l in w:s="".join(s.split(l,1))
	return "".join(sorted(map(str,r)))

ลองออนไลน์!

ตรงไปตรงมา: ลบตัวเลขที่ระบุด้วยตัวอักษรเฉพาะก่อน


1

Python 3 , 125 ไบต์

lambda s:''.join(min(w)*(2*sum(map(s.count,w[:2]))-sum(map(s.count,w)))for w in"O1WU W2 H3G U4 F5U X6 S7X G8 IUFXG9".split())

ลองออนไลน์!

หลังจากอ่านความท้าทายที่เชื่อมโยงกันแล้วฉันก็ตระหนักว่านี่เป็นรูปแบบของโซลูชัน Python ของ mdahmouneซึ่งเป็นตัวเองโดยใช้โซลูชั่น ES6 ของ Draco18sแต่อย่างน้อยเราก็ตีสองไบต์

เช่นเดียวกับวิธีการแก้ปัญหานั้นเราคำนวณคำตอบผ่านชุดค่าผสมเชิงเส้นของจำนวนการเกิดของตัวอักษรบางตัว เราเข้ารหัสชุดค่าผสมเชิงเส้นสั้น ๆ โดยเขียนเป็นคำที่จะเพิ่มตัวอักษรสองตัวแรกและทุกอย่างในภายหลังจะถูกลบออก บางครั้งจำเป็นต้องใช้อักขระเพื่อเสริมอักขระสองตัวแรก เราใช้สิ่งนี้เพื่อซ่อนตัวเลขที่เราต้องการส่งออก (ซึ่งจะไม่เกิดขึ้นในอินพุตดังนั้นจะไม่มีผลต่ออัลกอริทึมของเรา) ซึ่งเราแยกminออกมา



1

ความจริง 351 ไบต์

s:="GXUWRFVIONETHS";e:EqTable(CHAR,INT):=table();v:=[8,6,4,2,3,5,7,9,1];z:=[k for k in 1..46|prime?(k)];F(x,y)==>for i in 1..#x repeat y;F(z,e.(s.i):=z.i);t:=[1787026,2451,16445,5957,16036207,130169,20372239,495349,20677];h(a)==(r:=1;F(a,r:=r*e.(a.i));j:=[];F(v,while r rem z.i=0 repeat(r:=r quo t.i;j:=cons(v.i,j)));j:=sort j;k:=0;F(j,k:=k*10+j.i);k)

ผลลัพธ์ที่ไม่ได้แสดงความคิดเห็น

s:="GXUWRFVIONETHS" -- tutte le lettere di ONE..NINE in ordine di importanza 
e:EqTable(Character,Integer):=table()
v:=[8,6,4,2,3,5,7,9,1]              -- numeri da controllare in quell'ordine di apparizione di v
z:=[k for k in 1..46|prime?(k)]     -- 14 numeri primi da associare a s
F(x,y)==>for i in 1..#x repeat y 
F(z,e.(s.i):=z.i)                   -- riempie la tavola associando numeri primi alle lettere "GXUW..."
t:=[1787026,2451,16445,5957,16036207,130169,20372239,495349,20677]  -- prodotto di numeri primi 1787026 dovrebbe essere HEIGHT
h(a)==
     r:=1 ;F(a,r:=r*e.(a.i))        -- calcola il numero associato alla stringa a
     j:=[];F(v,while r rem z.i=0 repeat(r:=r quo t.i;j:=cons(v.i,j)));j:=sort j  -- leva il nome dei numeri che man mano trova, aggiunge a j
     k:=0 ;F(j,k:=k*10+j.i)         -- costruisce il numero decimale k, da j vettore ordinato
     k                              -- ritorna tale numero k
------------------------------------------------------
(8) -> h("IHNEVGENNEISTE")
   (8)  789
                                                    Type: PositiveInteger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.