ফ্যাকটোরিয়াল নম্বর সিস্টেমটিতে এবং থেকে রূপান্তর করুন


27

গৌণিক সংখ্যা সিস্টেম , এছাড়াও factoradic বলা হয়, একটি মিশ্র র্যাডিক্স সংখ্যা সিস্টেম। ফ্যাক্টরিয়ালগুলি কোনও সংখ্যার স্থানের মান নির্ধারণ করে।

এই সিস্টেমে ডান সর্বাধিক অঙ্কটি হয় 0 বা 1 হতে পারে, দ্বিতীয় ডান দিকের অঙ্কটি 0, 1 বা 2 এবং আরও কিছু হতে পারে। এর অর্থ nহ'ল একটি অঙ্কের ফ্যাক্টোরেডিক সংখ্যার সর্বাধিক মান থাকতে পারে (n + 1)!

উদাহরণস্বরূপ, প্রকৃত সংখ্যাটি 24201দশমিক রূপান্তর করতে আপনি এইটি করবেন:

2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349

অত: পর factoradic সংখ্যা 24201হয় 349বেস 10

দশমিক সংখ্যা ( 349উদাহরণ হিসাবে) একটি বাস্তব সংখ্যাতে রূপান্তর করতে , আপনি এটি করবেন:

সংখ্যার চেয়ে বৃহত্তম ফ্যাকটোরিয়াল নিন। এই ক্ষেত্রে এটি হয় 120, বা 5!

349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0

অত: পর 349বেস 10factoradic সংখ্যা 24201

আপনার চ্যালেঞ্জটি হ'ল সংক্ষিপ্ততম প্রোগ্রাম বা ফাংশন তৈরি করা যা কোনও ইনপুট নম্বরটিকে অন্য বেসে রূপান্তর করে।

ইনপুটটি অ-নেতিবাচক পূর্ণসংখ্যার একটি স্ট্রিং প্রতিনিধিত্ব হবে। একটি বাস্তবসংখ্যার সংখ্যার আগে একটি !(উদাহরণস্বরূপ !24201) হবে, যখন দশমিক সংখ্যা কোনও কিছুর আগে হবে না। আপনি ধরে নিতে পারেন যে সর্বাধিক ইনপুট হবে 10! - 1- 3628799দশমিক এবং 987654321বাস্তবের ক্ষেত্রে। এর অর্থ হ'ল অক্ষরগুলি প্রকৃতপক্ষে ইনপুট / আউটপুটে উপস্থিত হবে না।

প্রোগ্রামটির !জন্য একটি বাস্তবিক আউটপুট প্রিপেন্ড করতে হবে না এবং স্ট্রিং বা একটি পূর্ণসংখ্যা আউটপুট করতে পারে। ইনপুটটি কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে।


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

Input: 1234
Output: 141120

Input: 746
Output: 101010

Input: !54321
Output: 719

Input: !30311
Output: 381

উত্তর:


10

এপিএল, 39 37 টি অক্ষর

{A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}

উদাহরণ:

      {A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}'1234'
141120
      {A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}'!54321'
719

1
আমার মনে হয় আপনি প্রতিস্থাপন করতে পারেন ⍴⍵∩'!'সঙ্গে '!'∊⍵একটি অক্ষর সংরক্ষণ করুন।
অস্থিরতা

@ অস্থিরতা হ্যাঁ আপনি পারেন। আমি অন্য একটি খুঁজে পেয়েছি।
হাওয়ার্ড

11
আপনার স্ক্রিপ্টে আইএমও "pwn" শব্দটি অতিরিক্ত অক্ষরের পক্ষে যথেষ্ট।

1
আমি ejrb এর সাথে একমত আপনি কি এটি ভেঙে দিতে দয়া করে?
তিতাস

1
একটি অক্ষর সংরক্ষণ করতে এর ~'!'সাথে প্রতিস্থাপন করুন ∩⎕D
অ্যাডম

9

পাইথন 2.7 ( 163 157 152)

i=raw_input()
exec("b='';a=362880;j=int(i);x=9;"+'b+=`j//a`;j%=a;a/=x;x-=1;'*9,"a=x=1;b=0;"+'b+=a*int(i[-x]);x+=1;a*=x;'*~-len(i))['!'in i]
print int(b)

