หมายเลขเดิม


36

แนวทาง

สถานการณ์

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

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

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

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

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

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


งาน

รับสายอักขระที่เข้ารหัสลับ 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

"ENOWOT" -> 12

"EONOTWHTERE" -> 123

"SNVEEGHEITNEIN" -> 789

"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789

"NOEWOTTOWHEERT" -> 1223


5
ในทุกกรณีการทดสอบมีเพียงตัวอักษรภายในคำเท่านั้นที่จะถูกสับเปลี่ยนไม่ใช่ตัวอักษรระหว่างคำ มันจะเป็นอย่างนั้นเสมอไหม?
xnor

1
@ xnor นั่นจะเป็นอย่างนั้นเสมอ ฉันได้แก้ไขคำถาม
Amorris

1
จากนั้นคุณต้องเปลี่ยน ".... (เช่น." ONETWOTHREE "->" TTONWOHREEE ")"
J42161217

2
@ TessellatingHeckler: ลำดับที่เพิ่มขึ้นอย่างไม่เคร่งครัดคือเมื่อหมายเลขถัดไปสามารถเหมือนกับ ex ก่อนหน้า 1-1-1-2-2-3 (เพิ่มขึ้นแบบไม่ จำกัด ) ซึ่งตรงข้ามกับ 1-2-3-4-5 (เพิ่มขึ้นอย่างเข้มงวด)
koita_pisw_sou

1
เทคนิคการพูดนี่เป็นการเข้ารหัสไม่ใช่การเข้ารหัสเนื่องจากไม่มีคีย์
Patrick Roberts

คำตอบ:


5

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

ḟ“RGS”O“OX‘,“¢©“¢¢¤‘yF×4/%74ị⁽Gל?9¤Ḍ

ลิงก์ monadic ที่รับรายการอักขระ (สตริง) และส่งคืนจำนวนเต็ม

ลองออนไลน์!

ใช้แตกต่างกันมากวิธีการในการPietu1998 คำตอบของเจลลี่ , ยังมีการนับไบต์เดียวกัน ( ผมคิดว่ามันอาจจะ ไม่จบลงเช่นน้อยกว่า)!

ไม่ต้องพึ่งพาความน่าเบื่อของหมายเลขเดิม ( HTREEWTONOEตัวอย่างเช่นการป้อนข้อมูลจะใช้งานได้)

อย่างไร?

โปรดทราบก่อนว่าคำเหล่านั้น (และแอนนาแกรมใด ๆ ของมัน) สามารถเปลี่ยนเป็นความยาว 4 ได้โดยการลบ Rs, Gs และ Ss ใด ๆ และแทนที่ระบบปฏิบัติการด้วยอักขระสองตัว (พูดว่า "12") และ Xs ที่มีสามอักขระ ( พูดว่า "345")

letters  -> -RGS  -> O:12, X:345
ONE         ONE      12NE
TWO         TWO      TW12
THREE       THEE     THEE
FOUR        FOU      F12U
FIVE        FIVE     FIVE
SIX         IX       I345
SEVEN       EVEN     EVEN
EIGHT       EIHT     EIHT
NINE        NINE     NINE

จากนั้นเราอาจแมปผลผลิตของเลขลำดับของตัวละครเหล่านั้นไปยังหมายเลข 1 ถึง 9 โดยใช้โมดูโลเลขคณิตขึ้นอยู่กับตัวเลือกของเรา ("12345") จากนั้นค้นหารายการเหล่านี้ในรายการตัวเลขที่เรียงลำดับใหม่ รหัสจะใช้อักขระจริงก่อนแล้วจึงแทนที่เลขลำดับ แต่ก็เป็นไปได้ใน 37 ไบต์ด้วยอักขระเช่น "DIAAE" ( ลองใช้ )

ḟ“RGS”O“OX‘,“¢©“¢¢¤‘yF×4/%74ị⁽Gל?9¤Ḍ - link: list of characters
 “RGS”                                - literal ['R','G','S']
ḟ                                     - filter discard
      O                               - convert to ordinals
       “OX‘                           - code-page indices list = [79,88]
            “¢©“¢¢¤‘                  - code-page indices lists = [[1,6],[1,1,3]]
           ,                          - pair -> [[79,88],[[1,6],[1,1,3]]]
                    y                 - translate (replace 79s (Os) with [1,6]
                                                       and 88s (Xs) with [1,1,3])
                     F                - flatten into a single list
                       4/             - 4-wise reduce by:
                      ×               -   multiplication (product of each window of four)
                         %74          - modulo 74
                                   ¤  - nilad followed by link(s) as a nilad:
                             ⁽G×      -   base 250 literal = 18768
                                œ?9   -   permutation of [1,2,3,4,5,6,7,8,9] at that
                                      -   index in a lexicographically sorted list of
                                      -   all such permutations -> [1,5,8,2,4,9,7,6,3]
                            ị         - index into
                                    Ḍ - convert from decimal digits to an integer

NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENINคำตอบของคุณเป็นตัวอักษรคำตอบเดียวในหน้านี้ที่ส่งกลับค่าที่ถูกต้องสำหรับ:
Magic Octopus Urn

+ คะแนนอนันต์
Magic Octopus Urn

ขอบคุณ! (ที่โยนฉันเพราะมีช่องว่างความกว้างศูนย์เพื่อการป้องกันรหัสในความคิดเห็น แต่ (ต๊าย) มันไม่ทำงาน )
โจนาธานอัลลัน

มันไม่ใช่อินพุตที่ถูกต้องอย่างไรก็ตาม)
Magic Octopus Urn

โอ้ว้าวข้าไม่รู้ว่ากำลังจะมาถึงขอบคุณ -! ใช่มันไม่ได้เป็นส่วนหนึ่งของสเป็คที่ร้องขอฉันเพิ่งทำวิธีที่จะทำงานกับอินพุตที่ไม่ได้เรียงลำดับ
Jonathan Allan

10

Python 2, 121 117 115 ไบต์

def g(s,a=0,f=''):
 for c in s:
    a+=34**ord(c)%43;r='P!\x83u\x8eI\x92|Z'.find(chr(a))+1
    if r:f,a=f+`r`,0
 return f

