ফিবোনাকির সেক্সেজিমালস


15

লিওনার্দো দা পিসানো ওরফে ফিবোনাকি হিন্দু-আরবি সংখ্যাটি ইউরোপে আনার ক্ষেত্রে সহায়ক ভূমিকা পালন করেছিলেন। তার আগে, সেখানে গণিতবিদরা রোমান সংখ্যার সাথে ষাটটি বেসে কাজ করতেন।

উদাহরণস্বরূপ, দুইটির বর্গমূলের পরিমাণটি এটির মতো হতে পারে: একষট্টিশ ভাগের একত্রিশটি অংশ এবং তিন-হাজার-ছয়-শতাব্দীর একান্ন ভাগের অংশ , এবং প্রসঙ্গ অনুসারে নির্ধারিত স্কেলিংয়ের সাথে এইভাবে লিখিত হয়: i xxiv li । সেই সময়ে, "কিছুই না" জানা ছিল ( অর্থাত শূন্য), তবে এই সংখ্যা ব্যবস্থায় কোনও স্ট্যান্ডার্ড প্রতিনিধিত্ব ছিল না।

যাতায়াতকালে ফিবোনাচি এই নতুন-উদ্ভাসিত দশমিক অঙ্কগুলি উপেক্ষা করেছিলেন, তবে তিনি অবশ্যই বর্তমান ব্যবস্থার ঘাটতিগুলি সমাধান করতে পারতেন। এই উন্নত সিস্টেমটিকে আমরা ফিবোনাকির সেক্সেজিমালস বলব ।

আপনার কাজটি এমন একটি প্রোগ্রাম, ফাংশন বা কোড স্নিপেট লিখুন যা ASCII বা বাইনারি ফর্ম্যাটে ভাসমান পয়েন্ট সংখ্যা এবং বেস ষাট রোমান সংখ্যায় আউটপুট নেয়। ইনপুটটি ফাইল, কনসোল, কমান্ড লাইন বা ফাংশন আর্গুমেন্ট হতে পারে এবং আউটপুট ফাইল বা কনসোল হতে পারে, যেটি সহজ।

আউটপুট আপার বা লোয়ার কেস হতে পারে এবং অবশ্যই এই উন্নতিগুলি অন্তর্ভুক্ত করতে হবে:

  • নাল বোঝাতে এন বা এন ব্যবহার করুন অর্থ স্থানের কোনও মূল্য নেই, অর্থাত্ "শূন্য" (সিস্টেমের সাথে সমস্যা)
  • সেক্সেজিমিমাল পয়েন্টের সাথে সম্পর্কিত এবং ইঙ্গিত করতে বা ব্যবহার করুন (সিস্টেমের সাথে অন্য একটি সমস্যা)
  • রোমান সংখ্যার পৃথক গোষ্ঠীগুলির জন্য একটি মাঝারি বিন্দু বা একটি তারকাচিহ্ন * ব্যবহার করুন (সিস্টেমের সাথে আরও একটি সমস্যা)

ধরুন ইনপুটটি মান্টিসার সাথে ভাসমান পয়েন্ট হবে যা লিক্স · লিক্স · লিক্স · লিক্স · লিক্সের চেয়ে বড় নয় । N · e · n · n · n · n than এর চেয়ে কম ভগ্নাংশ উপেক্ষা করা যেতে পারে। সুতরাং, প্রদত্ত ইনপুটটিতে এই বিধিনিষেধ রয়েছে, একটি ই এর সাথে রোমান সংখ্যাগুলির সর্বাধিক দশ টি গ্রুপ আউটপুট করা যায় ।

প্রসঙ্গটি পরিষ্কার হওয়ার জন্য আমার চেয়ে কম সংখ্যার একটি অগ্রণী এন · ই থাকতে হবে।

কিছু উদাহরণ: inputআউটপুট

  • 0N
  • 1আমি
  • 60i · n
  • 0.1N · e · vi
  • 3600i · n · n
  • 10.5x · ই · xxx
  • 16777215i · xvii · xl · xx · xv
  • 3.1415926536iii · e · viii · xxix · xliv · n · xlvii

আউটপুট অপ্রয়োজনীয় নেতৃস্থানীয় এড়িয়ে চলতে হবে এন · অংশক অংশে বিচ্ছিন্ন বা trailing · এন আউটপুট ভগ্ন অংশে। সুতরাং উদাহরণস্বরূপ, n · n · n · n · i , i · e , এবং i · e · n · n · n · n · n এর ইনপুটটির জন্য ভুল আউটপুট 1

আউটপুটে প্লাস বা মাইনাস n · e · n · n · n · n · i এর পার্থক্য সহনশীলতার মধ্যে রয়েছে এবং গ্রহণযোগ্য।