আরও পঠনযোগ্য সংস্করণ:

i=raw_input()
if'!'in i:a=x=1;b=0;c='b+=a*int(i[-x]);x+=1;a*=x;'*~-len(i)
else:b='';a=362880;j=int(i);x=9;c='b+=`j//a`;j%=a;a/=x;x-=1;'*9
exec c;print int(b)

ভাঙ্গন:

Factoradic -> Decimal, when i is in the form !(number)
a=1   #Factorial value (multiplied every iteration)
x=1   #Index value
b=0   #Output
iterate ~-len(i) times:    #PSEUDOCODE! bitwisenot(a) = ~a = -a-1
    b+=a*int(i[-x])        #add the value of the xth last character in the factoradic #
    x+=1                   #Increment x
    a*=x                   #Set a to x!, (x-1)! * x = x!

Decimal -> Factoradic
b=''                       #Output
a=362880                   #Factorial value, set to 9! here
j=int(i)                   #Integer value of the input
x=9                        #Index value
iterate 9 times:           #PSEUDOCODE! This block is in an exec() loop
    b+=`j/a`               #Add floor(j/a) to b
    j%=a                   #Take out all multiples of a in j
    a/=x                   #Set a to (x-1)!, x! / x = (x-1)!
    x-=1                   #Decrement x

1
সুন্দর সমাধান। আমার মনে হয় আপনি প্রতিস্থাপন করতে পারেন '!'==i[0]সঙ্গে '!'in i, এবং ব্যবহার করতে পারেন a=x=1। এছাড়াও, এক্সিকিউট স্টেটমেন্টের চারপাশে আপনার বন্ধনী প্রয়োজন নেই।
grc

1
আপনি (len(i)-1)সঙ্গে প্রতিস্থাপন করতে পারে ~-len(i)
অস্থিরতা

@ উদ্বিগ্নতা, জিআরসি: ধন্যবাদ! আমার বিটওয়াইজ অপারেটরগুলি শেখা উচিত :)
beary605

1
সুন্দর উত্তর, আমি যদি বিবৃতিটি প্রতিস্থাপন করার চেষ্টা করেছি (a,b)['!'in i]এবং 6 টি অক্ষর মুণ্ডিত করতে পারি। এটি যতটা পঠনযোগ্য নয় ততই ... পেস্টবিন লিঙ্ক
ইজরবি

@ জর্জ: পরামর্শের জন্য ধন্যবাদ! আমি
এক্সিকিউট

8

গল্ফস্ক্রিপ্ট ( 48 44 43 অক্ষর)

.~\{1{):?\.?%\?/@}9*{*+}+9*}:^{:N,{^N=}?}if

এটি একটি স্বনির্ভর প্রোগ্রাম। ফ্যাক্টোরিয়াডিক => দশমিক রূপান্তরটি বেশ ধীর, কারণ এটি সরাসরি বেস রূপান্তরের পরিবর্তে দশমিক => ফ্যাকটোরিয়াডিক রূপান্তর ব্যবহার করে অনুসন্ধান করে।

ইনপুট ফর্ম্যাটটি খুব স্বল্প মোডে স্যুইচ করার অনুমতি দেয়: .~ইনপুট স্ট্রিংটি অনুলিপি করে এবং এটি মূল্যায়ন করে, সুতরাং যদি ইনপুটটি কেবলমাত্র একটি সংখ্যা হয় তবে আমরা উদাহরণস্বরূপ "1234" 1234স্ট্যাকের সাথে শেষ করি এবং যদি এটি শুরু হয় !(কোনও যৌক্তিক নয়, কোনও খালি নয়) স্ট্রিং সত্যবাদী হচ্ছে) আমরা 0 30311স্ট্যাকের উপর উদাহরণ দিয়ে শেষ করি । তারপরে স্ট্যাকের নীচের মানটি দশমিক => ফ্যাক্টোরিয়াডিকের জন্য সত্য এবং ফ্যাক্টোরিয়াডিক => দশমিকের জন্য মিথ্যা।


4

পিএইচপি <7.1 178 171 170 168 164 155 147 144 138 126 123 বাইট

for($b=$j=1,$i=strlen($x=$argn);+$x?$b<=$x:--$i;$b*=++$j)$r+=$x[$i]*$b;if(+$x)for(;$j>1;$x%=$b)$r.=$x/($b/=$j--)|0;echo+$r;