-4 bytes: หลังจากเล่นกอล์ฟทั้งหมดฉันลืมอินไลน์ตัวแปรแบบใช้ครั้งเดียว ผายลมสมอง
-2 ไบต์: การเว้นระยะการเยื้องสองเท่า→เยื้องแท็บเดี่ยว (ขอบคุณ Coty Johnathan Saxman); โปรดทราบว่าสิ่งนี้ไม่แสดงอย่างถูกต้องในคำตอบ

Ungolfed (เข้ากันได้กับหลาม 3):

nums = [80, 33, 131, 117, 142, 73, 146, 124, 90]

def decode(str):
    acc = 0
    final = ''
    for c in str:
        acc += (34**ord(c))%43
        if acc in nums:
            final += str(1+nums.index(acc))
            acc=0
    return final

ค้นหาหมายเลข Magic:

#!/usr/bin/env python3
from itertools import count, permutations

def cumul(x):
    s = 0
    for v in x:
        s += v
        yield s

all_words = 'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()

for modulo in range(1, 1000):
    for power in range(1, 300):
        combinations = []
        for word in all_words:
            my_combination = []
            for perm in permutations(word):
                my_combination += cumul(power**(ord(x)) % modulo for x in perm)
            combinations.append(my_combination)

        past_combinations = set(())
        past_intermediates = set(())
        collision = False
        for combination in combinations:
            final = combination[-1]
            if final in past_intermediates or any(intermediate in past_combinations for intermediate in combination):
                collision = True
                break
            past_combinations.add(final)
            past_intermediates.update(combination)

        if not collision:
            print("Good params:", power, modulo)
            print("Results:", ", ".join(str(x[-1]) for x in combinations))

คำอธิบาย:

ฉันมีความรู้สึกว่าฉันสามารถชนบิต ASCII เข้าด้วยกันและสรุปพวกเขาเพื่อพิจารณาว่าฉันมีคำเต็มเมื่อใด แต่เดิมฉันพยายามทำกับ3**ord(letter)และเปรียบเทียบกับผลลัพธ์ที่คาดหวัง แต่มันส่งผลเป็นจำนวนมาก ฉันคิดว่ามันจะเหมาะสมที่จะใช้กำลังกับพารามิเตอร์บางตัวเล็กน้อยนั่นคือโมดูลัส (เพื่อให้แน่ใจว่าตัวเลขมีขนาดเล็ก) และตัวคูณเพื่อกระจายตัวเลขต่างกันในช่วงของโมดูลัส

ฉันลงเอยด้วยการเปลี่ยนตัวแปรทวีคูณเป็นตัวแปรที่มีผลต่อพลังของตัวเองเพราะ (จากการทดลองและข้อผิดพลาด) ซึ่งทำให้ฉันได้คำตอบที่สั้นกว่าเล็กน้อย

และเหนือคุณจะเห็นผลลัพธ์ของการบังคับเดรัจฉานและการตีกอล์ฟด้วยมือเล็กน้อย

เหตุผลในการเลือก3**xเดิมคือเพราะฉันรู้ว่าคุณสามารถเป็นตัวแทนของทุกหมายเลขที่นั่น ตัวเลขซ้ำ ๆ ที่มีจำนวนมากที่สุดคือสอง (thrEE, sEvEn, NiNe, ฯลฯ ) ดังนั้นฉันจึงคิดว่าทุกอินพุตเป็นฐานเลข 3 ด้วยวิธีนี้ฉันสามารถ (ใจ) แสดงให้พวกเขาเป็นสิ่งที่ชอบ10100000000010020000(สาม; 1 ในtช่อง, 1 ในrช่อง, 1 ในhช่องและ 2 ในeช่อง) แต่ละหมายเลขด้วยวิธีนี้จะได้รับการแสดงที่ไม่ซ้ำกันซึ่งสามารถประกอบเข้าด้วยกันได้อย่างง่ายดายโดยการวนซ้ำสตริงและรวมตัวเลขจำนวนหนึ่งและท้ายที่สุดจะเป็นอิสระจากลำดับตัวอักษรที่แท้จริง แน่นอนว่านี่ไม่ได้เป็นทางออกในอุดมคติ แต่โซลูชันปัจจุบันยังคงเขียนด้วยแนวคิดนี้อยู่ในใจ


Py3K คืออะไร ...
เครื่องคิดเลข

ขอโทษแก้ไข (มันเป็นชื่อเดิมของหลาม 3)
คะแนน _ ภายใต้

1
มันราคาถูก แต่คุณสามารถบันทึกได้ 2 ไบต์ (เนื่องจากเป็นงูหลาม 2) โดยลดระดับการเยื้องที่สองของคุณ (สองช่องว่าง) สำหรับแท็บเดียว [ tio.run/##NU7NCoJAGDy7T/…ลองออนไลน์!]
Coty Johnathan Saxman

นอกจากนี้คุณอาจจะสามารถที่จะบันทึก 6 ไบต์โดยใช้ตัวอักษร\x83, \x8eและ\x92ในสตริง
CalculatorFeline

แต่น่าเสียดายที่ @CalculatorFeline SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for detailsล่ามของฉันไม่ชอบที่: ใช้งานได้ถ้าฉันใส่codingความคิดเห็นไว้ที่นั่น แต่เพิ่ม 15 ไบต์พิเศษ
คะแนน _ ต่ำกว่า

6

Python 2 , 131 127 ไบต์

s=input()
for y in'WXGURFSOIZ':vars()[y]=s.count(y)
while Z<9:s+=[O-U-W,W,R-U,U,F-U,X,S-X,G,I-X-G-F+U][Z]*str(Z+1);Z+=1
print s

ลองออนไลน์!

อิงตามโซลูชันJavaScript Draco18s เวอร์ชันที่แก้ไขแล้ว


ช่างน่าสนใจvarsจริงๆ!
xnor

@xnor มันเป็นวิธีการเรียนรู้ฉันที่กอล์ฟอื่น ๆ :)))
mdahmoune

