কথ্য কথায় টেলিফোন নম্বর


33

লক্ষ্য

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা সংখ্যার টেলিফোন নম্বরটিকে পাঠ্যে অনুবাদ করে যা এটি বলা সহজ করে তোলে। অঙ্কগুলি পুনরাবৃত্তি করা হয়, সেগুলি "ডাবল এন" বা "ট্রিপল এন" হিসাবে পড়া উচিত।

আবশ্যকতা

ইনপুট

অঙ্কের একটি স্ট্রিং।

  • ধরুন সমস্ত অক্ষর 0 থেকে 9 এর সংখ্যা are
  • ধরুন স্ট্রিংয়ে কমপক্ষে একটি অক্ষর রয়েছে।

আউটপুট

শব্দগুলি স্পেস দ্বারা বিভাজিত, কীভাবে এই অঙ্কগুলি উচ্চস্বরে পড়তে পারে of

  • শব্দগুলিতে অঙ্কগুলি অনুবাদ করুন:

    0 "ওহ"
    1 "এক"
    2 "দুই"
    3 "তিন"
    4 "চার"
    5 "পাঁচ"
    6 "ছয়"
    7 "সাত"
    8 "আট"
    9 "নয়"

  • একই অঙ্কটি পরপর দু'বার পুনরাবৃত্তি করা হলে "ডাবল সংখ্যা " লিখুন ।

  • যখন একই অঙ্কটি পরপর তিনবার পুনরাবৃত্তি করা হয়, তখন "ট্রিপল নম্বর " লিখুন ।
  • যখন একই অঙ্কটি চার বা ততোধিক বার পুনরাবৃত্তি হয়, প্রথম দুটি অঙ্কের জন্য "ডাবল সংখ্যা " লিখুন এবং বাকী স্ট্রিংটি মূল্যায়ন করুন।
  • প্রতিটি শব্দের মধ্যে ঠিক একটি স্থানের অক্ষর রয়েছে। একটি একক শীর্ষস্থানীয় বা পিছনে স্থান গ্রহণযোগ্য।
  • আউটপুট কেস সংবেদনশীল নয়।

স্কোরিং

সর্বনিম্ন বাইট সহ উত্স কোড।

পরীক্ষার মামলা

input        output
-------------------
0123         oh one two three
4554554      four double five four double five four
000          triple oh
00000        double oh triple oh
66667888     double six double six seven triple eight
19999999179  one double nine double nine triple nine one seven nine

38
"স্পিচ গল্ফ" এর প্রতি আগ্রহী যে কেউ অবশ্যই "ছয় ছয়" বলার জন্য "ডাবল সিক্স" বেশি সময় নেয় তা নোট করা উচিত। এখানে সমস্ত সংখ্যাগত সম্ভাবনার মধ্যে কেবলমাত্র "ট্রিপল সেভেন" সিলেবলগুলি সংরক্ষণ করে।
বেগুনি পি

13
@ পুরল পি: এবং আমি নিশ্চিত যে আপনি জানেন, 'ডাবল-ইউ ডাবল-ইউ ডাবল-ইউ'> 'ওয়ার্ল্ড ওয়াইড ওয়েব' ..
চ্যাস ব্রাউন

11
আমি সেই চিঠিটি "ডাব" এ পরিবর্তন করতে ভোট দিয়েছি।
হ্যান্ড-ই-ফুড

8
আমি জানি এটি কেবল একটি বৌদ্ধিক অনুশীলন, তবে আমার সামনে 0800 048 1000 নাম্বার সহ একটি গ্যাস বিল রয়েছে এবং আমি এটি "ওহ আটশ ওহ চার আট এক হাজার" হিসাবে পড়তে চাই। অঙ্কগুলির গোষ্ঠীকরণ মানব পাঠকদের জন্য গুরুত্বপূর্ণ এবং "0800" এর মতো কিছু নিদর্শন বিশেষভাবে বিবেচনা করা হয় treated
মাইকেল কে

3
@ পুরপ্লেপ স্পিচ স্পষ্ট করতে আগ্রহী যে কেউ , তবে, বিশেষ করে ফোনে কথা বলার সময়, "ডাবল 6" ব্যবহার করতে চাইতে পারেন কারণ স্পষ্ট করে স্পিকারটির অর্থ দুটি ছক্কা এবং ঘটনাক্রমে number নম্বরটি পুনরাবৃত্তি করা হয়নি। লোকেরা রোবট নয়: পি
ক্ষমা চেয়ে নিন এবং মনিকে পুনরায় প্রতিষ্ঠা করুন

উত্তর:


10

05AB1E , 53 52 51 50 49 বাইট

γε€T2äθ¬MÊi¨₃1ǝR]˜“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‹¶½¿“#s踻

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

γ                      # split input in groups of consecutive equal digits
 ε              ]      # for each group
  €T                   #  add a 10 before each digit (66 -> [10, 6, 10, 6])
    2äθ                #  keep only the second half of that list
       ¬MÊi     ]      #  if the first element is not the maximum
           ¨           #   drop the last element
            ₃1ǝ        #   replace the second element with 95
               R       #   reverse the list
˜                      # flatten
 “...“                 # compressed string: "oh one two ... nine double triple"
      #                # split on spaces
       sè              # index (wraps around, so 95 yields "triple")
         ¸»            # join with spaces

1
ওহ, Mস্ট্যাকের সর্বাধিক পূর্ণসংখ্যা নির্ধারণের সময় তালিকার ভিতরেও নজর রাখে? তা জানতেন না। মনে আছে কিছু মনে হচ্ছে। :)
কেভিন ক্রুইজসেন

16

