ইংরাজিকে কোনও সংখ্যায় রূপান্তর করুন [বন্ধ]


27

চ্যালেঞ্জের সংক্ষিপ্ত এবং মিষ্টি বর্ণনা:

এই সাইটে থাকা আরও বেশ কয়েকটি প্রশ্নের ধারণার ভিত্তিতে, আপনার চ্যালেঞ্জটি হ'ল যে কোনও প্রোগ্রামে সর্বাধিক সৃজনশীল কোড লিখুন যা ইংরাজীতে লিখিত কোনও সংখ্যাকে ইনপুট হিসাবে গ্রহণ করে এবং এটি পূর্ণসংখ্যার আকারে রূপান্তর করে।

সত্যিই শুকনো, দীর্ঘ এবং পুঙ্খানুপুঙ্খ বৈশিষ্ট্য:

  • আপনার প্রোগ্রামটি ইনপুট হিসাবে এবং অন্তর্ভুক্তের মধ্যে ছোট হাতের ইংরেজিতে একটি পূর্ণসংখ্যা হিসাবে গ্রহণ করবে ।zeronine hundred ninety-nine thousand nine hundred ninety-nine
  • এটা তোলে আউটপুট শুধুমাত্র পূর্ণসংখ্যা মধ্যে সংখ্যা আকারে অবশ্যই 0এবং 999999এবং অন্য কিছুই (কোন হোয়াইটস্পেস)।
  • ইনপুট হবে না ধারণ করে ,বা and, হিসাবে one thousand, two hundredবা five hundred and thirty-two
  • যখন দশ এবং স্থান উভয়ই ননজারো হয় এবং দশকের স্থানটি এর চেয়ে বড় হয় 1, তখন সেগুলি -স্থানের পরিবর্তে একটি হাইফেন-মাইনাস অক্ষর দ্বারা পৃথক করা হবে । দশ হাজার এবং হাজার জায়গার জন্য ডিটো to উদাহরণস্বরূপ six hundred fifty-four thousand three hundred twenty-one,।
  • অন্য কোনও ইনপুটটির জন্য প্রোগ্রামটির অপরিজ্ঞাত আচরণ থাকতে পারে।

একটি ভাল আচরণের প্রোগ্রামের কয়েকটি উদাহরণ:

zero-> 0
fifteen-> 15
ninety-> 90
seven hundred four-> 704
sixty-nine thousand four hundred eleven-> 69411
five hundred twenty thousand two->520002


এটি বিশেষভাবে সৃজনশীল নয়, এমনকি এটি এখানে নির্দিষ্টকরণের সাথে সঠিকভাবে মেলে না তবে এটি একটি প্রাথমিক পয়েন্ট হিসাবে কার্যকর হতে পারে: github.com
গ্রেগ

আমি প্রায় এই প্রশ্নের আমার উত্তর পোস্ট করতে পারে ।
grc

জটিল স্ট্রিং পার্সিং কেন করবেন? পেস্টবিন.
com

1
যাইহোক, আমি একটি আইওসিসিসি প্রবেশ দেখেছি যা এই প্রশ্নের উত্তর of
স্ন্যাক

2
"চব্বিশটি" এর মতো জিনিসগুলি সম্পর্কে কী?
ফ্লফি

উত্তর:


93

Applescript

একটি নির্বোধ, হ্যাকি ম্যাশ-আপ যা কিছু কাপের্তিনো / মাউন্টেন ভিউ লোকদের বিরক্ত করতে পারে তবে আমি মনে করি এটি একটি ক্রিয়েটিভ বোকা, হ্যাকি ম্যাশ-আপ।

set myNumber to text returned of (display dialog ¬
    "Enter number as text:" buttons {"Continue…"} ¬
    default answer "" default button 1)
tell application "Google Chrome"
    activate
    open location "https://www.google.com"
end tell
delay 5
say "ok google. " & myNumber
delay 2
tell application "System Events"
    tell application process "Google Chrome"
        set fullURL to value of text field 1 of toolbar 1 of window 1
    end tell