পাইপ হিসাবে চালান -rবা এটি অনলাইনে পরীক্ষা করুন

  • কোন এক্সটেনশন প্রয়োজন
  • কোন উপ ফাংশন প্রয়োজন: ফ্যাক্টরিয়াল বেস পুনরায় ব্যবহার করা হচ্ছে (লুপগুলিতে বৃদ্ধি / হ্রাস)
  • খাঁটি পূর্ণসংখ্যা এবং স্ট্রিং গাণিতিকগুলি, এমনকি পিএইচপি 3 এ কাজ করা উচিত (এবং এখনও পিএইচপি 7 তে কাজ করে):
  • 0 রিটার্ন পরিবর্তে খালি স্ট্রিং দশমিকে 0(অন্য দুটি পিএইচপি উত্তরগুলিও করেন)) যদি তা গ্রহণযোগ্য না হয় তবে অতিরিক্ত ক্ষেত্রে আরও +5 যোগ করুন।

ungolfed:

// two loops in one: compute the decimal number from a factorial
// or find the first factorial larger than a decimal $x
// the latter inits $r with '0': $i=strlen -> $x[$i]=='' -> (int)$x[$i]==$x[$i]*$b==0
// $b is the current digit´s base; $j is the bases´ latest factor
for($b=$j=1,$i=strlen($x=$argn);+$x?$b<=$x:--$i;$b*=++$j)
    $r+=$x[$i]*$b;
// and now for dec->fact ...
if(+$x)
    for(;$j>1;$x%=$b)
        // both $b and $j are one step too far in the first iteration;
        // -> decrement must precede the actual loop body
        // -> can be merged into the digit calculation -> all braces golfed
        $r.=$x/($b/=$j--)|0;
        // now: go on with the remainder (see loop head)
echo+$r; // final type cast removes leading zeros (from the first loop)
    // and fixes the '0' result (no operations at all on that input!)

পরিত্যক্ত গল্ফিং ধারণা:

  • $b<=$x-> $b<$x(-1)
    খাঁটি দশমিক ফ্যাক্টরিয়ালগুলি ভেঙে ফেলবে (অর্থাত্ এটি কেবলমাত্র একটি অ-শূন্য অঙ্কের সাথে একটি সংখ্যাসূচক সংখ্যার ফলস্বরূপ)। জেএমপিসির সমাধান সেখান থেকে ভুগছে; হামজাজ না।
  • floor($x/$b)-> (int)($x/$b)
    কিছুটা দ্রুত হতে পারে তবে কাস্টিং পূর্ববর্তী বিভাগ টাইপ করতে পারে তাই আমার প্রথম বন্ধনী প্রয়োজন এবং একটি বাইট অর্জন করা উচিত না।
    $x/$b|0কৌতুক করে
  • ফ্যাক্ট-> ডিসে লুপটি ডেস-> ফ্যাক্টরিয়াল-ফাইন্ডের অনুরূপ। একই বৃদ্ধি, শরীর কিছু যায় আসে না, তবে দুর্ভাগ্যক্রমে ভিন্ন প্রিসেট এবং বিভিন্ন পোস্ট শর্ত। dang; সেখানে 21 গল্ফ হতে পারে।
    হ্যাঁ আমি একটি সমাধান পেয়েছি। বেশ কিছুটা গল্ফ নিয়েছিল, কিন্তু অন্য -4 কেটে ফেলেছে (নং: -9) এবং সমস্ত বাগ / লুপফোলগুলি বন্ধ করে দিয়েছে।

আর কোনও সম্ভাবনা ... বা আমি গল্ফিং করেছি?


@ জার্গহেলসারম্যান ইঙ্গিতটির জন্য ধন্যবাদ।
তিতাস

1
+$rপরিবর্তে $r|0একটি বাইট সংরক্ষণ করুন। একই জন্যif($x|0)
জার্গ হালসারম্যান

3

জাভাস্ক্রিপ্ট (ইএস 6) 139 137 122 113 111

কিছু অ্যারে ম্যাজিক ব্যবহার করে একটি ভিন্ন পদ্ধতির চেষ্টা করেছি; তবে আমি এটি শেষ করে 174 172 বাইটে শেষ করেছি :

