দক্ষ বৈজ্ঞানিক স্বরলিপি


12

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

বৈজ্ঞানিক স্বরলিপিতে নিম্নলিখিতগুলি উপস্থাপন করুন:
ক) 50000000
খ) 12000000000000000
গ) 90000000000000000000000000000000000000000
ডি) পাই ^ ই ^ আই ^ জে ^ কে ^ স্টেড :: ভেক্টর
...
জেড) 200
...

এবং আমি ভেবেছিলাম, "কি? আমাদের বলা হয়েছিল যে বৈজ্ঞানিক স্বরলিপিটি প্রচুর পরিমাণে লেখাকে আরও দক্ষ করার জন্য ব্যবহৃত হয়েছিল, তবে কিছু কিছু ক্ষেত্রে তার চেয়ে বেশি দক্ষ হয় না!"

সংখ্যাটি বিবেচনা করুন

300

এবং বৈজ্ঞানিক স্বরলিপিতে এর প্রতিনিধিত্ব:

3x10^2

কী, বৈজ্ঞানিকভাবে চিহ্নিত সংস্করণটি আসলে আরও বেশি জায়গা নেয়? আমরা কি এখন তা পারি না? (স্ক্রিন স্পেসটি মূল্যবান))
আমরা নিজেরাই নির্ধারণ করতে পারি যে বৈজ্ঞানিক স্বরলিপিতে একটি সংখ্যা লেখার জন্য আরও স্থান দক্ষ কিনা বা ...

কার্য

আপনার প্রোগ্রাম বা ফাংশনটি ইনপুট হিসাবে একক ধনাত্মক nআকারের সালাদাগুলি আকার নিতে পারে (আপনার ভাষা যা সমর্থন করে তা অবধি) এবং সংখ্যার বৈজ্ঞানিকভাবে চিহ্নিত সংস্করণটিকে আউটপুট দেয়।
যাইহোক, যদি মূল সংখ্যা n, পিছনের শূন্যগুলি এবং পেছনের দশমিক স্থানটি অপসারণের পরে, এর বৈজ্ঞানিকভাবে স্বীকৃত সংস্করণটির তুলনায় কম পরিমাণে বা সমান পরিমাণ অক্ষর প্রদর্শন করতে হয় তবে তার nপরিবর্তে আপনাকে অবশ্যই মূল সংখ্যাটি আউটপুট করতে হবে ।

আপনার কোডটি যত তাড়াতাড়ি সংক্ষিপ্ত হওয়া দরকার কারণ আউটপুটটিও যতটা সম্ভব ছোট হতে হবে।

বিশেষ উল্লেখ

দক্ষ বৈজ্ঞানিক স্বরলিপি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

bx10^e

bইনপুট সংখ্যাটি হ'ল 10 এর মতো শক্তির দ্বারা যথাযথভাবে বিভক্ত হয় 1 <= b < 10। এই সংখ্যাটিতে অবশ্যই সমস্ত চলমান শূন্যগুলি (এবং প্রয়োজনে দশমিক পয়েন্ট) মুছে ফেলা উচিত, তবে অবশ্যই মূল সংখ্যার যথার্থতা থাকতে হবে (অবশ্যই আপনার ভাষার দশমিক পয়েন্ট সীমা পর্যন্ত)। অর্থাত 90000হয়ে 9, 13.500হয়ে 1.35, 0.000675হয়ে 6.75ইত্যাদি এই নম্বরে প্রান্ত আরো দশমিক স্থান চেয়ে আপনার ভাষা সব ব্যবস্থা করতে সক্ষম ধারণকারী আপ, এটা দশমিক স্থান যে সর্বাধিক সংখ্যাতে বৃত্তাকার করা উচিত করে।

eদশটি কীভাবে উত্থাপিত হয় তা n = b x 10^e(মনে রাখবেন যে n1 এর চেয়ে কম হলে এই সংখ্যাটি নেতিবাচক হওয়া দরকার )। এই সংখ্যার কোনও পিছনে জিরো বা দশমিক স্থান থাকা উচিত নয় (মূলত এটি যদি পূর্ণসংখ্যা না হয় তবে কিছু ভুল হয় ...)।

অক্ষর x10^ আবশ্যক যেমন মধ্যে স্ট্রিং হয় থাকা bএবং e

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

Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0

স্কোরিং

এটি , তাই বাইট জেতে সংক্ষিপ্ততম কোড।

অন্যান্য নিয়ম এবং স্পষ্টতা

  • ট্রেলিং শূন্যগুলি (এবং / অথবা দশমিক স্থানের পিছনে পিছনে) মূল ইনপুট সংখ্যার অক্ষর গণনার দিকে গণনা করা হয় না n। পরীক্ষার কেস 6 এর মতো ক্ষেত্রে এটি মনে রাখবেন
  • আপনি ধরে নিতে পারেন যে যদি ইনপুট সংখ্যাটি 1 এর চেয়ে কম হয় তবে এটি সর্বদা 0 এর সাথে এক সংখ্যার (টেস্টের ক্ষেত্রে 5-8 হিসাবে) শুরু হবে।
  • ইনপুট নম্বর কখনই নেতিবাচক হবে না
  • বিল্ট-ইনগুলি যা এই চ্যালেঞ্জকে তুচ্ছ ও মানক লফোলগুলি করে তা মঞ্জুরিপ্রাপ্ত নয়
  • আউটপুটে একটি পিছনের নতুন লাইন ঠিক আছে