ฉลาดมาก. มี +1 สำหรับการปรับคำตอบของฉัน (มีข้อบกพร่องเหมือนเดิม)
Draco18s

5

PHP , 164 ไบต์

for($c=count_chars($argn);$i<9;)echo str_pad("",[$c[79]-$c[87]-$u=$c[85],$c[87],$c[72]-$g=$c[71],$u,$f=$c[70]-$u,$x=$c[88],$c[86]-$f,$g,$c[73]-$x-$f-$g][+$i],++$i);

ลองออนไลน์!

PHP , 179 ไบต์

ขึ้นอยู่กับวิธีการก่อนหน้านี้ตรวจสอบหมายเลขคู่ก่อนแล้วจึงทำการเพิ่มเลขคี่ในลำดับที่เพิ่มขึ้น

for($z=[$o=($c=count_chars($argn))[87],$f=$c[85],$x=$c[88],$g=$c[71],$c[79]-$o-$f,$c[72]-$g,$v=$c[70]-$f,$c[86]-$v,$c[73]-$x-$v-$g];$i<9;)echo str_repeat(++$i,$z[_405162738[$i]]);

ลองออนไลน์!

PHP , 201 ไบต์

for(;$o=ord(WUXGOHFVN[$i]);$i++)for(;$r[$o]<count_chars($argn)[$o];$t[]=$i>3?2*$i-7:2+2*$i,sort($t))for(++$r[$o],$n=0;$q=ord(([TO,ORF,IS,HEIT,EN,TREE,IVE,SEEN,NIE][+$i])[$n++]);)$r[$q]++;echo join($t);

ลองออนไลน์!


ล้มเหลวสำหรับENOOWTWTOWOT
Titus

@Titus ได้รับการแก้ไขแล้ว ฉันเข้าใจผิดคำถาม
JörgHülsermann

ใช่ตัวอย่างที่ทำให้เข้าใจผิดค่อนข้าง ว้าวนั่นทำค่าใช้จ่าย! คุณจะทำลายมันลงไหม!
ติตัส

@Titus ฉันคิดว่าฉันได้มาถึงขีด จำกัด เพื่อหาวิธีอื่นตามแนวทางของคุณแล้ว
JörgHülsermann

1
$i++<9และ$iแทน$i<10และ++$i(-1 ไบต์); _405162738[$i]แทน$i%2?$i/2+4:$i/2-1(-4 ไบต์) ( $i/2+~($i%2*-5)ก็ใช้ได้เช่นกัน แต่นั่นคืออีกหนึ่งไบต์อีกต่อไป)
ติตัส

5

Javascript (ES6), 288 150 144 ไบต์

q=s=>[u=(l=t=>s.split(t).length-1)`U`,l`O`-l`W`-u,l`W`,l`R`-w,u,f=l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g-f].map((n,i)=>`${i}`.repeat(i&&n)).join``

const testCases = ['NEO', 'ENOWOT', 'EONOTWHTERE', 'SNVEEGHEITNEIN', 'ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN']

testCases.forEach(testCase => console.log(testCase, q(testCase)))

นานกว่าอีกสองคนหนึ่งในรายการ JS อื่น ๆ แต่ฉันคิดว่าฉันต้องการวางวิธีที่น่าสนใจว่าการทำงานอาจจะหาใครสักคนในภาษาอื่น

เป็นหลักเราสามารถตรวจสอบต่อไปนี้:

W -> 2
X -> 6
G -> 8
U -> 4

การเกิดขึ้นของตัวอักษรเหล่านี้ก็หมายความว่าตัวเลขนั้นมีอยู่ในหมายเลขเดิม จากที่นี่เราสามารถสรุปส่วนที่เหลือของตัวเลข:

R-U -> 3
F-U -> 5
S-X -> 7

รวมทั้งสองกรณีที่ซับซ้อน:

O-(U+W) -> 1
I-(X+G+(F-U)) -> 9

ทั้งพื้นที่1และ9ค่อนข้างยาก สำหรับ ONE Eแสดงคำมากกว่าหนึ่งครั้ง ( SEVENมีสองคำ) เช่นเดียวกับN( NINE) ดังนั้นเราจึงติดอยู่กับการตรวจสอบOที่เกิดขึ้นในอีกสองแห่งโชคดีที่ทั้งคู่นั้นเรียบง่าย

สำหรับเก้าเก้านั้นยากไม่ว่าคุณจะเชือดมันอย่างไร

ดังนั้นเราจะจบลงด้วยแผนที่นี้:

[u=(l=t=>s.split(t).length-1)`U`,  //unused 0; precompute 'U's
 l`O`-l`W`-u,    //1
 l`W`,           //2
 l`R`-w,         //3
 u,              //4
 f=l`F`-u,       //5
 x=l`X`,         //6
 l`S`-x,         //7
 g=l`G`,         //8
 l`I`-x-g-f]     //9