f=x=>{if('!'==x[0]){a=x.split``.reverse();i=b=1;r=0;a.pop();a.map(d=>{r+=d*b;b*=++i})}else{t=[];for(i=b=1;b<=x;b*=++i){t.unshift(b)}r='';t.map(b=>{r+=x/b|0;x%=b})}return r}

সুতরাং আমি আমার পিএইচপি কোডটি নিয়েছি এবং এটি অনুবাদ করেছি। সমস্ত $গুলি এবং কয়েকটি মুছে ফেলতে পারে ;তবে ভার্স আরম্ভ করার প্রয়োজনীয়তা সেই সুবিধাটি খেয়েছিল। উভয় উত্তর কিছুটা নিচে গল্ফ পরিচালিত, যদিও।

golfed

f=x=>{for(r=0,b=j=1,i=x.length;x|0?b<=x:--i;b*=++j)r+=x[i]*b;if(x|0)for(r='';j>1;x%=b)r+=x/(b/=j--)|0;return r}
  • দশমিক 0 এর জন্য প্রথম সংস্করণ '' দেয়; ঠিক করতে +2 যোগ করুন
  • দ্বিতীয় সংস্করণে স্ট্রিং ইনপুট দরকার
  • উভয় ফায়ারফক্স, এজ এবং অপেরা পরীক্ষিত

ungolfed

f=x=>
{
    for(r=0,b=j=1,i=x.length;x|0?b<=x:--i;b*=++j)
        r+=x[i]*b;
    if(x|0)
        for(r='';j>1;x%=b)
            r+=x/(b/=j--)|0;
    return r
}

পরীক্ষা স্যুট

<table id=out border=1><tr><th>dec</th><th>result<th>expected</th><th>ok?</th></tr></table>
<script>
    addR=(r,s)=>{var d=document.createElement('td');d.appendChild(document.createTextNode(s));r.appendChild(d)}
    test=(x,e)=>{var y=f(x),r=document.createElement('tr');addR(r,x);addR(r,y);addR(r,e);addR(r,e==y?'Y':'N');document.getElementById('out').appendChild(r)}
    samples={'349':'24201','1234':'141120','746':'101010','719':'54321','381':'30311','24':'1000','0':'0'};
    for(d in samples){test(d,samples[d]);test('!'+samples[d],d)}
</script>

1
ES5- এ তীর স্বরলিপি আইআরসি নেই। এবং আপনি যদি ES6 ব্যবহার করতে চলেছেন তবে .split('')=>.split``
জাচারা

@ জাচার্ন জেনা আমার লক্ষ্য করা উচিত ছিল যে আমি এটি কোন ব্রাউজারে পরীক্ষা করেছি ... সম্ভবত ফায়ারফক্স বা অপেরা। তাহলে ES 6?
তিতাস

হ্যাঁ, তীর চিহ্নটি ES6।
জাকারি

1
ওহ, যা আমাকে পাহারাদার থেকে ধরা দিয়েছে, আমি ভেবেছিলাম শীর্ষে কোড ব্লকটিই আপনার সমাধান! নির্বিশেষে, আমি আপনাকে বলার দরকার মনে করি না f=। এছাড়াও, হতে r+=(x/(b/=j--)|0)পারে r+=x/(b/=j--)|0?
জাকারি



1

হাস্কেল, 221 অক্ষর

কোড গল্ফ

m v@(a:b)|a=='!'=(sum.zipWith(*)g.map(read.(:[])).reverse) b|True=(fst.until((<0).fst.snd)(\(s,(i,b))->(s*10+b`quot`f i,(i-1,b`rem`f i))).(\n->(0,((1+).last.takeWhile((n>=).f)$[1..], n))).read) v;g=scanl1(*)[1..];f=(g!!)

ব্যবহার

$ ghci factorial.hs
ghci> m "1234"
 141120
ghci> m "!54321"
 719

অবহেলিত কোড

parse v@(a:b) | a == '!' = to b
              | otherwise = from v

to = sum . zipWith (*) factorials . map (read . (:[])) . reverse

from = fst . until finished next . boostrap . read
    where finished = ((<0) . fst . snd)
          next (s,(i,r)) = (s * 10 + r `quot` factorial i, (i-1 ,r `rem` factorial i))
          bootstrap n = (0, (lastFact n, n))
          lastFact n = (1+) . last . takeWhile ((n>=) . factorial) $ [1..]