সম্পাদনা
88655 ব্যবহারকারীর কাছে পরীক্ষার কেসটি 7 এবং 8 এর দশকে ভুল প্রমাণ করার জন্য ধন্যবাদ। আমি এখন সেগুলি স্থির করে রেখেছি তাই নিশ্চিত হয়ে নিন যে আপনার কোডগুলি তাদের সঠিকভাবে মূল্যায়ন করে।


7
সুতরাং, আহ, আমি কি ইনপুট জন্য আউটপুট pi^e^i^j^k^std::vectorহবে জিজ্ঞাসা করা উচিত ?
জিওবিটস

@ জিওবিটস হুম, ভাল যদি আপনি স্টাড :: ভেক্টরকে একটি সংখ্যার মান নির্ধারণ করতে পারেন তবে সম্ভবত ... না, কেবল সংখ্যাগুলি ইনপুটটিতে উপস্থিত থাকবে (ভাসমান পয়েন্ট ইনপুটটির জন্য দশমিক স্থান ব্যতীত)।
এমসি ΔT

এটি আরও সহজ হবে এবং যদি এটি ব্যবহার করা হয় তবে আমরা আপনার "মূল্যবান স্ক্রিন স্পেস" এর কম গ্রহণ করব e: 9000 -> 9e3(প্রায় 9,000 এরও বেশি !)
সায়োস

1
@ কয়েস আমি সে সম্পর্কে ভেবেছিলাম, তবে আমি সত্যিই এই চ্যালেঞ্জটি সাধারণত যেভাবে রচনা করা হয় (শারীরিকভাবে লিখিতভাবে) এর ভিত্তিতে তৈরি করেছি, যা মনে হয় x10^। এবং এটি প্রশ্নটিতে পুনর্নির্মাণের ন্যায্য বিষয় হবে যা আমি মনে করি না যে এটি পোস্ট করা এখনই উপযুক্ত
এমসি FebT

1
@ঘোস্ট_ইন_থো কোডটি তিনি ছিলেন না, অতএব "যখন আমি প্রথম [গণিত শ্রেণিতে] প্রথম শিখলাম" তখন কয়েক বছর আগে আমাকে ফিরিয়ে এনেছিল "
এমসি ΔT

উত্তর:


4

ES6, 83 81 বাইট

x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y

সম্ভবত কিছু প্রান্তের ক্ষেত্রে ব্যর্থ হয় যেখানে toStringঘনঘন ফর্ম্যাটটিতে জোর দেয়।

সম্পাদনা করুন: @ ব্যবহারকারী81655 ধন্যবাদ 2 বাইট সংরক্ষণ করা।


চমৎকার ধারণা. যাইহোক, দেখে মনে হচ্ছে আপনি /রেগেক্সের শেষে ভুলে গেছেন ।
ব্যবহারকারী 81655

এছাড়াও আপনি এটি 2 বাইট সংরক্ষণ করতে সামান্য x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
পুনঃব্যবস্থা করতে পারেন

@ ইউজার ৮১65৫৫ হ্যাঁ, সেখানে কী ঘটেছিল তা হল আমার ব্রাউজারটি দীর্ঘ লাইনটি এমনভাবে আবদ্ধ করে আমাকে বিভ্রান্ত করেছিল যেহেতু আমি ভেবেছিলাম যে ভুল করে সেখানে একটি নতুন লাইন প্রবেশ করেছে।
নিল

2

পাইথন 3, 346 342 319 302 বাইট

L=len;N=str(float(input()))
if N.endswith('.0'):N=N[:-2]
if'e'in N:C,P=N.split('e');N=N.replace('e','x10^')
else:
 C=N.strip('.0').replace('.','');F=N.find('.')
 if L(C)>1:C=C[0]+'.'+C[1:]
 P=((L(N) if F==-1 else F)-1-N.lstrip('0').find(C[0]))
print(min([N,'{0}x10^{1}'.format(C,int(P))],key=L))

সম্ভবত ভয়াবহভাবে গল্ফ হয়েছে, তবে ওহে, এই জাতীয় কিছুতে এটি আমার প্রথম চেষ্টা। এটি পড়া শক্ত, তাই এটি অবশ্যই ভাল হবে।