9 สามารถอ้างอิงกลับ siX, eiGht และ Five (พร้อม 5 back-referencing foUr) พร้อมการกำหนดตัวแปรประหยัดไบต์ ต้องขอบคุณนีลสำหรับสิ่งนี้มันใช้คุณสมบัติหลายอย่างของ JS ฉันไม่คุ้นเคย (เช่นการย้อนกลับของการลอก('ครึ่ง) และจริง ๆ แล้วเข้ามาใกล้กับความคิดที่ฉันวาดออกมาบนกระดาษก่อนที่จะพยายามเขียนโค้ด (ฉันทิ้ง 9 เป็น "สิ่งที่เหลืออยู่" คิดว่าเป็น "ถ้าฉันเห็นXฉันสามารถลบมันและSและIจากสตริงแล้ว ... " ดังนั้นหลังจากสี่กรณีง่าย 3 ถัดไปจะกลายเป็นง่าย)

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

q=s=>[u=(l=t=>s.split(t).length-1)`U`,l`O`-l`W`-u,l`W`,l`R`-w,u,f=l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g-f].map((n,i)=>`${i}`.repeat(i&&n)).join``

const testCases = ['XENSENINEVSI']

testCases.forEach(testCase => console.log(testCase, q(testCase)))


1
เยี่ยมมาก แต่มีปัญหากับการนับ 9 ... ฉันคิดว่าอาจเป็น ixg-f + u
mdahmoune

@mdahmoune Shoot คุณพูดถูก ฉันทำอย่างนั้น : <
Draco18s

บันทึก 4 ไบต์โดยใช้s.split(t).length-1, 2 ไบต์ใช้s.repeat(n>0&&n)(ทำไมถึง n น้อยกว่าศูนย์ต่อไป? บันทึก 7 ไบต์) บันทึกไบต์จำนวนมากโดยประกาศgในขอบเขตsเพื่อที่คุณจะได้ไม่ต้องผ่านมันตลอดเวลาและยังดีกว่าที่คุณสามารถทำให้มันเป็นเทมเพลตที่ติดแท็กซึ่งจะช่วยประหยัด 55 ไบต์ทั้งหมด (ก่อนหน้าการแก้ไข 9 ครั้ง) บันทึกเพิ่มเติมไบต์โดยการบันทึกค่าซ้ำในชั่วคราวและผมโกนอีกไม่กี่ปิดใช้:map s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
Neil

@ ไม่มีฉันไม่แน่ใจว่าทำไม N ถึงลงเอยน้อยกว่าศูนย์ แต่ทำเมื่อทำการทดสอบสามครั้ง ฉันยังคงได้รับข้อผิดพลาดและตรวจสอบฉันพบว่ามันจำเป็น แต่ฉันก็ยังไม่แน่ใจ แผนที่ห้องสมุด templated ที่คุณได้รับมีจาวาสคริปต์ที่ฉันไม่รู้วิธีอ่าน : D
Draco18s

@Neil อาขวาเหตุผลสำหรับการตรวจสอบ n> 0: ถ้ามีเป็นสอง แต่ไม่สาม R = 0, W = 1 0-1 = -1 ฉันมีปัญหาในการหาว่าเมื่อหนึ่งชั่วโมงที่แล้วฉันรู้ว่ามันเกี่ยวข้องกับการตรวจสอบ 3 ครั้ง แต่ก็มีมารเวลาที่ทำงานออกมา (ขาดกาแฟ)
Draco18s

4

Mathematica, 133 ไบต์

(s={};c=Characters;j=c@#;Table[If[FreeQ[j~Count~#&/@c[#[[i]]]&@ToUpperCase@IntegerName@Range@9,0],s~AppendTo~i],{i,9}];FromDigits@s)&


อินพุต

"VENESGTHIEENNI"

เอาท์พุต

789


คุณสามารถบันทึกไบต์พิเศษด้วยc@#[[i]]แทนที่จะได้c[#[[i]]]หรือไม่ คุณอาจจะสามารถที่จะบันทึกไบต์อื่นโดยใช้ไวยากรณ์มัดบน~ Table
numbermaniac

4

C #, 218 ไบต์

เวอร์ชั่นสั้น:

string q(string s){var n="ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".Split(',');for(inti=0,j;;i++)for(j=0;n[i].IndexOf(s[j])>=0;){if(++j==n[i].Length){var r=++i+"";for(;j<s.Length;r+=++i)j+=n[i].Length;return r;}}}

รุ่นขยาย:

string q(string s)
{
    var n = "ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".Split(',');
    for (int i = 0, j; ; i++)
        for (j = 0; n[i].IndexOf(s[j]) >= 0;)
        {
            if (++j == n[i].Length)
            {
                var r = ++i + "";
                for (; j < s.Length; r += ++i)
                    j += n[i].Length;
                return r;
            }
        }
}

ลองออนไลน์!

เป็นรายการแรกของฉันฉันไม่แน่ใจเกี่ยวกับกฎ ... ฉันแค่นับขนาดของชั้นที่ใช้ในการถอดรหัสไม่ได้รหัสที่ทดสอบมันใช่มั้ย

แก้ไข

และเพื่อความสนุกสนานของมัน - นี่คือสิ่งที่ผมเริ่มทำไม่อ่านกฎระเบียบทั้งหมด: S - ดูมันที่ IdeOne มันถอดรหัสแม้ในขณะที่ตัวละครจากตัวเลขหนึ่งสามารถถูกรบกวนไปยังสถานที่ใด ๆ ในสตริง

แก้ไข 2

ย่อตามเคล็ดลับโดย TheLethalCoder ขอบคุณ!

แก้ไข 3

และตอนนี้ทิตัสได้โกนหนวดแล้วไม่กี่ไบต์ ขอบคุณ!


2
สวัสดีและยินดีต้อนรับสู่ PPCG! คุณเพียงแค่ต้องรวมวิธีการที่คุณสามารถลบออกpublic staticจากมันเป็น s=>{<do stuff>return"";}คุณสามารถแปลงไปเป็นวิธีการที่ไม่ระบุชื่อเช่น คุณสามารถใช้ไม่กี่ครั้งประกาศตัวแปรร่วมกันประหยัดไบต์คือvar int i=1,j;การสร้างอาร์เรย์จากสตริงและแยกมันคือมักจะสั้น ( แต่ผมยังไม่ได้ตรวจสอบในกรณีนี้) "ONE|TWO".Split('|')คือ คุณสามารถใช้<0แทน==-1
TheLethalCoder


@TheLethalCoder เคล็ดลับเยี่ยมมากขอบคุณ!
SamWhan

ไม่ได้ทดสอบเลย แต่ฉันเชื่อว่าต่อไปนี้เทียบเท่ากับรหัสของคุณสำหรับ 221 ไบต์:s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
TheLethalCoder

ในบันทึกด้านข้างมักจะใช้TIOสำหรับ TIO ของคุณง่ายกว่า!
TheLethalCoder

3

JavaScript (ES6), 142 139 ไบต์

ที่บันทึกไว้ 3 ไบต์ขอบคุณที่นีล

ในปัจจุบันไม่ได้ใช้ประโยชน์จากหมายเลขที่เรียงลำดับจากน้อยไปมากเสมอ

f=s=>s?'ENO|OTW|EEHRT|FORU|EFIV|ISX|EENSV|EGHIT|EINN'.split`|`.findIndex(w=>[...s.slice(0,y=w.length)].sort().join``==w)+1+f(s.slice(y)):''

f=s=>s?'ENO|OTW|EEHRT|FORU|EFIV|ISX|EENSV|EGHIT|EINN'.split`|`.findIndex(w=>[...s.slice(0,y=w.length)].sort().join``==w)+1+f(s.slice(y)):''

const testCases = ['NEO', 'ENOWOT', 'EONOTWHTERE', 'SNVEEGHEITNEIN', 'ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN']

testCases.forEach(testCase => console.log(testCase, f(testCase)))


รออะไร?? "axbxc".split`x`.join``. สิ่งนี้เรียกว่าอย่างไร? ดูเหมือนจะไม่พบสิ่งใดบน google
Qwerty

@Qwerty - พวกเขาถูกแท็กตัวอักษรเทมเพลต , คุณสมบัติ ES6 ที่ฉันใช้เพื่อบันทึกสองสามไบต์โดยไม่จำเป็นต้องมี parens ในกรณีของsplitและjoin
Craig Ayre

คุณตอบมัน ฉันรู้ว่าเทมเพลตตัวอักษรที่ติดแท็ก แต่ฉันไม่ได้ตระหนักว่าคุณสามารถใช้กับฟังก์ชั่นเหล่านี้ได้เช่นกัน ขอขอบคุณ.
Qwerty

พวกเขาแตกต่างกันเล็กน้อยคุณมีเทมเพลตตัวอักษร (เช่นx=`foo${5+5}bar`) พวกเขาจะถูกติดแท็กเมื่อคุณเรียกใช้ฟังก์ชั่นโดยไม่ต้องใช้ parens: foo`foo${5+5}bar`ซึ่งเหมือนกับfoo(['foo','bar'], 10)
Craig Ayre

1
f(s.slice(y))เป็นสตริงเสมอดังนั้นคุณไม่จำเป็นต้องใช้''+มาก่อน
Neil

2

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

Dị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»Ḳ¤FṢŒu
L3*Ç€iṢ

ลองออนไลน์!

คำอธิบาย

L3*Ç€iṢ    Main link. Argument: s (string)
L            Get length of s.
 3*          Raise 3 to that power. This will always be greater than n.
   ǀ        Get the name of each of the numbers using the helper link.
     iṢ      Find the position of the sorted input.

Dị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»Ḳ¤FṢŒu    Helper link. Argument: n (number)
D                                   Get digits of n.
  “©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»            The string "one two (...) eight nine AA".
                        Ḳ           Split that string at spaces.
 ị                                  Get name of each digit in the list.
                          F         Flatten to a single string.
                           Ṣ        Sort the characters.
                            Œu      Make uppercase.

มีปัญหากับรหัสของคุณ ลองผ่านสตริง"EIGHTNINE"เป็นมัน :)
Amorris

@Amorris แก้ไขแล้วเป็น 0 ไบต์
PurkkaKoodari

ฉันคิดว่ามันใช้ไม่ได้กับ "VENESGTHIEENNI"
J42161217

ฉันสอง @Jenny_mathy
Amorris

@ Jenny_mathy โปรแกรมไม่มีประสิทธิภาพและหมดเวลาและหน่วยความจำสำหรับอินพุตนาน (ฉันรู้ว่ามันแย่จริงๆ) คุณสามารถแทนที่3ด้วย2.2เพื่อใช้ขอบเขตบนขนาดเล็กซึ่งช่วยให้คุณสามารถคำนวณ 789 ได้ง่ายโดยไม่ต้องเปลี่ยนหลักการทำงาน 2จะดี แต่ก็แทบจะไม่ล้มเหลวสำหรับอินพุตบางตัวที่มีจำนวนหกแต้ม
PurkkaKoodari

2

Javascript (ES6), 221 ไบต์

s=>(m=btoa`8Ñ>Mc¾LtDáNQ!Q>HþHA7átþ4Ò`.split`+`.map(s=>RegExp(s.replace(/(.)\1*/g,c=>`(?=(.*${c[0]}){${c.length}})`))),t=0,r=0,[...s].map(c=>(t+=c,d=1,n=0,m.map((r,i)=>t.match(r)&&(d--,n=i)),d||(r=r*10+n+1,t=0))),r)

ตัวอย่างข้อมูลโค้ด:

f=

s=>(m=btoa`8Ñ>Mc¾LtDáNQ…!Q>H…þHA7átþ4Ò`.split`+`.map(s=>RegExp(s.replace(/(.)\1*/g,c=>`(?=(.*${c[0]}){${c.length}})`))),t=0,r=0,[...s].map(c=>(t+=c,d=1,n=0,m.map((r,i)=>t.match(r)&&(d--,n=i)),d||(r=r*10+n+1,t=0))),r)

console.log(f("NEO"))
console.log(f("ENOWOT"))
console.log(f("EONOTWHTERE"))
console.log(f("SNVEEGHEITNEIN"))
console.log(f("ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"))



2

เรติน่า , 88 ไบต์

[EFIST]

^(ON|NO)*
$#1$*1
O

W
2
HR|RH
3
UR|RU
4
X
6
GH|HG
8
(NN)*$
$#1$*9
r`NV|VN
7
V
5

ลองออนไลน์!

คำอธิบาย

  • ก่อนอื่นให้หยดอักขระที่ไม่จำเป็นซึ่งไม่จำเป็นสำหรับความชัดเจน
  • เลือก 1s ออกจากหน้า (สิ่งนี้จะช่วยให้เราปล่อยส่วนที่เหลือของระบบปฏิบัติการได้ทันทีหลังจากนั้นและล้างค่า Ns ก่อนที่เราจะไปที่ 5, 7, 9 ระเบียบ)
  • 2, 3, 4, 6 และ 8 ตอนนี้เป็นเรื่องเล็กน้อย
  • 9s นั้นเป็น NN สองเท่าดังนั้นจงคว้ามันไว้ก่อนที่เราจะจัดการกับ 5 และ 7
  • แทนที่ 7s จากด้านขวา (ดังนั้นเราจะไม่ลด VNV เป็น 75 แทน 57)
  • 5s คือ Vs ที่เหลือ

หากคุณเพิ่ม% (G` ลงในส่วนหัวคุณสามารถใช้รหัสเดิมและจะประเมินแต่ละบรรทัดของอินพุตแยกต่างหาก: TIO
PunPun1000

ขอบคุณ @ PunPun1000 ฉันคิดว่าต้องมีวิธีที่จะทำ แต่ยอมแพ้หลังจากไม่พบมันอย่างรวดเร็ว
Kytheron

1

PowerShellขนาด 182 ไบต์

[regex]::Replace("$args",'(?<1>[ONE]{3z2>[TWO]{3z3>[THRE]{5z4>[FOUR]{4z5>[FIVE]{4z6>[SIX]{3z7>[SVEN]{5z8>[EIGHT]{5z9>[NIE]{4})'.replace('z','})|(?<'),{$args.groups.captures[1].name})

ลองออนไลน์!

รหัสที่ไม่ได้รับการอัปโหลด แต่ไม่ทำงาน:

[System.Text.RegularExpressions.Regex]::Replace("$args",

    '(?<1>[ONE]{3})       
    |(?<2>[TWO]{3})
    |(?<3>[THRE]{5})
    |(?<4>[FOUR]{4})
    |(?<5>[FIVE]{4})
    |(?<6>[SIX]{3})
    |(?<7>[SVEN]{5})
    |(?<8>[EIGHT]{5})
    |(?<9>[NIE]{4})'

    ,{$args.groups.captures[1].name}
)

เช่น(?<3>[THRE]{5})จับคู่คลาสอักขระTHREดังนั้นจึงสามารถจับคู่ได้ตามลำดับและต้องจับคู่อักขระใด ๆ เหล่านี้ห้าครั้งติดกันและกลุ่มการจับภาพจะมีชื่อว่า '3' เพื่อจับคู่ชื่อกับตัวเลข

การบีบอัดพื้นฐานโดยการแลกเปลี่ยนข้อความซ้ำสำหรับ})|(?<z


1

C ++, 296 , 288 ไบต์

เวอร์ชั่นสั้น:

#define T string
using namespace std;T N[]={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};T Q(T S){T R="";for(int i=0;i<9;i++){do{if(S.find(N[i])!=T::npos){S.erase(S.find(N[i]),N[i].size());R+=to_string(i+1);}}while(next_permutation(N[i].begin(),N[i].end()));}return R;}

เวอร์ชันเต็ม:

#define T string
using namespace std;

T N[]={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};

T Q(T S)
{
    T R="";
    for(int i=0;i<9;i++)                             //for all possible                             
                                                     //codewords (ONE,TWO...NINE)   
    {
        do
        {   
            if(S.find(N[i])!=T::npos)                //if found in encrypted word
            {
                S.erase(S.find(N[i]),N[i].size());  //erase it from the word
                R+=to_string(i+1);                  //save integer to the result string
            }
                                                    //check next permuation of codeword  

        } while(next_permutation(N[i].begin(),N[i].end())); 
    }                                                   

    return R;
}

ลองออนไลน์!

แก้ไข:
1) 200-> 296 ไบต์สำหรับการรวมเนมสเปซและคำจำกัดความของ N ในการนับตามที่แนะนำโดย orlp 2) 296-> 288 สำหรับการใช้แมโครขอบคุณZacharý