factorials = scanl1 (*) [1..]

factorial = (factorials!!)

এখন পর্যন্ত সর্বাধিক পঠনযোগ্য এন্ট্রি। হাস্কেল এফটিডব্লিউ!
সোহম চৌধুরী

1

গণিত 213 177 175

একটি ফ্যাক্টরিয়াল নম্বর মোড়ানো হয় f[], তা ইনপুট বা আউটপুট।

g@{n_,j_,r_}:=If[j==0,FromDigits@r,g@{q=QuotientRemainder[n,j!];q[[2]],j-1,Append[r,q[[1]]]}]
z@n_:=If[!IntegerQ@n, g[{n[[1]],9,{}}], f@Tr@(p=1;# (p++)!&/@Reverse@IntegerDigits@n)]

ব্যবহার

z[24201]

চ [349]

z[f[349]]

24201

দশমিক সংখ্যায় ফ্যাটোরিয়াল রূপান্তর । প্রতিটি পদক্ষেপে QuotientRemainder[n,j!]হ্রাস jকরে বাম থেকে ডানে বাম দিকের কৌণিক সংখ্যার অঙ্কগুলিতে পুনরাবৃত্তভাবে কাজ করে । QuotientRemainder[349, 5!]উদাহরণস্বরূপ, রিটার্ন {2, 109}এবং আরও অনেক কিছু।

দশমিকের ফ্যাক্টরিয়াল সংখ্যায় রূপান্তর । ডান থেকে বামে সরানো, খাঁটি ফাংশন, যথাযথ ফ্যাকটোরিয়াল দ্বারা # (p++)! &প্রতিটি অঙ্ককে গুণ করে #


1

পাইথন, 128 টি অক্ষর

এটি চালাতে প্রায় আধা ঘন্টা সময় নেয় তবে এটি ছোট:

A=[`x`for x in xrange(10**9)if all(x/10**d%10<d+2 for d in range(9))]
i=raw_input()
print A.index(i[1:])if'!'in i else A[int(i)]

এটি সংখ্যার ক্রমে সমস্ত <= 9 ডিজিটের বাস্তব সংখ্যাগুলির একটি তালিকা তৈরি করে, তারপরে রূপান্তর করতে কোনও অনুসন্ধান বা সূচি তৈরি করে।

আপনি যদি পরীক্ষা করতে চান তবে কেবলমাত্র এটির 10**9সাথে প্রতিস্থাপন করুন 10**6এবং নিজেকে 6-সংখ্যার বৈকল্পিক সংখ্যাগুলিতে সীমাবদ্ধ করুন।

আমি প্রযুক্তিগতভাবে range(10**9)পরিবর্তে ব্যবহার করে একটি অক্ষর সংরক্ষণ করতে পারে xrange(10**9)। বাড়িতে এটি চেষ্টা করবেন না।


কোন স্থান মধ্যে প্রয়োজন হয় d+2এবংfor
Zachary

1

পিএইচপি 231 214 204

নতুন উত্তর

function g($x){return $x?$x*g($x-1):1;}function f($x,$e){if($x[0]=="!"){for($t=1;$t<$c=strlen($x);$t++){$e+=$x[$t]*g($c-$t);}}else{while(g(++$p)<=$x);while(--$p){$e.=floor($x/g($p));$x%=g($p);}}return$e;}

পুরানো উত্তর

 function f($n){if($n[0]=="!"){$n=str_split($n);$c=count($n);$f=$y=1;while($c-->1){$e+=($f*$n[$c]);$f*=++$y;}return$e;}else{for($i=$c=1;$i<$n;$i*=$c){$r[$c++]=$i;}foreach(array_reverse($r)as$t){$e.=floor($n/$t);$n=$n%$t;}return$e;}}

উদাহরণ

echo f('349')."\n"
    .f('!24201')."\n"
    .f('1234')."\n"
    .f('746')."\n"
    .f('!54321')."\n"
    .f('!30311');

আউটপুট

24201
349
141120
101010
719
381

2
আমি 214 নয়, নতুন উত্তরের জন্য 212 গণনা করছি $ ই এর কোনও আরম্ভ (-6) দরকার নেই এবং foreach(range())একটি সরল forলুপ (-9) দিয়ে প্রতিস্থাপন করা যেতে পারে । আমি যদিও ধারণা পছন্দ.
তিতাস

2
খাঁটি ফ্যাকটোরিয়ালগুলির জন্য ভুল ফলাফল 24ফিরে 1000আসা উচিত কিন্তু ফিরে 400। ঠিক করুন: g(++$p)<$x-> g(++$p)<=$x(+1)
টাইটাস

@ টিটাস আপনার উভয় জবাবের জন্য ধন্যবাদ! আমি আমার উত্তর আপডেট। আপনারা যখন আরও উচ্চতর বোধ করেন তখন আমার উত্তরকে উন্নত করতে আপনাকে সহায়তা করার জন্য আমি প্রশংসা করি।
জেপিএমসি

1
1) আমি আপনার চেয়ে 2 টি কম গণনা করেছি, আবার: 204, 206 নয় You আপনি কি আপনার বাইট গণনায় একটি উইন্ডোজ লাইন বিরতি অন্তর্ভুক্ত করবেন? 2) গঠনে সিনট্যাক্স ত্রুটি for: 3 ,হওয়া উচিত ;) আমার কোডে 20 বাইট সংরক্ষণের সাথে আরও 7 টি পরিবর্তন রয়েছে। তাদের চাই?
তিতাস