ইনপুটটি আপনার পছন্দের ভাষায় কোনও আইনী ভাসমান বিন্দু, সুতরাং যতক্ষণ না ইনপুট উপরে উল্লিখিত সীমার বাইরে না আসে ততক্ষণ ইতিবাচক বা নেতিবাচক এক্সপোশনগুলি অন্তর্ভুক্ত করতে পারে।

এবং পরিশেষে, রোমান সংখ্যা বিল্ট-ইন করা হয় অনুমতি!


1
যতটা আমি ইতিহাসকে ভালবাসি, ততক্ষণ আপনি ফাইবোনাচি সিকোয়েন্সের জন্য ফাইবোনাকি বিশেষভাবে সংরক্ষিত থাকে, যদি না আপনি ট্যাগ উইকি বদলাতে চান ...
অ্যাডিসন ক্র্যাম্প

ট্যাগটি "লিওনার্দো ফিবোনাচি বেশিরভাগ ক্ষেত্রে ফিবোনাচি ক্রম (0, 1, 1, 2, 3, 5, 8, 13, ...) এর জন্য পরিচিত,"

আমি মনে করি যে এই চ্যালেঞ্জটিতে রোমান সংখ্যাগুলি কীভাবে কাজ করে এবং প্রক্রিয়া জড়িত সে সম্পর্কে কিছুটা তথ্য থাকা উচিত, কেবলমাত্র স্বনির্ভর থাকতে হবে।
লিয়াম

1
এটি উদ্দেশ্যমূলক ব্যবহার নয়। আমি এটি প্রতিফলিত করতে ট্যাগ উইকি সংক্ষিপ্ত সম্পাদনা করেছি।
ডেনিস

উত্তর:


1

পাইথন 3, 323 319 320 বাইট

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

সম্পাদনা করুন: বাগ ফিক্সিং এবং গল্ফিং।

সম্পাদনা করুন: আরও বাগ ফিক্সিং।

def f(x):
 v=divmod;f=x%1;n=int(x);d=",I,II,III,IV,V,VI,VII,VIII,IX".split(",");t=",X,XX,XXX,XL,L".split(",");z=["N"];a=f>0;s=z*0**n+["E"]*a
 while n:n,m=v(n,60);j,k=v(m,10);s=[z,[t[j]+d[k]]][m>0]+s
 for i in range(5*a):m,f=v(f*60,1);j,k=v(int(m),10);s+=[z,[t[j]+d[k]]][m>0]
 while s[-1:]==z*a:s.pop()
 return"*".join(s)

Ungolfed:

def f(x):
    integ = int(x)
    frac = x % 1
    units=",I,II,III,IV,V,VI,VII,VIII,IX".split(",")
    tens=",X,XX,XXX,XL,L".split(",")
    zero = ["N"]
    output = []
    a = frac != 0
    if integ == 0:
        output += z
    if a:
        output += ["E"]
    while integ > 0:
        integ, digit = divmod(integ, 60)
        j, k = divmod(int(digit), 10)
        if digit:
            output += [tens[j], units[k]]
        else:
            output += zero
    for i in range(5*a):
        digit, frac = divmod(frac*60, 1)
        j, k = divmod(int(digit), 10)
        if digit:
            output += [tens[j], units[k]]
        else:
            output += zero
    while output[-1:] == zero * a:
        output.pop()
    return "*".join(output)

3

সি - 584 বাইট

অ-প্রতিদ্বন্দ্বী (স্পষ্টতই), তবে অনুপ্রেরণা হিসাবে পরিবেশন করা:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
char*f(int z){static char r[8];char*l[]={"","I","II","III","IV","V","VI","VII","VIII","IX"},*h[]={"","X","XX","XXX","XL","L"};if(!z)return"N";sprintf(r,"%s%s",h[z/10],l[z%10]);return r;}int main(int c,char**v){char*s="";int i,j,z[10],k=60;long x;double d,y;y=modf(atof(v[1]),&d);x=d;for(i=4;i>=0;i--){z[i]=x%k;x/=k;}for(i=5;i<=9;i++){z[i]=(y*=k);y-=z[i];}for(i=0;!z[i]&&i<4;i++);for(;i<5;i++){printf("%s%s",s,f(z[i]));s="*";}for(j=9;!z[j]&&j>=i;j--);if(i<=j)printf("*E");for(;i<=j;i++)printf("*%s",f(z[i]));printf("\n");return 0;}

হিসাবে সংরক্ষণ করুন fs.c, দিয়ে তৈরি করুন gcc -o fs fs.c -lm, এবং হিসাবে চালান ./fs <arg>

পরীক্ষার কেস:

$ ./fs 0
N
$ ./fs 1
I
$ ./fs 60
I*N
$ ./fs 0.1
N*E*VI
$ ./fs 3600
I*N*N
$ ./fs 10.5
X*E*XXX
$ ./fs 16777215
I*XVII*XL*XX*XV
$ ./fs 3.1415926536
III*E*VIII*XXIX*XLIV*N*XLVII

বৃহত্তম ম্যান্টিসা এবং ভগ্নাংশ:

$ ./fs 777599999
LIX*LIX*LIX*LIX*LIX
$ ./fs 0.999999998713992
N*E*LIX*LIX*LIX*LIX*LIX

আমি doubleকাজের ধরণ হিসাবে ব্যবহার করছি , সুতরাং বৃহত্তম ম্যান্টিসা এবং ভগ্নাংশ সম্মিলিতভাবে এই ধরণের নেটিভ যথার্থতা ছাড়িয়ে যায়। আমি long doubleপরিবর্তে এটি ব্যবহার করতে পারলে এটি এটি পরিচালনা করতে পারে।


int mainফিরে আসতে হবে না 0
জাকারিয়া

0

হাস্কেল ( 333 322 315 বাইট)

আমি যখন প্রকাশ করি তখন সর্বশেষ সেক্সেজিমাল ডিজিটটি গোল করার কথা বা কাটা কাটা অনুমতি দেওয়া হয় কিনা তা আমি স্পষ্ট নই; এই কেটে যায়, আমি মনে করি পাইথন 3 খুব সম্ভবত একটিও আছে?

d n f 0=n;d n f x=f x
x!n=60*(x-fromInteger n)
f 0=[];f x=(\n->n:f(x!n))$floor x
l 0=[];l x=(\(d,m)->l d++[m])$divMod x 60
v=[50,40,10,9,5,4,1]
n&i|n==0=""|n>=v!!i=words"l xl x ix v iv i"!!i++(n-v!!i)&i|True=n&(i+1)
q=foldl1(\a x->a++'.':x).map(d"n"(&0))
p x=(\n->d"n"(q.l)n++d""((".e."++).q.take 5.f)(x!n))$floor x

(-9 বাইট, ধন্যবাদ H.PWiz ! -2 নির্মূল করে বাইট whereজন্য (\->)$, -5 এই উদ্ভাবন করে আরও dফাংশন এবং golfing a++"."++xকরতে a++'.':x।)

Ungolfed:


-- this function gets called `d` for default
onZero :: (Eq n, Num n) => z -> (n -> z) -> n -> z
onZero def f x 
 | x == 0    = def
 | otherwise = f x 

-- this function gets called `f`
fracPart :: RealFrac a => a -> [Integer]
fracPart x
  | x == 0    = [] 
  | otherwise = n : fracPart (60 * (x - fromInteger n))
    where n = floor x

-- this function gets called `l`
leadPart :: Integral n => n -> [Integer]
leadPart x
  | x == 0    = [] 
  | otherwise = leadPart div ++ [ mod ]
    where (div, mod) = x `divMod` 60

-- these get called `v`
romanValues :: [Integer]
romanValues = [50, 40, 10, 9, 5, 4, 1]

-- these get inlined with `words`, and correspond to the values above
romanLetters :: [String]
romanLetters = ["l", "xl", "x", "ix", "v", "iv", "i"]

-- this becomes (&)
romanNumeralLoop :: Integer -> Int -> String
romanNumeralLoop n i
 | n == 0                  = "" 
 | n >= (romanValues !! i) = (romanLetters !! i) ++ romanNumeralLoop (n - (romanValues !! i)) i
 | otherwise               = romanNumeralLoop n (i + 1)

-- this becomes `q`
concatRomanWithDots :: [Integer] -> String
concatRomanWithDots numbers = concatWithDots (map toRoman numbers)
  where 
    toRoman = onZero "n" (\x -> romanNumeralLoop x 0)
    concatWithDots = foldl1 concatDot
    concatDot acc item = acc ++ "." ++ item

-- this becomes `p`
solve x = onZero "n" elseRomanizeLeadPart n ++ onZero "" elseRomanizeFracPart f
  where
    n = floor x
    f = 60 * (x - fromInteger n) 
    elseRomanizeLeadPart l = concatRomanWithDots (leadPart l)
    elseRomanizeFracPart f = ".e." ++ concatRomanWithDots (take 5 (fracPart f))

রোমান সংখ্যায় পূর্ণসংখ্যার রূপান্তর করার পদ্ধতিটি স্ট্যাক ওভারফ্লোতে টমাস আহলে কাছ থেকে নির্লজ্জভাবে চুরি হয়েছিল এবং কিছুটা গল্ফ করেছিল।


["l","xl","x","ix","v","iv","i"]হতে পারেwords"l xl x ix v iv i"
H.PWiz

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