คุณต้องรวมคำจำกัดความของNและusing namespace std;ลงในจำนวนไบต์ของคุณ
orlp

ฉันควรจะเจาะจงมากขึ้นไม่ใช่แค่รวมไว้ในการนับไบต์ของคุณ แต่รวมถึงคำตอบของคุณด้วย คำตอบของคุณจะต้องสามารถเรียกใช้เพียงแค่โทรQทันทีหลังจากนั้นโดยไม่ต้องเพิ่มส่วนอื่น ๆ
orlp

ฉันแก้ไขใหม่เพื่อรวมไว้ทั้งหมด สำหรับคำนิยามของ N ฉันไม่แน่ใจว่าตัวเอง แต่สำหรับ namespace ฉันมักจะไม่รวมมัน (ถือว่าเป็นสิ่งห้องสมุด) แม้ว่าในรหัสปัจจุบันมันเป็นสิ่งสำคัญสำหรับสตริงการทำงาน
koita_pisw_sou

1
คุณสามารถกำหนดแมโครเพื่อบันทึกสองสามไบต์ได้หรือไม่ repl.it/JY7k
Zacharý

1

Ruby, 138 114 110 ไบต์

gsub(/#{"3ONE3TWO5THRE4FOUR4FIVE3SIX5SEVN5EIGHT4NIE".gsub(/(.)(\D+)/,'([\2]{\1})|')}/){(1..9).find{|i|$~[i]}}

จำนวนไบต์ประกอบด้วย 1 ไบต์สำหรับ-pตัวเลือก

อะไร?

นี้:

/#{"3ONE3TWO5THRE4FOUR4FIVE3SIX5SEVN5EIGHT4NIE".gsub(/(.)(\D+)/,'([\2]{\1})|')}/

เป็นตัวอักษร regex ซึ่งผ่านการแก้ไขสตริงประเมินค่าไปที่:

/([ONE]{3})|([TWO]{3})|([THRE]{5})|([FOUR]{4})|([FIVE]{4})|([SIX]{3})|([SEVN]{5})|([EIGHT]{5})|([NIE]{4})|/

หากเรากำหนดให้regexกับส่วนที่เหลือของรหัสค่อนข้างง่ายที่จะเข้าใจ: แต่ละการแข่งขันในการป้อนข้อมูลจะถูกแทนที่ด้วยจำนวนของกลุ่มการจับภาพแยกออกมาจากตัวแปรเวทย์มนตร์$~ซึ่งมีข้อมูลการแข่งขันปัจจุบัน:

gsub(regex){(1..9).find{|i|$~[i]}}

ลองออนไลน์!


1

Java 8, 198 256 ไบต์

s->{String r="",x=r;for(String n:"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")){for(char c:n.toCharArray())x+="(?=.*"+c+")";x+="["+n+"]{"+n.length()+"}x";}for(int i=0,q;i<9;)for(q=(s+" ").split(x.split("x")[i++]).length-1;q-->0;)r+=i;return r;}