8088 বিধানসভা, আইবিএম পিসি ডস, 164 159 156 155 বাইট

বাইনারি:

00000000: d1ee 8a0c 03f1 53fd ac3a d075 0343 e2f7  ......S..:.u.C..
00000010: 85db 741c 5f8a d043 f6c3 0174 0a57 bd64  ..t._..C...t.W.d
00000020: 0155 83eb 0374 0957 bd5d 0155 4b4b 75f7  .U...t.W.].UKKu.
00000030: 8ad0 2c2f 7213 518a f0b0 24b1 31bf 6a01  ..,/r.Q...$.1.j.
00000040: fcf2 aefe ce75 fa59 57e2 bc5a 85d2 740c  .....u.YW..Z..t.
00000050: b409 cd21 b220 b402 cd21 ebef c364 6f75  ...!. ...!...dou
00000060: 626c 6524 7472 6970 6c65 246f 6824 6f6e  ble$triple$oh$on
00000070: 6524 7477 6f24 7468 7265 6524 666f 7572  e$two$three$four
00000080: 2466 6976 6524 7369 7824 7365 7665 6e24  $five$six$seven$
00000090: 6569 6768 7424 6e69 6e65 24              eight$nine$

উপর xxd -rথেকে ব্যবহার করে নির্বাহযোগ্য তৈরি করুন এবং পরীক্ষা করুন বা PHONE.COM ডাউনলোড করুন

অ-জমায়েত তালিকা:

D1 EE       SHR  SI, 1              ; point SI to DOS PSP (80H) for input string
8A 0C       MOV  CL, BYTE PTR[SI]   ; load input string length into CX
03 F1       ADD  SI, CX             ; move SI to end of input 
53          PUSH BX                 ; push a 0 to signal end of output stack 
        CHAR_LOOP:
FD          STD                     ; set LODS direction to reverse 
AC          LODSB                   ; load next char from [SI] into AL, advance SI 
3A D0       CMP  DL, AL             ; is it same as previous char? 
75 03       JNZ  NEW_CHAR           ; if not, it's a different char 
43          INC  BX                 ; otherwise it's a run, so increment run length
E2 F7       LOOP CHAR_LOOP          ; move on to next char 
        NEW_CHAR: 
85 DB       TEST BX, BX             ; is there a run greater than 0? 
74 1C       JZ   GET_WORD           ; if not, look up digit name 
5F          POP  DI                 ; get name for the current digit 
8A D0       MOV  DL, AL             ; save current char in DL 
43          INC  BX                 ; adjust run count (BX=1 means run of 2, etc)
F6 C3 01    TEST BL, 1              ; is odd? if so, it's a triple
74 0A       JZ   IS_DBL             ; is even, so is a double 
57          PUSH DI                 ; push number string ("one", etc) to stack
BD 0164     MOV  BP, OFFSET T       ; load "triple" string 
55          PUSH BP                 ; push to stack 
83 EB 03    SUB  BX, 3              ; decrement run count by 3 
74 09       JZ   GET_WORD           ; if end of run, move to next input char 
        IS_DBL: 
57          PUSH DI                 ; push number string to stack
BD 015D     MOV  BP, OFFSET D       ; load "double" string 
55          PUSH BP                 ; push to stack 
4B          DEC  BX                 ; decrement by 2
4B          DEC  BX
75 F7       JNZ  IS_DBL             ; if not end of run, loop double again 
        GET_WORD: 
8A D0       MOV  DL, AL             ; save current char into DL
2C 2F       SUB  AL, '0'-1          ; convert ASCII char to 1-based index 
72 13       JB   NOT_FOUND          ; if not a valid char, move to next
51          PUSH CX                 ; save outer loop counter 
8A F0       MOV  DH, AL             ; DH is the index to find, use as scan loop counter
B0 24       MOV  AL, '$'            ; word string is $ delimited
B1 31       MOV  CL, 031H           ; search through length of word data (49 bytes)
BF 016A     MOV  DI, OFFSET W       ; reset word data pointer to beginning
FC          CLD                     ; set DF to scan forward for SCAS 
        SCAN_LOOP: 
F2/ AE      REPNZ SCASB             ; search until delimiter '$' is found in [DI]
FE CE       DEC  DH                 ; delimiter found, decrement counter 
75 FA       JNZ  SCAN_LOOP          ; if counter reached 0, index has been found 
59          POP  CX                 ; restore outer loop position
57          PUSH DI                 ; push string on stack 
        NOT_FOUND:
E2 BC       LOOP CHAR_LOOP          ; move to next char in input 
        OUTPUT_STACK: 
5A          POP  DX                 ; get string from top of stack 
85 D2       TEST DX, DX             ; it is the last? 
74 0C       JZ   EXIT               ; if so, exit 
B4 09       MOV  AH, 09H            ; DOS display string function 
CD 21       INT  21H                ; write string to console 
B2 20       MOV  DL, ' '            ; load space delimiter 
B4 02       MOV  AH, 02H            ; DOS display char function 
CD 21       INT  21H                ; write char to console 
EB EF       JMP  OUTPUT_STACK       ; continue looping 
        EXIT: 
C3          RET                     ; return to DOS 

D   DB "double$" 
T   DB "triple"
W   DB "$oh$","one$","two$","three$","four$","five$","six$","seven$","eight$","nine$" 

টি এল; ডিআর:

ট্রিপল খুঁজে পাওয়া সহজ করার জন্য ইনপুট স্ট্রিংটি ডান থেকে বামে পড়ে is আউটপুটটি x86 স্ট্যাকের দিকে ঠেলাঠেলি করা হয়ডিসপ্লে ক্রমটি বিপরীতমুখী করার জন্য নামটি আগে "ডাবল" এবং "ট্রিপল" শব্দের পুনর্বিন্যাসের সুবিধার্থে।