end tell
set AppleScript's text item delimiters to "="
display alert item 2 of text items of fullURL

পাঠ্য নম্বরটি কথা বলতে ওএক্সএক্স পাঠ্যকে স্পিচ থেকে এবং গুগল অডিও অনুসন্ধানের জন্য এটি ব্যবহার করে এবং এটি পূর্ণসংখ্যায় রূপান্তর করে।

আবশ্যকতা

  • ওএসএক্স
  • গুগল ক্রম
  • আপনার Google অ্যাকাউন্টে স্পিচ-স্বীকৃতি সক্ষম হয়েছে
  • ভলিউম একটি যুক্তিসঙ্গত স্তরে পরিণত হয়েছে

আপনার ক্রোম লোড সময় এবং গুগল লুকের সময়ের উপর নির্ভর করে বিলম্বের সময়গুলি সামঞ্জস্য করতে হতে পারে।

উদাহরণ ইনপুট:

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

উদাহরণ আউটপুট:

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


13
আমি মনে করি এটি কেবল একটু সৃজনশীল হতে পারে ...;)
আব্রাহাম

5
লোল, এটি দুর্দান্ত
জাস্টহেল্ফ

2
সম্ভবত খুব সৃজনশীল।
চিজি

এক সপ্তাহ পরে, আপনার উত্তরটি স্পষ্টভাবে votes৪ ভোটে শীর্ষে রয়েছে, সুতরাং আমার মনে হয় এর অর্থ হল যে আপনি জয়ী হোন! যাইহোক, মন যদি আমি এই কোডটি ব্যবহার করি? আমি এখনই কাজ করছি এমন অনেক বাস্তব-প্রকল্পের জন্য এটি সত্যিই কার্যকর হবে! ;)
আব্রাহাম

3
@ আব্রাহাম ধন্যবাদ! আপনি প্রযোজনা কোডে এটি ব্যবহার সম্পর্কে মজা করছেন, তাই না?
ডিজিটাল ট্রমা

34

বাশ, 93 64 55 টি অক্ষর *

bsd-gamesবেশিরভাগ লিনাক্স অপারেটিং সিস্টেমে যে দুর্দান্ত প্যাকেজ পাওয়া যায়, সেখানে একটি ছোট্ট কমান্ড-লাইন খেলনা বলা হয় number। এটি সংখ্যাকে ইংরেজি পাঠ্যে রূপান্তরিত করে, এটি এই প্রশ্নের ঠিক বিপরীত কাজ করে। এটি সত্যই বিপরীত: প্রশ্নের সমস্ত নিয়ম অনুসরণ করা হয় number। এটি একটি কাকতালীয় ঘটনা হিসাবে প্রায় খুব ভাল।

$ number 42
forty-two.

অবশ্যই, numberপ্রশ্নের উত্তর দেয় না। আমরা এটি অন্যদিকে চাই। আমি এই সম্পর্কে কিছুক্ষণের জন্য ভেবেছিলাম, স্ট্রিং পার্সিং এবং numberএগুলি সব কিছুর চেষ্টা করেছি, তখন বুঝতে পেরেছিলাম যে আমি কেবল সমস্ত 999.999 নম্বরে কল করতে পারি এবং দেখি কিছু ইনপুটটির সাথে মেলে কিনা। যদি তা হয় তবে এটির সাথে মিলিত প্রথম লাইনে আমি যে রেখার সন্ধান করছি তার দ্বিগুণ রয়েছে ( numberপ্রতিটি সংখ্যার পরে বিন্দুগুলির একটি লাইন প্রিন্ট করে)। যে হিসাবে সহজ। সুতরাং, আরও অ্যাডো না করে আমার প্রবেশের সম্পূর্ণ কোডটি এখানে:

seq 0 999999|number -l|awk "/$1/{print (NR-1)/2;exit}"

এটি এমনকি শর্ট সার্কিট, সুতরাং "দুটি" রূপান্তর করা বেশ দ্রুত এবং এমনকি উচ্চতর সংখ্যার সাধারণত আমার বাক্সে একটি সেকেন্ডের নীচে ডিকোড হয়। এখানে একটি উদাহরণ রান করুন:

wn@box /tmp> bash unnumber.sh "zero"
0
wn@box /tmp> bash unnumber.sh "fifteen"
15
wn@box /tmp> bash unnumber.sh "ninety" 
90
wn@box /tmp> bash unnumber.sh "seven hundred four"
704
wn@box /tmp> bash unnumber.sh "sixty-nine thousand four hundred eleven"
69411
wn@box /tmp> bash unnumber.sh "five hundred twenty thousand two"    
520002

অবশ্যই, numberএটি কাজ করার জন্য আপনার ইনস্টল করা দরকার ।


*: হ্যাঁ, আমি জানি, এটি কোনও code-golfচ্যালেঞ্জ নয়, তবে সংক্ষিপ্ততা আমার প্রবেশের একমাত্র বিচক্ষণ গুণ, তাই ... :)


8
+1 টি। আমার জন্য, numberবিপরীতে ব্যবহার করা এই উত্তর সম্পর্কে সৃজনশীল জিনিস। গল্ফনেস খুব ভাল যদিও :)
ডিজিটাল ট্রমা

1
এটি আসলে বেশ সৃজনশীল! আমি এটা পছন্দ করি!
sokie

13

জাভাস্ক্রিপ্ট

(function parse(input) {
  var pat = "ze/on/tw/th.?r/fo/fi/ix/se/ei/ni/ten/ele".split("/");
  var num = "", last = 0, token = input.replace(/-/g, " ").split(" ");
  for(var i in token) {
    var t = token[i];
    for(var p in pat) if(t.match(RegExp(pat[p])) !== null) num += "+" + p;
    if(t.indexOf("een") >= 0) num += "+10";
    if(t.indexOf("lve") >= 0) num += "+10";
    if(t.indexOf("ty") >= 0) num += "*10";
    if(t.indexOf("dr") >= 0) { last = 100; num += "*100"; }
    if(t.indexOf("us") >= 0) {
      if(last < 1000) num = "(" + num + ")"; last = 0;
      num += "*1000";
    }
  }
  alert(eval(num));
})(prompt());

আপনি কিছু পছন্দ করেন eval()?

আপনার ব্রাউজারের কনসোলে এই স্ক্রিপ্টটি চালান।

সম্পাদনা করুন: প্রতিক্রিয়ার জন্য ধন্যবাদ। বাগগুলি ঠিক করা হয়েছে (আবার)।


সত্যিই দুর্দান্ত কোড ^^
zsitro

2
তোমার মত "এক শত ষোল" কিছু টাইপ, তখন তা 126. দেব
scrblnrd3

এই প্রোগ্রামটি twelveযখন ফিরে আসে তখন কিছু সংখ্যার জন্য ব্যর্থ হয় 23
আব্রাহাম

ব্যর্থ হয় "twenty"
200_সাকাস

seven thousand three hundred thirty fiveআমাকে দিন10335
বেবি

7

পাইথন

শুধু বল ঘূর্ণায়মান পেতে।

import re
table = {'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,
         'ten':10,'eleven':11,'twelve':12,'thirteen':13,'fourteen':14,'fifteen':15,'sixteen':16,'seventeen':17,'eighteen':18,'nineteen':19,
         'twenty':20,'thirty':30,'forty':40,'fifty':50,'sixty':60,'ninety':90}
modifier = {'hundred':100,'thousand':1000}

while True:
    text = raw_input()
    result = 0
    tmp = 0
    last_multiplier = 1
    for word in re.split('[- ]', text):
        multiplier = modifier.get(word, 1)
        if multiplier > last_multiplier:
            result = (result+tmp)*multiplier
            tmp = 0
        else:
            tmp *= multiplier
        if multiplier != 1:
            last_multiplier = multiplier
        tmp += table.get(word,0)
    print result+tmp

5

পার্ল + সিপিএএন