2
ঠিক আছে, এটি আসলে মাত্র পাঁচটি পরিবর্তন, তবে তাদের একটির তিনটি অংশ রয়েছে। ক) f () (-3) খ জন্য অপ্রচলিত দ্বিতীয় যুক্তি খ) ফাংশন জি (-1) গ মধ্যে অপ্রচলিত ফাঁকা গ) সত্য শাখায় অপ্রচলিত বন্ধনী (-4) d) সত্য এবং মিথ্যা শাখা অদলবদল, ifশর্ত বিপরীত , তারপর ব্যবহার আমার সেক্সি টাইপ কাস্ট টু ইন (-6) এটি দশমিক 0 ফলাফলকে প্রভাবিত করবে না! ঙ) বাকী forনির্মাণটি খুব সুন্দর করে আবারও লেখা যেতে পারে while(++$t<$c=strlen($x)): শরীরের আগে বৃদ্ধি -> no t কোনও প্রারম্ভিককরণের প্রয়োজন নেই (-6)
তিতাস

1

জেলি, 5 বাইট

Æ!ŒṘ€

ব্যাখ্যা

Æ!ŒṘ€
Æ!     -Convert to factoriadic (list form)
  ŒṘ€  -Construct string

* জেলি প্রশ্নের বয়সের চেয়ে কম বয়সী তাই আমার উত্তরটি নন-কেপটেটিং।


1
পিপিসিজিতে আপনাকে স্বাগতম! আমি মনে করি জেলি এই চ্যালেঞ্জের চেয়ে কম বয়সী, সুতরাং আপনার উত্তরটি প্রতিদ্বন্দ্বী হিসাবে চিহ্নিত করা উচিত।
লাইকনি

ওহ আমি বুঝতে পারি নি যে এটি একটি নিয়ম। করব.
ডাগারঅফমেসোগ্রেসিয়া

এই চ্যালেঞ্জের উত্তরগুলি উভয় উপায়েই কাজ করা বোঝায় না? এটি কেবল একভাবে কাজ করে বলে মনে হচ্ছে; আপনি এটি ঠিক করতে চান। (একটি পৃথক নোট অন, আপনি জেলি মধ্যে পূর্ণসংখ্যার এবং স্ট্রিং মধ্যে রূপান্তর করছি, এটি সাধারণত tersest কিছু সংমিশ্রণ ব্যবহার করতে Vএবং ।)

1

জেলি , 15 বাইট

ḊV€;0Æ¡µÆ!ṖḌƊ¬?

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

কিভাবে এটা কাজ করে

ḊV€;0Æ¡µÆ!ṖḌƊ¬?     Main link (monad). Input: integer or string
             ¬?  *) If the given input is a string, run 1); otherwise run 2)

ḊV€;0Æ¡  1) Factorial base -> integer
ḊV€         Remove "!" and map each char to number
   ;0       Append zero (this is needed to run the built-in correctly)
     Æ¡     Built-in conversion