পরবর্তী অঙ্কটি যদি শেষের চেয়ে আলাদা হয় তবে শব্দের তালিকায় নামটি সন্ধান করা হবে এবং স্ট্যাকের দিকে ঠেলে দেওয়া হবে। যেহেতু মেশিন কোডে "ভেরিয়েবল-দৈর্ঘ্যের স্ট্রিংগুলির ইনডেক্সড অ্যারে" সম্পর্কিত কোনও আনুষ্ঠানিক ধারণা নেই, তাই শব্দটির তালিকাটি সংশ্লিষ্ট শব্দটি খুঁজে পেতে iস্ট্রিং ডিলিমিটারের জন্য (শব্দের সূচক) সংখ্যাটি বার স্ক্যান করা হয় $। সহায়কভাবে, x86 এর সংক্ষিপ্ত নির্দেশাবলীর একটি জুড়ি রয়েছে ( REPNZ SCASBযা এর মতোmemchr() সি এর ) এটি সহজ করে তোলে (ধন্যবাদ সিআইএসসি !)।

যদি অঙ্কটি পূর্বেরটির মতো হয় তবে "রান" দৈর্ঘ্যের জন্য কাউন্টার বাড়ানো হয় এবং ইনপুটটিতে বাম দিকে লুপিং চালিয়ে যায়। একবার রান শেষ হয়ে গেলে অঙ্কটির নামটি স্ট্যাক থেকে নেওয়া হয় কারণ এটি প্রতিটি গ্রুপিংয়ের জন্য "ডাবল" বা "ট্রিপল" এর পরে রাখা দরকার। যদি রানের দৈর্ঘ্য বিজোড় হয় (এবং রান দৈর্ঘ্য হয়)> 1 ), "ট্রিপল" স্ট্রিংয়ের পরে অঙ্কের নামটি স্ট্যাকের দিকে ঠেলে দেওয়া হয় এবং রান দৈর্ঘ্য 3 দ্বারা হ্রাস করা হয়, যেহেতু রান দৈর্ঘ্য এখন সমান হবে, পদক্ষেপ রান দৈর্ঘ্য 0 না হওয়া পর্যন্ত "ডাবল" এর জন্য পুনরাবৃত্তি করা হয়।

যখন ইনপুট স্ট্রিংটি শেষে পৌঁছেছে, তখন স্ট্রাকটি বিপরীত ক্রমে স্ক্রিনে লেখা প্রতিটি সেভ স্ট্রিংয়ের সাথে ফেলে দেওয়া হয়।

ইনপুট / আউটপুট:

স্বতন্ত্র পিসি ডস এক্সিকিউটেবল, কমানস লাইন আউটপুট থেকে কনসোল ইনপুট।

এখানে চিত্র বর্ণনা লিখুন

PHONE.COM ডাউনলোড এবং পরীক্ষা করুন


repne scasbহয় memchr(বা strchrযদি আপনি জানেন যে হিট হতে চলেছে), না strstr
পিটার কর্ডস

প্রক্রিয়া প্রবেশের সিএইচ = 0 কি কোনও মানক দ্বারা গ্যারান্টিযুক্ত, বা এটিই কিছু ডস সংস্করণটি ঘটবে? আমি আপনাকে লক্ষ্য করেছি যে mov cl, byte[si] এটি সমান movzx cx, byte [si]। আমি ভাবছি যদি কোনও আলাদা রেগ ব্যবহার করা হয়, যেমন AH, গণনার জন্য dec ah / jnzপরিবর্তে loopসিএক্সকে চাপ / পপ না করা থেকে কোনও কিছু রক্ষা করতে পারে। সম্ভবত না, এবং আপনার কাছে কোনও 16-বিট রেগ নেই যা 1 বাইটের অনুমতি দেবে dec
পিটার কর্ডেস

1
@ পিটারকর্ডস, CH=0আমি fysnet.net/yourhelp.htm দ্বারা যাচ্ছি , যা ডসের কোনও যুক্তিসঙ্গত মুক্তির জন্য সর্বদা শূন্য, একই রকম BX। শূন্য- প্রসার সম্পর্কে ভাল চিন্তাভাবনা mov, যদিও প্রযুক্তিগতভাবে আমি মনে করি না যে movzx808x (লক্ষ্য প্ল্যাটফর্মটিকে আইবিএম পিসি 5150 এবং সব কিছু রেখে) পাওয়া যায়। বাইটগুলি বাঁচাতে আমি যতটা ভাল রেজিস্ট্রি দিয়েছিলাম তার সাথে আমার চারপাশে ঝাঁপিয়ে পড়েছিল, তবে আপনি যদি কিছু দেখেন তবে আমি সম্ভবত মিস করি, দয়া করে আমাকে জানান!
640 কেবি

1
এটি memchrআইএমও বলা আরও সঠিক । "স্ট্রিং ইন্সট্রাকশন" নামকরণ লোকেরা ভেবে ভ্রান্ত করে যে তারা অন্তর্নিহিত দৈর্ঘ্যের সি স্ট্রিংগুলিতে কাজ করে তবে সত্যই তারা স্পষ্ট দৈর্ঘ্যের স্ট্রিংয়ের মতো std::stringবা বাফারগুলিতে কাজ করে। লাইক memcpy, memset(মুভিস / স্টোস), memchr/ memrchr(ডিএফ = 0 বা 1 দিয়ে memcmpস্ক্যান পুনরায় তৈরি করুন) এবং (সিএমপিগুলি পুনরায় করুন)। শুধু সি সমতুল্য repe scasহয় strspn, কারণ আমি একটা মনে করি না memযে জন্য ফাংশন। এমনকি আপনি বর্ণনা করতে পারেন stoswবা stosdযেমন wmemsetউদাহরণস্বরূপ।
পিটার কর্ডেস