+58 ไบต์ .. เนื่องจาก regex ของรุ่นก่อนหน้าทำงานไม่ถูกต้อง (มันตรงกับ "EEE"; "EEN"; ฯลฯ )

คำอธิบาย:

ลองที่นี่

s->{                     // Method with String as parameter and return-type
  String r="",           //  Result-String
         x=r;            //  Regex-String
  for(String n:"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")){
                         //  Loop (1) from "ONE" through "NINE":
    for(char c:n.toCharArray())
                         //   Inner loop (2) over the characters of this String
      x+="(?=.*"+c+")";  //    Append regex-group `(?=\w*c)` where `c` is the capital character
                         //   End of inner loop (2) (implicit / single-line body)
    x+="["+n+"]{"+n.length()+"}x";
                         //   Append regex part `[s]{n}` where `s` is the String, and `n` is the length
  }                      //  End of loop (1)
  // The regex now looks like this, which we can split on "x":
  // (?=.*O)(?=.*N)(?=.*E)[ONE]{3}x(?=.*T)(?=.*W)(?=.*O)[TWO]{3}x(?=.*T)(?=.*H)(?=.*R)(?=.*E)(?=.*E)[THREE]{5}x(?=.*F)(?=.*O)(?=.*U)(?=.*R)[FOUR]{4}x(?=.*F)(?=.*I)(?=.*V)(?=.*E)[FIVE]{4}x(?=.*S)(?=.*I)(?=.*X)[SIX]{3}x(?=.*S)(?=.*E)(?=.*V)(?=.*E)(?=.*N)[SEVEN]{5}x(?=.*E)(?=.*I)(?=.*G)(?=.*H)(?=.*T)[EIGHT]{5}x(?=.*N)(?=.*I)(?=.*N)(?=.*E)[NINE]{4}x
  for(int i=0,q;i<9;)    //  Loop (3) from 0 through 9 (exclusive)
    for(q=(s+" ").split(x.split("x")[i++]).length-1;
                         //   Split the input on the current regex-part,
                         //   and save the length - 1 in `q`
        q-->0;           //   Inner loop (4) over `q`
      r+=i               //    And append the result-String with the current index (+1)
    );                   //   End of inner loop (4)
                         //  End of loop (3) (implicit / single-line body)
  return r;              //  Return the result-String
}                        // End of method