Æ!ṖḌ  2) Integer -> factorial base
Æ!       Built-in conversion
  ṖḌ     Remove a zero at the end, and convert to decimal

কেন *)কাজ করে

¬এটি উপাদান অনুসারে যৌক্তিক নয়। যখন একটি একক পূর্ণসংখ্যা দেওয়া হয়, এটি একক শূন্য হয়ে যায়, যা মিথ্যা। তবে, যখন একটি স্ট্রিং দেওয়া হয়, প্রতিটি উপাদান (অক্ষর) একটি শূন্যে পরিণত হয়, এবং পুরো ফলাফলটি শূন্যের অ্যারে হয় যা সত্য।

পূর্ণসংখ্যা হিসাবে শূন্য একটি বিশেষ ক্ষেত্রে। এটি "ফ্যাটোরিয়াল -> পূর্ণসংখ্যা" রুট দিয়ে যায় তবে এটি এখনও শূন্য দেয় যা সঠিক।

অন্তর্নির্মিত ফ্যাক্টোরিয়াল বেস ছাড়া, 25 বাইট

⁵R!µ³%Ḋ:ṖUḌ
⁵R!ḋḊUV€ƊµÇ¬?

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

কিভাবে এটা কাজ করে

⁵R!µ³%Ḋ:ṖUḌ  Aux. link (monad). Integer -> factorial base
⁵R!µ         Set (1..10)! as left argument
    ³%Ḋ:Ṗ    Compute each digit: (input % (2..10)!) // (1..9)!
         UḌ  Reverse and convert the digit array to decimal

⁵R!ḋḊUV€ƊµÇ¬?  Main link (monad).
         怪?  If the input is a string, apply the left chain;
               otherwise, apply the aux. link above
⁵R!            (1..10)!
   ḋ           Dot product with...
    ḊUV€Ɗ      Remove "!", reverse, map each character to digit

0

কে, 102

"I"$,/$*:'|:'{{(x-y*g),g:_(x:*x)%y:*/1+!y}\[x,0n;|1+!{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]]}

অবশ্যই উন্নত করা যেতে পারে।

k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 349
24201
k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 746
101010
k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 1234
141120

0

ডি (159 অক্ষর)

int x(string n){import std.conv;int r,i=9,f=9*'鶀',d;if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}else{d=n.to!int;while(i){r=r*10+d/f;d%=f;f/=i--;}}return r;}

অসম্পূর্ণ এবং প্রোগ্রাম এন্ট্রি পয়েন্ট সহ

সমস্ত কমান্ড লাইন আর্গুমেন্ট হিসাবে মুদ্রিত করা হয় <original> -> <converted>। কেবলমাত্র দশমিকের দশমিক ক্ষেত্রে বাস্তবায়িত হয় xxফলাফলটি ইনপুটটির সমতুল্য না হওয়া পর্যন্ত অন্যভাবে সমস্ত দশমিক সংখ্যার (0 .. *) কল করে। বৃহত্তম ইনপুটটির জন্য এটি ~ 3 সেকেন্ড সময় নেয়! (987654321)।

নির্বাহযোগ্য অনলাইন সংস্করণ: http://dpaste.dzfl.pl/46e425f9

void main(string[] args) {
    import std.stdio;
    foreach (arg; args[1 .. $]) {
        writefln("%s -> %s", arg, x(arg));
    }
}

int x(string n) {
    import std.conv;
    int r, i=9, f=9*'鶀', d;  // 鶀's Unicode index equals 8*7*6*5*4*3*2*1

    // If the first character value is less than 48 ('0') it should be a '!'.
    if (n[0] < 48) {
        // Call x with different input (0..*) until it matches our n.
        // r.text.x is rewritten as x(text(r)).
        while (r.text.x < n[1..$].to!int) r++;
    } else {
        d = n.to!int;
        // Try d / 9!, d / 8!, etc. just as in the problem description.
        while (i) {
            r = r*10 + d/f;
            d %= f;
            f /= i--;
        }
    }
    return r;
}

আমি মনে করি একটি বাইট সংরক্ষণ string nকরার char[]nজন্য এটি পরিবর্তন করা সম্ভব হতে পারে (আমি জানি আমি এখানে দেরি করেছি)।
জাকারি