1
movzxঅতিরিক্ত অপকোড বাইটের ব্যয় হয় এবং হ্যাঁ এটি কেবল 386 এর সাথেই চালু হয়েছিল you're আপনি লো-বাইট-মার্জ করছেন এবং সঠিকভাবে শূন্য প্রসারিত ধরে নিয়েছেন তা বর্ণনা করার জন্য এটি টাইপ করা সহজ। আপনি যদি সিক্স বা কমপক্ষে সিএইচ = 0 জানেন তবে গল্ফ করার জন্য হ্যাঁ সর্বদা movসিএল এর সাথে যান। কিন্তু golfing বাইরে x86 প্রদত্ত যান থেকে বাইট-লোড নির্দেশাবলী movzxএবং movsxতারা কোনো মিথ্যা নির্ভরতা বা অন্যান্য অর্ধ-রেজিস্টার দূর্ভাগ্য এড়ানো। একটি ডওয়ার্ড গন্তব্য সহ আধুনিক সিপিইউগুলিতে তারা ডাউড mov লোডের চেয়ে তত দ্রুত ।
পিটার কর্ডস

9

05 এ বি 1 ই , 61 56 53 52 51 বাইট

γvyDg;LàäRv… ‹¶½¿#yg蓊瀵‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#yè])áðý

-9 বাইটস @ গ্রিমিকে ধন্যবাদ ।

এটি অনলাইন বা চেষ্টা করে দেখুন সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

γ               # Split the (implicit) input into substrings of equal adjacent characters
                #  i.e. "199999991779" → ["1","9999999","1","77","9"]
 v              # Loop over each substring `y`:
   Dg           #  Get the length of a copy of the substring
     ;          #  Halve it
      L         #  Create a list in the range [1, length/2], where odd lengths are
                #  automatically truncated/floored
                #   i.e. "1" (length=1) → 0.5 → [1,0]
                #   i.e. "9999999" (length=7) → 3.5 → [1,2,3]
       à        #  Pop and push the maximum of this list
  y     ä       #  Divide the string into that many parts
                #   → ["1"]
                #   → ["999","99","99"]
         R      #  Reverse the list
                #   → ["99","99","999"]
  v             # Inner loop over each item `y`:
    ‹¶½¿       #  Push dictionary word: "  double triple"
         #      #  Split it on spaces: ["","","double","triple"]
          yg    #  Get the length of the current item `y`
            è   #  And use it to (0-based) index into the list
   “Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
                #  Push dictionary string "oh two three four five six seven eight nine"
     #          #  Split it on spaces: ["oh","two","three",...,"nine"]
      yè        #  Use `y` to index into the string-list (with automatic wrap-around,
                #  so since there are 10 words, it basically indexes with a single digit
                #  due to an implicit modulo-10)
                #   i.e. "77" → "seven"
 ]              # Close both loops
  )             # Wrap all values on the stack into a list
   á            # Only keep letters, which removes the empty strings from the list
    ðý          # And join the list on spaces
                # (after which the result is output implicitly)

আমার এই 05AB1E টিপটি দেখুন (বিভাগটি কীভাবে ব্যবহার করবেন? ) কেন বুঝতে … ‹¶½¿হয় " double triple"এবং “Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“হয় "oh two three four five six seven eight nine"


1
@ গ্রিমি আহ, অবশ্যই .. if(length>=4)বাকিটা যোগ করার আগে আমি এটি যোগ করেছি , তবে অবশ্যই আকারের পূর্ণসংখ্যার জন্য এটি প্রয়োজনীয় নয় 1,2,3, কারণ ;Å2¨3ª£স্ট্রিংগুলি অক্ষত থাকবে (কেবলমাত্র মানচিত্রের পরে আমরা একটি তালিকাতে আবৃত করে থাকি) list দেখার জন্য ধন্যবাদ! এবং আপনার উত্তরটি দেখতে অপেক্ষায় রইলাম Åγ। আমি সত্যিই অনুভূতি ছিল প্রথম অংশ একরকম অনেক ছোট করা যেতে পারে।
কেভিন ক্রুইজসেন

1
Dg;LàäRএটি এখনও একটি বাইটের চেয়ে ছোট āɨšJõKএবং আপনার মূলত যা ছিল তার চেয়ে অনেক বেশি অনুরূপ।
গ্রিমি

1
@ গ্রিমি আহ, আমার শুরুতে যা ছিল তা বন্ধ হয়ে গেছে, আমি এটি পছন্দ করি। :) আবার ধন্যবাদ!
কেভিন ক্রুইজসেন

1
@ গ্রিমি নিজে আরও একটি গল্ফ খুঁজে পেতে সক্ষম হয়েছিলেন যা আমি ভুলে গিয়েছিলাম .. শেষে না áinstead õK:)
কেভিন ক্রুইজসেন

1
ভাল লাগছে á! এখানে একটি 51 এবং অন্য একটি । 50 সম্ভব মনে হয়।
গ্রিমি

7

কোয়াডআর , 137 বাইট এসবিসিএস

শীর্ষস্থানীয় স্থানের সাথে শিরোনামের কেস।

∊¯2↑¨@(∊∘⎕A)⍵
(.)\1*
{⍺←(,¨⎕D)⎕R('OhOneTwoThreeFourFiveSixSevenEightNine'(∊⊂⊣)⎕A)⋄' 'w←⍺,⊃⍵:⍬⋄1=≢⍵:⍺⍵⋄3=≢⍵:'Triple',w'Double',w,∇2↓⍵}⍵M