চাকাটি পুনরায় উদ্বেগ কেন, যখন এটি ইতিমধ্যে করা হয়ে গেছে?

use feature 'say';
use Lingua::EN::Words2Nums;

say words2nums $_ while <>;

এই প্রোগ্রামটি স্ট্যান্ডার্ড ইনপুট (বা কমান্ড লাইন আর্গুমেন্ট হিসাবে নির্দিষ্ট এক বা একাধিক ফাইল থেকে), প্রতিটি লাইনে একটি করে ইংরাজি স্ট্রিং পড়বে এবং প্রাসঙ্গিক সংখ্যাকে স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করবে।

আমি এই কোডটি চ্যালেঞ্জ থেকে প্রাপ্ত নমুনা ইনপুট উভয়ের ব্যবহার করে পরীক্ষা করেছি, পাশাপাশি বিএসডি-গেমস numberইউটিলিটি (ধন্যবাদ, ওয়ান্ডার নওতা!) ব্যবহার করে পাঠ্যতে রূপান্তরিত 0 থেকে 999999 পর্যন্ত সংখ্যার সমন্বিত একটি বিস্তৃত টেস্ট স্যুট এবং এটি সঠিকভাবে পার্স করেছে তাদের সবাই. বোনাস হিসাবে, এটি যেমন minus seven(−7), four and twenty(24), four score and seven(87), one gross(144), a baker's dozen(13), eleventy-one(111) এবং googol(10 100 ) এর মতো ইনপুটগুলিও বোঝে ।

( নোট: নিজেই অনুবাদক পার্ল ছাড়াও, এই প্রোগ্রাম এছাড়াও CPAN মডিউল প্রয়োজন লিঙ্গুয়া :: টীকা :: Words2Nums । এখানে কিছু হয় CPAN মডিউল ইনস্টল করার জন্য নির্দেশাবলী । Debian / Ubuntu- লিনাক্স ব্যবহারকারীরা এপিটি প্যাকেজ ম্যানেজার এর মাধ্যমে এই মডিউল ইনস্টল করতে পারেন যেমন liblingua en-words2nums-Perl ।)


4

পাইথন

বৈধতা যাচাই সহ একটি সাধারণ পুনরাবৃত্ত সমাধান। প্রয়োজনীয় সংখ্যার ব্যাপ্তির জন্য সরল করা যেতে পারে তবে আমার অনুমানটি এখানে প্রদর্শন করা যায়:

terms = 'zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
tee  = 'twenty thirty forty fifty sixty seventy eighty ninety'.split()
for t in tee:
    terms.append(t)
    for s in terms[1:10]:
        terms.append(t+'-'+s)

terms = dict(zip(terms, range(100)))

modifiers = [('hundred', 100), ('thousand', 1000), ('million', 10**6), ('billion', 10**9)]

def read_num(words):
    if len(words) == 0: return 0
    elif len(words) == 1:
        if words[0] in terms:
            return terms[words[0]]
        else:
            raise ValueError(words[0]+' is not a valid english number.')
    else:
        for word, value in reversed(modifiers):
            if word in words:
                i = words.index(word)
                return read_num(words[:i])*value+read_num(words[i+1:])

    raise ValueError(' '.join(words)+' is not a valid english number.')

while True:
    try:
        print(read_num(input().split()))
    except ValueError as e:
        print(e)

2

ভিবিএস স্ক্রিপ্ট 474

এটি মোটামুটি রুটিন উত্তর ... দুর্ভাগ্যক্রমে, এতটাই রুটিন যে @ স্নাক প্রায় একই প্রক্রিয়াটি পোস্ট করেছেন তবে আমার আগে।