1
เอ่อ ... ผลที่ผิดสำหรับ"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN":(
Olivier Grégoire

ใช่นั่นเป็นสิ่งเดียวที่ทำให้ฉันไม่สามารถ +1 สิ่งนี้! ทางออกของฉันคือ 240 ไบต์ ... ก่อนที่คุณจะเอาชนะฉัน
Olivier Grégoire

@ OlivierGrégoireรู้สึกอิสระที่จะโพสต์โซลูชั่น 240 byte ของคุณเพราะฉันไม่สามารถหาวิธีการแก้ปัญหา .. ข้อเสีย[ONE]{3}คือมันตรงEENกับตอนท้ายของกรณีทดสอบกับส่วนของ EIGHT และ NINE .. และฉันสงสัยว่ามี regex เพื่อให้ตรงกับสิ่งเหล่านี้: ENO|EON|NEO|NOE|OEN|ONEโดยไม่ได้จับคู่EEE;EEN;EEO;...สำหรับทุกตัวเลขที่สั้นกว่า 40 ไบต์ .. บางทีฉันอาจจะสามารถทำสิ่งที่ใช้substringและย้อนกลับการตรวจสอบตัวเลข แต่ฉันไม่ได้มีเวลาที่จะคิดออกตอนนี้ ..
Kevin Cruijssen

@ OlivierGrégoireหากคุณยังมีคำตอบ 240 ไบต์คุณสามารถโพสต์ได้ เพียงแค่มาข้ามความท้าทายนี้อีกครั้งและคงคำตอบของฉันโดยการ regex ใหม่สำหรับ 58 ไบต์ ..
เควิน Cruijssen

1
ดูเหมือนว่าฉันจะพบวิธีที่สั้นกว่าในขณะที่ทำสิ่งที่ท้าทายนี้ซ้ำ: p
Olivier Grégoire

1

Java (OpenJDK 8) , 181 ไบต์

s->{String x="",r;for(int i=0,l;i<9;)for(r="ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".split(",")[i++],l=r.length();s.matches("["+r+"]{"+l+"}.*");s=s.substring(l))x+=i;return x;}

ลองออนไลน์!

ฉันเอาเสรีภาพที่จะนำมาใช้ใหม่เควิน Cruyssen ของ TIO แม่แบบ หวังว่าคุณจะไม่รังเกียจ;)


อาไม่เป็นไรความคิดเห็นก่อนหน้าของฉัน .. คุณสร้าง regex แทนที่จะวนซ้ำ regex s.substringยังคงฉันได้ใกล้เคียงกับคำตอบแรกของฉันถ้าเพียงฉันได้ใช้ ส่วนที่แย่ที่สุดคือฉันกำลังใช้s.substringในคำตอบปัจจุบันของฉันฮ่า ๆ .. เอาละ +1 จากฉัน ดีใจที่มันเกือบสุดสัปดาห์ ..
Kevin Cruijssen

1

05AB1E , 36 31 ไบต์

‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#vyœN>UvyX:

ลองออนไลน์!


ดูว่ารันด้วยการดีบัก: TIO ด้วย Debug

‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# | Push ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
vyœ                   | For each list of permutations of that word...
   N>U                | Push index + 1 into register X.          
      vyX:            | Replace each permutation with X.