এছাড়াও, আমি মনে করি দুটি বাইট সংরক্ষণ if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}করতে পারে if(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
জাকারি

0

ভিবিএ 225

সহায়তার জন্য তিতাসকে ধন্যবাদ! এখনও আরও কিছু গল্ফ খুঁজছেন।

Sub a(b)
Set w=WorksheetFunction
e=Len(b)
If IsNumeric(b) Then
i=0
For d=0To 8
h=w.Fact(9-d)
g=b Mod h
If g<b+i Then
i=1
f=f &Int(b/h)
b=g
End If
Next
Else
For d=2To e
f=f+w.Fact(e-d-1)*Mid(b,d,1)
Next
End If
MsgBox f
End Sub

আমি ভিবিএ জানি না, তবে bপ্রথম অক্ষরের তুলনা করার পরিবর্তে কোনও সংখ্যাগত মান পরীক্ষা করার উপায় আছে কি?
তিতাস

@ টিটাস একটি সংখ্যার চেক আছে, এবং এখানে সমতুল্য হবে:, তবে এতে If Not IsNumeric(b) Thenআরও অক্ষর লাগে। এখন, আমি প্রবেশ করে সমস্ত কোডটি পুনরায় পরীক্ষা করিনি; IsNumericসামগ্রিকভাবে এটি করার কিছুটা ভাল উপায় হতে পারে । - সংশোধন, এখানে কিছুটা উন্নতি হয়েছে। ধন্যবাদ!
গাফি

: আমি অন্য চার বাইট পাওয়া For d=9To 1Step-1এবং Fact(d)> - For d=0To 8এবং Fact(9-d)এবং অন্য দুই যদি আপনি না For d=2To eএবংFact(e-d+1)*Mid(b,d,1)
তিতাস

টাইপটি ইন্টে কি অন্যভাবে লেখা যায়?
তিতাস

@ টিটাস আপনার দিকে তাকান, আমার চারপাশে চেনাশোনা চালাচ্ছেন। :) আমি এখন টুইট করছি ... ইন্ট () হিসাবে, আমি মনে করি না এর চেয়ে সহজ (ছোট) কোনও পদ্ধতি আছে, না।
গাফি

0

পিএইচপি , 124 বাইট

for($f=1;("$">$a=$argn)&&~$c=strrev($a)[$n];)$r+=$c*$f*=++$n;for(;$a>=$f*=++$i;);for(;~-$i;$a%=$f)$r.=0|$a/$f/=$i--;echo+$r;

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

সম্প্রসারিত

for($f=1;("$">$a=$argn)&&~$c=strrev($a)[$n];) # runs in case of "!" at the beginning
  $r+=$c*$f*=++$n; #reverse string multiply with the next factorial "!"*$f=0
for(;$a>=$f*=++$i;); # runs not in case of "!" at the beginning string comparing. search the factorial that is higher as input value
for(;~-$i;$a%=$f) # runs only when the second loop had runs
  $r.=0|$a/$f/=$i--; # concat the value of the division with the highest factorial used
echo+$r; # Output result

0

পার্ল 6 , 150 বাইট

{/^\!/??([+] [Z*] .comb.skip.reverse,[\*] 1..*)!!(reduce
->\a,\b{a[0]~a[1] div b,a[1]%b},("",+$_),|(first
*[*-1]>$_,[\,] [\*] 1..*).reverse[1..*])[0]}

0

এপিএল (এনএআরএস), 36 টি চর, 72 বাইট

{⍵⊆⎕D:10⊥(9..2)⊤⍎⍵⋄t+.×⌽!⍳≢t←⍎¨,1↓⍵}

মনে হয় যে 10⊥ (9..2) the রিকার্সিভ ফাংশনটির চেয়ে ভাল, অন্য এপিএল সমাধানের জন্য হাওয়ার্ডকে ধন্যবাদ যে এটি দেখায় ... (এমনকি আমি 100% বুঝতে না পারলেও)। '' ছাড়া সংখ্যার জন্য ইনপুট! <10 !. টেস্ট:

  u←{⍵⊆⎕D:10⊥(9..2)⊤⍎⍵⋄t+.×⌽!⍳≢t←⍎¨,1↓⍵}    
  u¨'1234' '746' '!54321' '!30311' '!24201'    
141120 101010 719 381 349 
  u '0'
0
  u '!0'
0
  u '9'
111
  u '!111'
9
  u '!9'
9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.