এটি অনলাইন চেষ্টা করুন!

ε nlist (চেপ্টা)
¯2↑¨ গত দুই অক্ষর নেওয়া প্রতিটি অক্ষরের (একটি স্পেস দিয়ে বাঁদিকে প্যাডিং)
@ অবস্থানের যেখানে এ
(∊∘⎕A) অক্ষর বড়হাতের সদস্য একটি lphabet
 PCRE নিচে প্রতিস্থাপন অপারেশন ফলাফলে ...

(.) যে কোনও চরিত্র
\1 নিজেই অনুসরণ করে
*  শূন্য বা তার বেশি বার , তার ফলাফলের পরিবর্তে প্রতিস্থাপন করা হয়…

{…}⍵M "dfn"; হয় এম উপরে প্যাটার্ন atch

('OhOneTwoThreeFourFiveSixSevenEightNine'()⎕A) লম্বা স্ট্রিং এবং বড় হাতের দিয়ে নিম্নলিখিত বেনামী ট্যাসিট ফাংশনটি প্রয়োগ করুন বাম আর্গুমেন্ট হিসাবে :

 সদস্যতা (বড় হাতের অক্ষরে দীর্ঘ পংক্তিতে বর্ণের)

 পার্টিশন (যখনই সদস্য হয় নতুন পার্টিশন দিয়ে with

 বাম আর্গুমেন্ট (যেমন দীর্ঘ স্ট্রিং)

()⎕R পিসিআর আর এই শব্দগুলির সাহায্যে নিম্নলিখিত নিদর্শনগুলিকে স্থান দেয়:

⎕D অঙ্ক 0 থেকে 9

 প্রতিটি পৃথক নিদর্শন হিসাবে আচরণ করুন

⍺← এই প্রতিস্থাপন ফাংশনটি ( একটি বর্ণমালার জন্য) বরাদ্দ করুন

তারপর,

⊃⍵ ম্যাচের প্রথম চরিত্র

, একটি স্ট্রিং হিসাবে

এটি  প্রয়োগ করুন

w← এটিকে w( শব্দের জন্য ) বরাদ্দ করুন

' '∊: স্থান যদি এর সদস্য হয় (যেমন ম্যাচটি খালি ছিল):

 কিছুই ফেরত না (খালি স্ট্রিং হয়ে)

 অন্য

1=≢⍵: যদি কোনও ম্যাচের অক্ষরের তালিকার সমান হয় (যেমন এর দৈর্ঘ্য):

⍺⍵ বর্ণটি বর্ণমালা করুন

 অন্য

3=≢⍵: তিনটি যদি ম্যাচের অক্ষরের তালিকার সমান হয় (যেমন এর দৈর্ঘ্য):

'Triple',w শুরুতে যোগ করতে "ট্রিপল" W Ord

 অন্য

2↓⍵ ম্যাচ থেকে অঙ্কগুলিতে নামান

 তার উপর পুনরাবৃত্তি

w, শব্দটি প্রচার করুন

'Double', "ডাবল" প্রিপেন্ড করুন


6

জাভাস্ক্রিপ্ট (ES6),  161 160 152  144 বাইট

আউটপুট একটি একক নেতৃস্থানীয় স্থান অন্তর্ভুক্ত।

s=>[n=>' '+'oh/one/two/three/four/five/six/seven/eight/nine'.split`/`[n],'$1 double$2','triple$2'].map(r=>s=s.replace(/(\S*)( \S+)\2|\d/g,r))&&s

এটি অনলাইন চেষ্টা করুন!

অথবা ফর্ম্যাট করা উত্স কোডটি দেখুন

কিভাবে?

রূপান্তরটি তিনটি ধাপে প্রক্রিয়াজাত করা হয়:

  1. স্পেসের পূর্বে প্রতিটি ইংরেজী শব্দের সাথে সংশ্লিষ্ট ইংরেজি শব্দের সাথে প্রতিস্থাপন করুন
  2. "X X"সঙ্গে প্রতিটি প্যাটার্ন প্রতিস্থাপন"double X"
  3. "double X X"সঙ্গে প্রতিটি প্যাটার্ন প্রতিস্থাপন"triple X"

বাইটগুলি সংরক্ষণ করতে, আমরা সমস্ত পদক্ষেপের জন্য একই নিয়মিত প্রকাশটি ব্যবহার করি:

/(\S*)( \S+)\2|\d/g

যা নিম্নলিখিত হিসাবে কাজ করে:

(\S*)  -> 1st capturing group: any word, or nothing at all
( \S+) -> 2nd capturing group: a space, followed by a word
\2     -> a copy of the 2nd capturing group
|\d    -> or try to capture a digit instead (for step 1)

পদক্ষেপ 1 এ, আমরা একটি কলব্যাক ফাংশন ব্যবহার করি যা একটি অনুসন্ধান সারণী থেকে সঠিক শব্দটি তুলে দেয়:

  • "799999"" seven nine nine nine nine nine"

পদক্ষেপ 2 এ, আমরা এর সাথে প্রতিস্থাপন করব "$1 double$2":

  • " (seven)( nine)( nine)"" seven double nine"
  • "( nine)( nine) nine"" double nine nine"

পদক্ষেপ 3 এ, আমরা এর সাথে প্রতিস্থাপন করব "triple$2":

  • " (double)( nine)( nine)"" triple nine"

4

ওল্ফ্রাম ল্যাঙ্গুয়েজ (ম্যাথমেটিকা) , ১১১ বাইট

{Switch[L=Tr[1^{##}],1," ",3," triple ",_," double "],If[#<1,"oh",IntegerName@#],If[L>3,#0@##3,""]}&@@@Split@#<>""&

এটি অনলাইন চেষ্টা করুন!

ইনপুট হিসাবে অঙ্কের একটি তালিকা নেয়। আউটপুট একটি নেতৃস্থানীয় স্থান অন্তর্ভুক্ত।



3

পাইথন 2 , 171 169 168 বাইট

s=input()
while s:c=s[0];n=(s[1:2]==c)+(s[:3]==c*3!=s[1:4]);print'   eellpbiurotd'[-n:0:-2]+'oh one two three four five six seven eight nine'.split()[int(c)],;s=s[1+n:]

এটি অনলাইন চেষ্টা করুন!

-১ বাইট, জিতসকে ধন্যবাদ


আমাকে আবার মার! সংরক্ষণ করুন 1 বাইট মত তাই
Jitse

@ জিটস, এটি এতে কাজ করে না 1312;)
টিফিল্ড

আহ, ঠিক বলেছেন!
জিতসে

কিভাবে এই এক সম্পর্কে তারপর: ['','double ','triple '][n]থেকে ' eellpbiurotd'[-n:0:-2]168 বাইট জন্য: এটি অনলাইন ব্যবহার করে দেখুন!
জিতসে

বিকল্পভাবে, এছাড়াও 168 বাইট
জিত্সে

3

পার্ল 5 -p , 111 বাইট

s/(\d)\1/ double$1/g;s/\w+(\d)\1/triple$1/g;s/\d/' '.qw(oh one two three four five six seven eigth nine)[$&]/ge

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

s/(\d)\1/ double$1/g; # Replace non-overlapping double digits with " double<digit>"
s/\w+(\d)\1/triple$1/g; # Replace remaining double digits preceded by "double" with "triple<digit>"
s/\d/' '.qw(oh one two three four five six seven eigth nine)[$&]/ge # Replace digits with " <word>"

1
কয়েকটি বাইট বন্ধ
শেভ করা হয়েছে

3

স্কালা , 213 বাইট

বুঝেছি. কোনওরকম আমি পুনরাবৃত্ত সংস্করণটি তৈরি করার চেষ্টা করছিলাম এটির চেয়ে আরও ভার্বোস-ওয়াই ছিল (এখনও পুনরাবৃত্ত যদিও, তবে কেবল একটি ক্ষেত্রে)। ফাংশনটি fফোন নম্বরটিকে একটি ইনপুট স্ট্রিং হিসাবে গ্রহণ করে এবং এর ফোনেটিকসকে একটি পিছনের সাদা স্থানের সাথে আউটপুট করে।

var u="oh one two three four five six seven eight nine" split " "
"(.)\\1*".r.replaceAllIn(s,x=>{var o=x.matched
var k=u(o(0)-48)+" "
o.length match{case 3=>"triple "+k
case 1=>k
case _=>"double "+k+f(o drop 2)}})

এটি অনলাইন চেষ্টা করুন!
সম্পাদনা করুন : -8 বি ড্রি উইটকে ধন্যবাদ!

স্কালা , 215 বাইট

এবং এখানে শীর্ষস্থানীয় হোয়াইটস্পেস সংস্করণ আসবে, কোনও কারণে দুটি বাইট দীর্ঘতর (এমনকি বিশাল রিফ্যাক্টরিং সহ)।

var u="oh one two three four five six seven eight nine" split " "
"(.)\\1*".r.replaceAllIn(s,x=>{var o=x.matched
var k=u(o(0)-48)
" , double , triple ".split(",")(if(o.length>3){k+=f(o drop 2);1}else o.length-1)+k})

এটি অনলাইন চেষ্টা করুন!


2
আপনি প্রতিস্থাপন 8 বাইট সংরক্ষণ করতে পারবেন (o(0)+"").toIntসঙ্গে o(0)-48
ডাঃ ওয়াই উইট

ওফ ভাল করেছেন @ ড্রয়ুইট ধন্যবাদ!
ভি। কুর্তোয়া

3

পিএইচপি , 174 169 166 159 বাইট

for(;$s=strspn($argn,$d=$argn[$i],$i++);$s==3?($i+=2)+print'triple ':$s<2?:++$i+print'double ',print[oh,one,two,three,four,five,six,seven,eight,nine][$d].' ');

এটি অনলাইন চেষ্টা করুন!

সূচকে প্রতিটি অঙ্কের জন্য $i0 থেকে শুরু :

  • যদি একই অঙ্কের স্প্যান যদি অবস্থান থেকে শুরু হয় $i 3 টির সমান হয় তবে মুদ্রণ হয়'triple ' করে 2 থেকে 2 যোগ করে$i টির তাই পরবর্তী পুনরাবৃত্তিতে 2 টি সংখ্যা ছাড়িয়ে যাবে।
  • এর অবস্থান থেকে শুরু করা একই অঙ্কের স্প্যান যদি 2 $iএর সমান বা তার বেশি হয় তবে 3 হয় না, প্রিন্ট করে'double ' করে 1 এ যুক্ত করে$i তাই পরবর্তী পুনরাবৃত্তিতে 1 ডিজিট লাফিয়ে যাবে।
  • অঙ্ক এবং একটি স্থানের জন্য শব্দ মুদ্রণ করে।
  • $i++

2

রেটিনা 0.8.2 , 105 বাইট

+`(.)\1
=$1
.
 $&
= =
triple
=
double
9
nine
8
eight
7
seven
6
six
5
five
4
four
3
three
2
two
1
one
0
oh

এটি অনলাইন চেষ্টা করুন!একটি অগ্রণী স্থান আউটপুট দেয়। ব্যাখ্যা: আমি প্রথমে একটি রেইজেক্স চেষ্টা করেছি যা স্বয়ংক্রিয়ভাবে 2 বা 3 সংখ্যার সাথে মেলে তবে @ আর্নল্ডের পন্থাটি গল্ফায়ার হয়ে উঠেছে। ব্যাখ্যা:

+`(.)\1
=$1

অভিন্ন অঙ্কের জোড়া জোড়া এবং প্রথমটির সাথে একটি দিয়ে প্রতিস্থাপন করুন =। তারপরে পুনরাবৃত্তি করুন, যাতে কোনও বিজোড় সংখ্যার জন্য দ্বিতীয় শেষ সংখ্যাটিও একটি দ্বারা প্রতিস্থাপিত হয়=

.
 $&

অঙ্কগুলি (এবং =গুলি) বাইরে রাখুন।

= =
triple

তিনটি অভিন্ন অঙ্কের কেসটি পরিচালনা করুন।

=
double
9
nine
8
eight
7
seven
6
six
5
five
4
four
3
three
2
two
1
one
0
oh

বাকী সমস্ত অক্ষর শব্দের সাথে প্রতিস্থাপন করুন।


2

জেলি , 59 বাইট

⁵;`,0;$Ɗ€Ẏ;`Ø0ṭ;-œṣjƭƒV€‘$ị“¡ıc⁴Ṛ⁽]@ɱ2¦Ż©Ẉḷ$Æ!)ɗ[ı8ɱḃ%ċ»Ḳ¤K

এটি অনলাইন চেষ্টা করুন!

একটি মোনাডিক লিঙ্ক যা আর্গুমেন্ট হিসাবে অঙ্কের অক্ষরের একটি স্ট্রিং নেয় এবং স্থান-বিচ্ছিন্ন শব্দের জেলি স্ট্রিং প্রদান করে। যখন একটি পূর্ণ-প্রোগ্রাম হিসাবে ডাকা হয়, স্পষ্টভাবে আউটপুট দেয়।


2

টি-এসকিউএল 2017, 238 বাইট

এটিকে পঠনযোগ্য করার জন্য কয়েকটি লাইন ব্রেকগুলি যুক্ত করা হয়েছে

WHILE''<left(@,1)SELECT @=stuff(@,1,iif(p<4,p,2),'')+
iif(p=1,' ',iif(p=3,' triple ',' double '))
+trim(substring('oh  one  two  threefour five six  seveneightnine',left(@,1)*5,5))
FROM(SELECT~-patindex('%[^'+left(@,1)+']%'+'^',@)p)z
PRINT @

এটি অনলাইনে চেষ্টা করুন


2

সি ++, 382 বাইট

এটি সুপারক্রিভার নয়, তবে কাউকে সি ++ সংস্করণ লেখার প্রয়োজন ছিল। রিকার্সিভ ফাংশন আর ইনপুট স্ট্রিংয়ের মধ্য দিয়ে যায় এবং পুনরাবৃত্ত মানগুলি গণনা করে। যদি 3 টিরও বেশি পুনরাবৃত্তি হয়, তবে এটি 2 টি পুনরাবৃত্তি হয়েছে বলে ভান করে, তারপরে পুনরায় রিন্ডাইজ করে আবার চেষ্টা করে।

আরও কয়েকটি উত্স চরগুলি সম্ভবত #defineমেজরের সাথে আটকানো যেতে পারে তবে আমি নিশ্চিত যে আরও ভালতর আলগো আরও নিচে বেরিয়ে যেতে পারে।

#include <iostream>
#include <sstream>
using namespace std;
char*n[]={"oh","one","two","three","four","five","six","seven","eight","nine"};
void R(ostream& s,const char*r,char p='x',int c=0){if(*r==p)R(s,r+1,p,c+1);else
{if(c>1){if(c>= 4){s<<"double ";r-=(c-2);}else if(c==3)s<< "triple ";else if(c==2)s<< "double ";
}if(c >0)s<<n[p-'0']<<" ";if(!*r)return;R(s,r+1,*r,1);}}

void check(const char* in, const char* out)
{
    std::stringstream ss;
    R(ss,in);
    if (out == ss.str()) std::cout << "PASS: "; else std::cout << "FAIL! ";
    std::cout << in << "\n< " << out << "\n> " << ss.str() << std::endl;
}

int main(int c,char**argv)
{
    if (argv[1] == std::string("test"))
    {
        check("0123"         ,"oh one two three ");
        check("4554554"      ,"four double five four double five four ");
        check("000"          ,"triple oh ");
        check("00000"        ,"double oh triple oh ");
        check("66667888"     ,"double six double six seven triple eight ");
        check("19999999179"  ,"one double nine double nine triple nine one seven nine ");
    }
    else
    {
        char* v = argv[1];
        R(std::cout,v);
        std::cout << std::endl;
    }
}

এবং পরীক্ষার মামলার যাচাইকরণ:

pa-dev01$ ./a.out test
PASS: 0123
< oh one two three
> oh one two three
PASS: 4554554
< four double five four double five four
> four double five four double five four
PASS: 000
< triple oh
> triple oh
PASS: 00000
< double oh triple oh
> double oh triple oh
PASS: 66667888
< double six double six seven triple eight
> double six double six seven triple eight
PASS: 19999999179
< one double nine double nine triple nine one seven nine
> one double nine double nine triple nine one seven nine

1
গল্ফ করা অংশটির আসলে কী দরকার #include <sstream>? বা আপনি পরীক্ষা ফাংশনটির জন্য গল্ফযুক্ত অংশের পরে এটিকে নামতে পারেন? আমি মনে করি টাইপিংয়ের std::ostream&sচেয়ে কম জায়গা লাগবে using namespace std;, যদি না এমন অন্যান্য জায়গা থাকে যেখানে আপনার প্রয়োজন হয় std::
পিটার কর্ডস


2

পার্ল 6 , 96 93 বাইট

{S:g/(.)$0?[$0{}<!$0>]?/{(<triple double>X$)[3-$/.comb]}{+$/??uniname(~$0).words[1]!!'oh'} /}

এটি অনলাইন চেষ্টা করুন!

এটি একটি বেনামি কোড ব্লক যা একটি সংখ্যা নেয় এবং বড় হাতের সংখ্যার সাথে একটি স্ট্রিং প্রদান করে, যেমন 0123 => oh ONE TWO THREEএকটি একক চলমান স্থানের সাথে।

লুপহেডে ক্যাপচারগুলি কীভাবে ব্যবহার করবেন তা আমি খুঁজে না পাওয়া পর্যন্ত এটি কিছুক্ষণের জন্য মুছে ফেলা হয়েছিল তবে এটি এখনই ঠিক করা উচিত।




1

ওরাকল এসকিউএল, 578 বাইট (ফর্ম্যাট আকারে)

সমাধান কোনওভাবেই সংক্ষিপ্ত নয় তাই এটি ফর্ম্যাট পদ্ধতিতে পোস্ট করা।

with r(s) as
(select x from t
  union all
 select case
           when length(regexp_substr(s, '(.)(\1)+')) = 3 
           then regexp_replace(s, '^...')
           else regexp_replace(s, '^(.)\1|^.')
        end
   from r
  where s is not null)
select listagg(decode(length(r),  2, 'double ',  3, 'triple ') ||
               decode(substr(r, 1, 1), 0, 'oh', to_char(to_date(substr(r, 1, 1), 'j'), 'jsp')), ' ')
               within group (order by rownum)
  from (select regexp_replace(s, lag(s) over (order by length(s)) || '$') r
          from r order by length(s) desc);

এসকিউএল * প্লাসে পরীক্ষা করুন

SQL> create table t(x) as select /*'45547777777774'*/ '1999999910079' from dual;

Table created.

SQL> set pages 0
SQL> with r(s) as
  2  (select x from t
  3    union all
  4   select case
  5             when length(regexp_substr(s, '(.)(\1)+')) = 3
  6             then regexp_replace(s, '^...')
  7             else regexp_replace(s, '^(.)\1|^.')
  8          end
  9     from r
 10    where s is not null)
 11  select listagg(decode(length(r),  2, 'double ',  3, 'triple ') ||
 12                 decode(substr(r, 1, 1), 0, 'oh', to_char(to_date(substr(r, 1, 1), 'j'), 'jsp')), ' ')
 13                 within group (order by rownum)
 14    from (select regexp_replace(s, lag(s) over (order by length(s)) || '$') r
 15            from r order by length(s) desc);
one double nine double nine triple nine one double oh seven nine

মূল কৌশলটি হ'ল হার্ড-কোডেড আক্ষরিক "এক" ... "নয়" এর পরিবর্তে অরাকল বিন্যাসের মডেলগুলি ব্যবহার করে অঙ্কগুলিতে শব্দগুলিতে রূপান্তরিত হয়।


এটার কোনও সুযোগ নেই? দেখে মনে হচ্ছে আপনি একগুচ্ছ জায়গা সরিয়ে ফেলতে পারেন। আমি আরও কল্পনা করেছি আপনি কোথায় লিখতে পারেন যেখানে 's'> ''
t-clausen.dk

1
আপনি প্রতিস্থাপন কি পরে এর দ্বারা কয়েকটি অক্ষর সংরক্ষণ করতে পারবেন union allসঙ্গে select regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
স্টিভ কাস


1

(রব্লক্স) লুয়া 5.1 , 166 বাইট

for I,N in('111 triple 11 double 1 '):gmatch'(%d+)(%D+)'do for i,n in('0oh1one2two3three4four5five6six7seven8eight9nine'):gmatch'(.)(%l+)'do s=s:gsub(i*I,N..n)end end

নিশ্চিত করুন sএকটি পূর্বনির্ধারিত স্ট্রিং মান যা কেবল অঙ্কগুলি দ্বারা পপুলেটেড হয়; এটি পরিবর্তনশীল হতে হবে। ফলাফলের মধ্যে একটি শীর্ষস্থানীয় স্থানের অক্ষর অন্তর্ভুক্ত থাকবে [\u20]


সাইটে স্বাগতম! যেহেতু লুয়া স্ট্যান্ডার্ড পদ্ধতিগুলির মাধ্যমে ইনপুট নিতে পারে , তাই sইতিমধ্যে ইনপুট লাগানো নিয়মের বিপরীতে । এটি বাদ দিয়ে, আপনি একটি ভাল প্রথম পোস্ট পেয়েছেন! আমি আপনাকে একটি অনলাইন টেস্টিং সাইটের যেমন একটি লিঙ্ক অন্তর্ভুক্ত করার পরামর্শ দিচ্ছি যেমন tio.run/#lua যাতে অন্যরা আপনার সমাধানটি পরীক্ষা করতে পারে
সিয়ার্ড কইনারিংহিং

হাই। লুয়া আইয়ের বৈকল্পিকটি (আরবিএক্স.লুয়া) পরীক্ষা করে নিচ্ছিল যদিও স্যান্ডবক্সে মুদ্রণ, সতর্কতা এবং ত্রুটির আউটপুট পদ্ধতি রয়েছে।
ভিজ্যুয়ালপ্লাগিন রাবলোক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.