ฉันแค่แนะนำให้คุณมีเครื่องหมายสีเขียวมากกว่าฉันและฉันสังเกตเห็นข้อผิดพลาด: FURONESEVส่งคืนFUR1SEV:(
Jonathan Allan

1

Perl 5 , 102 + 1 (-n) = 103 ไบต์

for$i(map{"[$_]{".length.'}'}ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE){$,++;print$,while(s/^$i//)}

ลองออนไลน์!


ดี! คู่ของเทคนิคที่ช่วยเหลือ: map{...}มักจะสามารถแทนที่ด้วยmap...,, lengthและy///cมักจะใช้แทนกันเกินไป (ไม่เคยมีขนาดเล็กเมื่อไม่ได้ทำงานกับ$_แต่!), แทนwhile, ++$,x s/^$i//สั้นและถ้าคุณเปลี่ยน-nไป-pคุณสามารถผนวกกับ `$ \` แทน ของการโทรprint! ลองออนไลน์!
Dom Hastings

นอกจากนี้ฉันหวังว่าคุณจะไม่รังเกียจที่จะโพสต์คำแนะนำใด ๆ หากคุณต้องการฉันจะละเว้น :)
Dom Hastings

0

Python 3 , 238 236 ไบต์

def f(s):
 e=''
 while len(s):
  for i in range(9):
   for r in[''.join(p)for p in permutations('ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()[i])]: 
    if s[:len(r)]==r:e+=str(i+1);s=s[len(r):]
 return e
from itertools import*

ลองออนไลน์!


วิธีการแก้ปัญหาแบบเดรัจฉานไม่ใช้ประโยชน์จากการลดลงของตัวเลข


ขอบคุณ @Mr Xcoder สำหรับบันทึก 2 ไบต์!


คุณต้องรวมdef f(s):จำนวนไบต์ของคุณนี่ไม่ใช่ฟังก์ชั่นแบบไม่ระบุชื่อ
Mr. Xcoder

นอกจากนี้คุณสามารถแทนที่while len(s)>0ด้วยwhile len(s)
Mr. Xcoder

@ Mr.Xcoder ขอบคุณสำหรับการชี้แจง
Chase Vogeli

คุณสามารถย้ายการประกาศของeลงในส่วนหัวของฟังก์ชั่นสำหรับ -1 ไบต์ นอกจากนี้execและความเข้าใจในรายการอาจช่วยประหยัดไบต์บนการเยื้อง
CalculatorFeline

0

PHP, 141 ไบต์

for($a=count_chars($argn);$c=ord($s[++$p]?:$s=[OWU,W,HG,U,FU,X,SX,G,N17.$p=0][$i-print str_repeat($i++,$x)]);)$x=$a[$i+48]+=($p?-1:1)*$a[$c];

รุ่นที่เก่ากว่า151 ไบต์ :

for($a=count_chars($argn,1);$s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++];print str_repeat($i,$a[$i+48]))for($p=0;$c=ord($s[$p]);)$a[$i+48]+=($p++?-1:1)*$a[$c];

วนตัวเลขจาก 1 ถึง 9 นับอักขระที่ไม่ซ้ำกันในคำและลบจำนวนอักขระที่ไม่ซ้ำกัน ´ออกพิมพ์ตัวเลขในระหว่างการเดินทาง
แม้ว่ามันจะถูกพิมพ์ในระหว่างการเดินทางจำนวนหลักจะต้องเก็บไว้เพื่อให้9กรณีและปัญหาทำงาน

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

มันจะประหยัดอีก 4 ไบต์ในการจัดเก็บจำนวนหลัก$a[$i]แทน$a[$i+48]และใช้ ASCII 1และ7(ในเครื่องหมายคำพูด) แทนตัวอักษรหลักเอง

ทำให้พังถล่ม

for(
    $a=count_chars($argn,1);                # count character occurences in input
    $s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++];   # loop through digit names
    print str_repeat($i,$a[$i+48])              # print digit repeatedly
)
    for($p=0;$c=ord($s[$p]);)                   # loop through name
        $a[$i+48]+=                                 # add to digit count
        ($p++?-1:1)*                                # (add first, subtract other)
        $a[$c];                                     # character occurences

ONEไม่ใช่คำที่มีเพียงคำเดียวOดังนั้นจึงต้องลบจำนวนสำหรับW(ปรากฏในTWO) และU(ปรากฏเฉพาะในFOUR) และอื่น ๆ
NINEเป็นพิเศษเพราะไม่มีวิธีที่จะลบเพียงแค่ถ้าฉันใช้ตัวอักษร (ที่จะต้องใช้I-X-G-F+UหรือN-O-S+W+U+X) ดังนั้นฉันใช้จำนวนหลักแทน

PHP, 160 ไบต์

$a=count_chars($argn);foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s)for(${$s[$p=1]}+=$n=$a[ord($s)];$c=ord($s[++$p]);)$a[$c]-=$n;while($$i--?print$i:$i++<9);

ถือว่าอินพุตตัวพิมพ์ใหญ่ทั้งหมด ตัวอักษรอาจมีสัญญาณรบกวนตลอด
ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

คำอธิบาย

วนซ้ำตามคำต่าง ๆ เพื่อนับจำนวนอักขระที่ไม่ซ้ำกันของพวกเขา in ในอินพุตและในกระบวนการลดจำนวนตัวอักษรอื่น ๆ "ตัวละครอื่น ๆ " อาจหมายถึงตัวละครอื่น ๆ ทั้งหมดในคำว่า; แต่เมื่อพิจารณาถึงสิ่งที่จำเป็นต้องมีการบันทึกไว้ในภายหลัง 19 ไบต์

การแปลงstr_repeatลูปเป็นลูปแบบรวมได้บันทึก 5 ไบต์

และการใช้ตัวแปรตัวแปรสำหรับจำนวนหลักที่บันทึกไว้อีก 8

ทำให้พังถล่ม

$a=count_chars($argn);                              # count character occurences in input
foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s)   # loop through digit names
    for(${$s[$p=1]}+=                                   # 2. add to digits count
        $n=$a[ord($s)];                                 # 1. get count of unique character
        $c=ord($s[++$p]);)                              # 3. loop through other characters
        $a[$c]-=$n;                                         # reduce character count
while(
    $$i--?print$i                                       # print digit repeatedly
    :$i++<9);                                       # loop through digits
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.