যতদূর আমি অবগত আছি, এটি প্রতিটি ক্ষেত্রে কাজ করা উচিত, এমনকি পাইথনের প্রবণতাটি যে কোনও প্রান্তিক স্তরকে স্বয়ংক্রিয়ভাবে বৈজ্ঞানিক স্বরলিপিতে রূপান্তরিত করতে পারে (সেই দুর্দান্ত এবং অভিনব 'ই' বাদে)। আমি ঠিক কীভাবে স্ট্যান্ডার্ড ফর্ম নম্বরগুলি ফিরিয়ে দিতে সক্ষম করেছিলাম তা মনে নেই তবে এটি তা করে।


2

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

আমি মনে করি এটি আরও ছোট হতে পারে তবে এটি এখনই আমার সেরা

{my \s=($_,*×(1>$_??10!!.1)…10>*>=1);min(s[*-1]~"x10^"~(1>$_??1-s!!s-1),$_,by=>&chars)}

ব্যবহার : এটি একটি ভেরিয়েবলকে বরাদ্দ করুন

এখানে এটি কিছু খারাপ মন্তব্য সহ কিছুটা ছড়িয়ে পড়েছে:

my &f = -> $n {
    my $a = 1 > $n ?? 10 !! .1;             # If $n < 1, we will multiply by 10
                                            # in the sequence below, else by 0.1

    my @seq = ($n, * × $a ... 10 > * >= 1); # Sequence starting at $n, 
                                            # multiply the previous value by $a
                                            # until we reach a number 1 <= x < 10

    # Join the last element in @seq, "x10^", and the length of @seq,
    # with an extra subtraction for numbers less than 1.
    # this gets us our scientific notation.
    my $science = @seq[*-1] ~ "x10^" ~ @seq - (1 > $n ?? @seq*2 !! 1); 

    min($science, $n, by => &chars) # Uses the &chars function to
                                    # choose a min value and return it.
}

$_ <1সাথে 1>$_এবং এর 1 <=* <10সাথে অদলবদল করুন10>*>=1
ব্র্যাড গিলবার্ট বি

আমি আসলে রাতে বোঝাতে চেয়েছিলাম কিন্তু আমি ভুলে গেছি। আমি ঘরে ফিরে আসার পরে এটি আপডেট করব
হটকেজ

2

টিআই বেসিক (এনস্পায়ার): 112 বাইট

Define f(x)=
Prgm
string(x)➝a
If x≥1 Then
format(x,"s")➝a
EndIf
instring(a,"ᴇ")➝b
left(a,b-1)&"x10^"&mid(a,b+1)➝a
If dim(a)<dim(string(n)) or x<1 Then
Disp a
Else
Disp x
Endif
EndPrgm

ব্যাখ্যা

If x≥1 Then
format(x,"s")➝a
EndIf

ইনপুটটিকে বৈজ্ঞানিক স্বরলিপিতে রূপান্তর করে ফর্ম্যাট ফাংশনটির সাথে যদি এটি ইতিমধ্যে সেই ফর্ম্যাটে না থাকে - ছোট দশমিকগুলি স্বয়ংক্রিয়ভাবে রূপান্তরিত হয়।

instring(a,"ᴇ")➝b
left(a,b-1)&"x10^"&mid(a,b+1)➝a

অভিনব E এর অবস্থান সন্ধান করে যা এক্সপোশনগুলি বোঝায় এবং এটিকে "x10 ^" দিয়ে প্রতিস্থাপন করে।

If dim(a)<dim(string(x)) or x<1 Then
Disp a
Else
Disp x
Endif

কোন আউটপুট আরও বড় তা পরীক্ষা করে এবং সর্বোত্তমটি প্রদান করে। যদি না এটি একটি ছোট দশমিক, যা ডিফল্টরূপে ছোট।


0

পাইথন (3.5) 177 বাইট

নিয়মিত অভিব্যক্তি ব্যবহার করে একটি সমাধান

import re
g=lambda s:re.sub(r"e\+?(-?)0?","x10^\\1",s)
def f(i):
 t=g(re.sub(r"\.[0]*e","e","%e"%i))
 u=g(re.sub(r"(\..*)[0]*$","\\1",str(i)))
 return t if len(u)>len(t) else u

ব্যাখ্যা

Regexp মডিউলটির আমদানি

import re

eদ্বারা প্রতিস্থাপন করতে ল্যাম্বদা ফাংশনটির সংজ্ঞাx10^

g=lambda s:re.sub("e\+?(-?)0?","x10^\\1",s)
def f(i):

বৈজ্ঞানিক স্বরলিপি মধ্যে স্ট্রিং রূপান্তর

 t=g(re.sub(r"\.[0]*e","e","%e"%i))

অরজিনাল স্ট্রিংয়ে 0 টি প্যাডিং সরান

 u=g(re.sub(r"(\..*)[0]*$","\\1",str(i)))

দৈর্ঘ্য তুলনা

 return t if len(u)>len(t) else u

ফলাফল

>>> [f(i) for i in [1, 20, 3000000, 400000, 0.008093, 0.007835000000000, 0.000003000000, 0.00000065, 0]]
['1', '20', '3x10^6', '400000', '0.008093', '0.007835', '3x10^-6', '6.5x10^-7', '0']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.