i=split(REPLACE(REPLACE(inputbox(""),"lve","een"),"tho","k"))
o=split("z on tw th fo fi si se ei ni ten ele")
y=split("red *100) k )*1000 ty *10) een +10)")
z=""
p=0
for t=0 to UBOUND(i)
    s=split(i(t),"-")
    u=ubound(s)
    r=s(0)
    for x=0 to UBOUND(o)    
        IF INSTR(r,o(x)) THEN
            z=z+"+"+CSTR(x)
        END IF
        IF u Then
            IF INSTR(s(1),o(x)) THEN
                z=z+CSTR(x)
            END IF
        END IF
    next
    for m=0 to UBOUND(y)
        IF INSTR(r,y(m))AND u=0 THEN
            z=z+y(m+1)
            p=p+1
        END IF
    next
next
Execute("MSGBOX "+String(p,"(")+z)

1

Haskell,

আমার ধারণা মতো অন্যান্য পুনরাবৃত্ত সমাধানগুলির অনুরূপ, তবে আমি এটি পরিষ্কার করার জন্য সময় নিয়েছি।

এখানে সমস্ত ব্যাখ্যা সহ সম্পূর্ণ উত্স: http://ideone.com/fc8zcB

-- Define a type for a parser from a list of tokens to the value they represent.
type NParse = [Token] -> Int    

-- Map of literal tokens (0-9, 11-19 and tens) to their names.
literals = [
        ("zero", 0), ("one", 1), ("two", 2), ("three", 3), ("four", 4), ("five", 5), ("six", 6), ("seven", 7), ("eight", 8), ("nine", 9),
        ("eleven", 11), ("twelve", 12), ("thirteen", 13), ("fourteen", 14), ("fifteen", 15), ("sixteen", 16), ("seventeen", 17), ("eighteen", 18), ("nineteen", 19),
        ("ten", 10), ("twenty", 20), ("thirty", 30), ("fourty", 40), ("fifty", 50), ("sixty", 60), ("seventy", 70), ("eighty", 80), ("ninety", 90)
    ]

-- Splits the input string into tokens.
-- We do one special transformation: replace dshes by a new token. Such that "fifty-three" becomes "fifty tens three". 
prepare :: String -> [Token]

-- Let's do the easy stuff and just parse literals first. We just have to look them up in the literals map.
-- This is our base parser.
parseL :: NParse
parseL [tok] = case lookup tok literals of 
    Just x -> x

-- We're going to exploit the fact that the input strings have a tree-like structure like so
--                    thousand
--          hundred             hundred
--      ten       ten       ten         ten
--    lit   lit lit  lit   lit  lit    lit  lit
-- And recursively parse that tree until we only have literal values.
--
-- When parsing the tree
--       thousand
--     h1       h2
-- The resulting value is 1000 * h1 + h2.
-- And this works similarly for all levels of the tree.
-- So instead of writing specific parsers for all levels, let's just write a generic one :

{- genParse :: 
    NParse      : the sub parser
    -> Int      : the left part multiplier
    -> Token    : the boundary token 
    -> NParse   : returns a new parser -}   
genParse :: NParse -> Int -> Token -> NParse    
genParse delegate mul tok = newParser where
    newParser [] = 0
    newParser str = case splitAround str tok of
        -- Split around the boundary token, sub-parse the left and right parts, and combine them
        (l,r) -> (delegate l) * mul + (delegate r)  

-- And so here's the result: 
parseNumber :: String -> Int
parseNumber = parseM . prepare
    where   -- Here are all intermediary parsers for each level
    parseT = genParse   parseL  1       "tens"       -- multiplier is irregular, because the fifty in fifty-three is already multiplied by 10
    parseH = genParse   parseT  100     "hundred"
    parseK = genParse   parseH  1000    "thousand"
    parseM = genParse   parseK  1000000 "million" -- For fun :D

test = (parseNumber "five hundred twenty-three thousand six hundred twelve million two thousand one") == 523612002001

0

কমন লিস্প, 94

(write(cdr(assoc(read-line)(loop for i to 999999 collect(cons(format()"~r"i)i)):test #'equalp)))

নম্বর থেকে পাঠ্য রূপান্তর সিএলে অন্তর্নির্মিত, তবে অন্যভাবে নয়। সংখ্যার জন্য বিপরীত ম্যাপিং তৈরি করে এবং এতে ইনপুট পরীক্ষা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.