আপনার সমস্ত বাইজিক বেসটি আমাদের us


25

পটভূমি

একটি দ্বিখণ্ডিত বেস সংখ্যা , যেখানে একটি ধনাত্মক পূর্ণসংখ্যা, একটি দ্বি দ্বিপদী অবস্থানিক স্বরলিপি যা 1 থেকে এর সাথে সম্পর্কিত মানগুলির সাথে বি চিহ্নগুলির ব্যবহার করে ।

এর দ্বি-দ্বি-বিভক্ত প্রতিরূপের মতো, কোনও চিহ্নের মান 0 হয় না । এই ভাবে, প্রতিটি অ নেতিবাচক পূর্ণসংখ্যা এন টি অনন্য bijective বেস প্রতিনিধিত্ব

জনপ্রিয় বাইজিক সংখ্যাগুলির মধ্যে আনরিয়াল, বাইজিক বেস 2 ( বিজিপ 2 এর রান-লেন্থ এনকোডিংয়ে ব্যবহৃত ) এবং বাইজিক বেস 26 (স্প্রেডশিটে কলামগুলি সংখ্যায় ব্যবহৃত হয়) অন্তর্ভুক্ত রয়েছে।

সংজ্ঞা

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

123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>

এবং একটি ফাংশন আমি থেকে এম প্রাকৃতিক সংখ্যা যেমন যে আমি ( '1') = 1, ..., আমি ( '>') = 64

একটি বেসের মধ্যে 1 এবং 64 (উভয় সমেত), আমরা প্রতিটি অ নেতিবাচক পূর্ণসংখ্যা যে সংজ্ঞায়িত এন স্ট্রিং সাথে সঙ্গতিপূর্ণ একটি ... একটি 0 , এর প্রতীক সম্বলিত এম , যেমন যে এন = খ k আমি (ক ) + + … + বি 0 আই (একটি 0 )

এই চিঠিপত্রটি সুনির্দিষ্টভাবে সংজ্ঞায়িত এবং বাইজেক্টিভ। যেহেতু একটি খালি যোগফল 0 হিসাবে সংজ্ঞায়িত করা হয় , তাই পূর্ণসংখ্যা 0 একটি খালি স্ট্রিং হিসাবে এনকোড করা যায়।

কার্য

ইনপুট হিসাবে তিনটি স্ট্রিং গ্রহণ করুন:

  • 1 এবং 64 এর মধ্যে একটি ইনপুট বেস বি , একটি বাইজিক বেস 64 স্ট্রিং হিসাবে এনকোড ।

  • একটি অ-নেতিবাচক পূর্ণসংখ্যা n , যা বাইজিক বেস বি স্ট্রিং হিসাবে এনকোডড ।

  • 1 এবং 64 এর মধ্যে একটি আউটপুট বেস বি , একটি বাইজিক বেস 64 স্ট্রিং হিসাবে এনকোড ।

এই তিনটি ইনপুট দেওয়া হয়েছে, বাইজিক বেস বি স্ট্রিং হিসাবে এনকোড এন

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

সমস্ত পরীক্ষার ক্ষেত্রে বি , এন , বি অর্ডার ইনপুট নির্দিষ্ট করে ।

Input:  "4" "" "8"
Output: ""

Input:  "A" "16" "2"
Output: "1112"

Input:  "2" "122" "A"
Output: "A"

Input:  "3" "31" "1"
Output: "1111111111"

Input:  ">" "Fe" "a"
Output: "RS"

বিধি

  • আপনি যে কোনও সুবিধাজনক ক্রমে তিনটি স্ট্রিং পড়তে পারেন, যেমন, স্ট্রিংগুলির একটি অ্যারে, এর একটি স্ট্রিং প্রতিনিধিত্ব, আপনার পছন্দসই একক-অক্ষর ডিলিমিটারগুলি দ্বারা একত্রিত বা পৃথক।

  • আপনি যদি আউটপুটটি STDOUT এ মুদ্রণ করতে চান, আপনি কেবল প্রতীকগুলি এবং (allyচ্ছিকভাবে) একটি ট্রেলিং নিউলাইন মুদ্রণ করতে পারেন।

  • সকল ধরণের বিল্ট-ইনগুলি ভিত্তিতে রূপান্তর অনুমোদিত।

  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।

উত্তর:


6

সিজেম, 43

qA,s"?[a{A<":,:^+:Mf#):B;(bLa{(Bmd)M=\j\+}j

ডেনিসের সাহায্যে 3 বাইট মুছে ফেলা হয়েছে :) এটি অনলাইনে চেষ্টা করুন

ব্যাখ্যা:

ইনপুটটি bnBএকক স্ট্রিংয়ের সাথে সংমিশ্রিত হিসাবে নেওয়া হয় ।

q           read the input
A,s         make an array of numbers from 0 to 9 and convert to string
"?[a{A<"    push this string, which contains the ends of 3 character ranges:
             uppercase letters: ['A'…'[')
             lowercase letters: ['a'…'{')
             "<=>": ['<'…'?')
             they're in a special order for the symmetric difference below
:,          for each character, make a range of all characters smaller than it
:^          fold/reduce these 6 ranges using symmetric difference
+           concatenate with the digits before
:M          save in M; this is like the M from the statement,
             except it starts with a zero (for matching indexes)
f#          find the indexes in M of all characters from the input string
)           take out the last value from the array
:B;         save it in B and pop it
(           take out the first value
b           use it as a base and convert the remaining array to a number
             this works even if some of the digits are not in the "normal" range
La{…}j      calculate with memoized recursion, using an empty string for value 0
  (         decrement the number
  Bmd       divide by B and get the quotient and remainder
  )         increment the remainder (this is the last digit in bijective base B)
  M=        get the corresponding character from M
  \j        swap with the quotient, and convert the quotient recursively
  \+        swap again and concatenate

ওহ, আপনি আসলে প্রথম বেস রূপান্তরকরণের জন্য নিয়মিত বেস রূপান্তরকারী অপারেটরটি ব্যবহার করতে পারেন? আমার সমাধানে আমার কাছে থাকা সমস্ত কোড ব্যবহার করার জন্য আমি নির্বোধ বোধ করছি। :) আমি বুঝতে পারি নি যে এটি মানগুলির সীমার বাইরে থাকা মানগুলির সাথে কাজ করবে। ঠিক আছে, অন্ধকারে, এটি না করার উপযুক্ত কারণ নেই।
রেটো কোরাডি

@ রিটোকোরাদি হ্যাঁ, আপনি এটি করতে পারেন; একদিন এটি নথিভুক্ত করা হবে :)
অ্যাডিটসু

বেস রূপান্তরটি ব্যবহার করার জন্য যদি আমি আমার সমাধানটি পরিবর্তন করি তবে আপনি কি আপত্তি করছেন? আমি সাধারণত অন্য সমাধানগুলি থেকে ধারণা নেওয়া এড়ানোর চেষ্টা করি। তবে সত্যই আমাকে এ জাতীয় উপ-অনুকূল পদ্ধতির সাথে দাঁড় করিয়ে দেওয়ার জন্য আমার বাগ লাগছে। এটি খুব সম্ভবত আপনার সমাধানটি আরও খাটো হবে।
রেটো কোরাডি

@ রিটোকোরাদি কোনও সমস্যা নেই, এগিয়ে যান
অদিতসু

4

পিপ, 84 80 78 বাইট

m:J[,tAZLCAZ"<=>"]p:$+(m@?^b)*(m@?a)**RV,#bs:m@?cWn:px:(mn-(p:n//s-!n%s)*s).xx

পাইপের জন্য গিটহাবের সংগ্রহস্থল

অ্যালগরিদম উইকিপিডিয়া নিবন্ধ থেকে অভিযোজিত। কিছুটা দোষ না দেওয়া পূর্বের সংস্করণটির ব্যাখ্যা এখানে:

                 Implicit: initialize a,b,c from cmdline args; t=10;
                 AZ=uppercase alphabet; x=""
m:               Build lookup table m:
 (J,t)             0123456789 (i.e. join(range(10)))...
 .AZ               plus A-Z...
 .LCAZ             plus lowercase a-z...
 ."<=>"            plus <=>
f:{              Define f(a,b) to convert a from bijective base b to decimal:
 $+                Sum of...
  (m@?^a)            list of index of each character of a in m
  *                  multiplied item-wise by 
  b**RV,#a           b to the power of each number in reverse(range(len(a)))
}
t:{              Define t(a,b) to convert a from decimal to bijective base b:
 x:""              Reset x to empty string (not needed if only calling the function once)
 Wa{               While a is not zero:
  p:a//b-!a%b        p = ceil(a/b) - 1 (= a//b if a%b!=0, a//b-1 otherwise)
  x:m@(a-p*b).x      Calculate digit a-p*b, look up the corresponding character in m, and
                     prepend to x
  a:p                p becomes the new a
 }
 x                 Return x
}
(t               Return result of calling t with these arguments:
 (f                Result of calling f with these arguments:
  b                  2nd cmdline arg
  m@?a)              1st cmdline arg's decimal value
 m@?c              3rd cmdline arg's decimal value
)
                 Print (implicit)

নমুনা রান:

dlosc@dlosc:~/golf$ python pip.py bijectivebase.pip ">" "Fe" "a"
RS

4

অক্টাভা, 166 বাইট

function z=b(o,x,n)
M=['1':'9','A':'Z','a':'z','<=>'];N(M)=1:64;n=N(n);x=polyval(N(x),N(o));z='';while x>0 r=mod(x,n);t=n;if r t=r;end;z=[M(t),z];x=fix(x/n)-(r<1);end

মাল্টি-লাইন সংস্করণ:

function z=b(o,x,n)
   M=['1':'9','A':'Z','a':'z','<=>'];
   N(M)=1:64;
   n=N(n);
   x=polyval(N(x),N(o));
   z='';
   while x>0
      r=mod(x,n);
      t=n;if r t=r;end;
      z=[M(t),z];
      x=fix(x/n)-(r<1);
   end
%end // implicit - not included above

একটি অক্ষরকে একটি সূচক মানের রূপান্তর করতে মানচিত্র তৈরি করার পরিবর্তে আমি কেবলমাত্র Nআসকি মানগুলির জন্য বিপরীতমুখী সারণী তৈরি করেছি 1..'z'এবং উপযুক্ত মানগুলিতে সূচকগুলি সহ এটি তৈরি করেছি।

polyval সমীকরণ মূল্যায়ন

সি 1 x কে + সি 2 এক্স কে -1 + ... + সি কে x 0

দশমিক-রূপান্তরিত ইনপুট মানটি সহগের ভেক্টর cএবং মূল বেস হিসাবে ব্যবহার করে x। (দুর্ভাগ্যক্রমে, অষ্টাভের base2dec()প্রতীকগুলি সাধারণ পরিসরের বাইরে প্রত্যাখ্যান করেছে))

একবার বেস 10-এ ইনপুট মান হয়ে গেলে, নতুন বেসে মানের গণনা সোজা ward

পরীক্ষামূলক চালক:

% script bijecttest.m
a=b('4','','8');
disp(a);
a=b('A','16','2');
disp(a);
a=b('2','122','A');
disp(a);
a=b('3','31','1');
disp(a);
a=b('>','Fe','a');
disp(a);

ফলাফল:

>> bijecttest

1112
A
1111111111
RS
>>

2

পার্ল, 261 248 229 বাইট

sub t{$b=0;$b*=$_[1],$b+=ord($1=~y/0-9A-Za-z<=>/\0-A/r)while$_[0]=~/(.)/g;return$b}sub r{$n=$_[0];$n-=$m=($n-1)%$_[1]+1,$d=(chr$m)=~y/\0-A/0-9A-Za-z<=>/r.$d,$n/=$_[1]while$n;print$d}@a=split/,/,<>;r(t(@a[1],t@a[0],64),t@a[2],64)

বহু-লাইন, যখন লুপগুলি অবরুদ্ধ:

sub t{ # convert bijective base string to number
    $b=0;
    while($_[0]=~/(.)/g)
        {$b*=$_[1];$b+=ord($1=~y/0-9A-Za-z<=>/\0-A/r)}
    return$b}
sub r{ # convert number to bijective base string
    $n=$_[0];
    while($n)
        {$n-=$m=($n-1)%$_[1]+1;$d=(chr$m)=~y/\0-A/0-9A-Za-z<=>/r.$d;$n/=$_[1]}
    print$d}
@a=split/,/,<>; # parse input
r(t(@a[1],t@a[0],64),t@a[2],64)

tপ্রদত্ত বেসের বাইজিক-বেস স্ট্রিং থেকে একটি সংখ্যাকে পার্স করার একটি ফাংশন। rএকটি সংখ্যা থেকে প্রদত্ত বেসের বাইজিক-বেস স্ট্রিং উত্পন্ন করার জন্য একটি ফাংশন। 3 টি কমা-বিচ্ছিন্ন প্যারামিটারগুলি স্টিডিন থেকে পার্স করা হয় এবং প্রয়োজন অনুযায়ী ফাংশনগুলি ডাকা হয়।

একটি ধনাত্মক সংখ্যাকে বাইজিক বেস স্ট্রিংয়ে রূপান্তর করা সাধারণ বেসের মতো to তবে যেখানে আপনি সাধারণ বেসের জন্য এমন কিছু করবেন:

string s = ""
while(n)
{
    c = (n % base)
    s = (c + '0') + s
    n -= c // not necessary because the division will take care of it
    n /= base 
}

আপনি 0 থেকে বেস - 1 এর পরিবর্তে 1 থেকে বেস পর্যন্ত একটি পরিসীমা দিতে মোডকে সামঞ্জস্য করেন:

string s = ""
while(n)
{
    c = (((n-1) % base)+1)
    s = (c + '0') + s
    n -= c  // necessary in the case c = base
    n /= base 
}

2

পাইথন 2, ... 317 307 298 311 বাইট

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

আমার পদ্ধতিটি হ'ল ইনপুটটিকে দশমিক সংখ্যায় রূপান্তর করা, তারপরে আউটপুট বেসে, তারপরে এটিকে বাইজিক বেসে রূপান্তর করা।

সম্পাদনা : পাওয়া গেছে যে ইউনারিতে রূপান্তর করার সময় আমার প্রোগ্রামটি কার্যকর হয়নি। এটা দিয়ে ঠিক করতে 13 বাইট খরচ e=F(o)<2, ইত্যাদি

এখানে চেষ্টা করুন

R=range;M="".join(map(chr,R(48,58)+R(65,91)+R(97,123)))+"<=>"
b,s,o=input()
F=M.find
e=F(o)<2
B=lambda n:n and B(n/F(o)-e)+M[n%F(o)+e]or""
n=B(sum(F(s[~j])*F(b)**j for j in R(len(s))))
i=n.find('0')
n=list(n)
while-~i:n=n[:i-1]+[M[F(n[i-1])-1]]+[o]+n[i+1:];n=n["0"==n[0]:];i="".join(n).find('0')
print"".join(n)

1
আমি আপনার পাইথন পোষা প্রাণীর peeves সাথে একমত
ডিএলকাস

@DLosc গল্ফ সাহায্যের জন্য ধন্যবাদ।
mbomb007


তালিকাগুলি .index()পদ্ধতি আছে .. কেন এটি পরিবর্তে এটি ব্যবহার করবেন না? এছাড়াও, সংরক্ষণের পরিবর্তে F(b)এবং F(o)ভেরিয়েবলগুলির পরিবর্তে , আপনি কেবল সেগুলি একবার ব্যবহার করুন, সুতরাং যেখানে প্রয়োজন সেখানে কেবল এটি সাব করে দিন। পরিশেষে, এর 'n'[2::5]চেয়ে সংক্ষিপ্ত ''.join(n)(ব্যাকটিক্সের জন্য অ্যাডাস্ট্রোফেস প্রতিস্থাপন)।
কেড

এছাড়াও, আমি মনে করি আপনি এটি অত্যধিক জটিল করে তুলছেন .. স্ট্রিং এম বাইজিক বেস বেস থেকে দশমিক হিসাবে রূপান্তর 35-40 বাইটের বেশি গ্রহণ করা উচিত নয়। বাইজিক বেস বিয়ের একটি স্ট্রিংয়ের দশমিক এর চেয়ে বেশি হবে না।
কেড

2

পাইথন 2, 167 বাইট

এখানে কোনও বিশেষ ট্রিকস নেই, [2::5]কম বাইট গণনায় চারসেট পেতে টুকরো টুকরা করা ছাড়া ।

x=range;A=`map(chr,x(49,58)+x(65,91)+x(97,123))`[2::5]+'<=>'
r=A.find
b,n,B=input()
B=r(B)+1
d=0;s=''
for c in n:d=d*-~r(b)+r(c)+1
while d:d-=1;s=A[d%B]+s;d/=B
print s

পরীক্ষা:

"4","","8"     >>> (empty string)
">","Fe","a"   >>> RS
"3","31","1"   >>> 1111111111
"A","16","2"   >>> 1112
"2","122","A"  >>> A

2

সিজেম, 73 70 69 55 51 48 বাইট

সর্বশেষ সংস্করণটি সোর্স বেস থেকে রূপান্তরকরণের জন্য সিজেএম বেস রূপান্তরকারী অপারেটরটি ব্যবহার করে, যা আমি @ অ্যাডিতসুর সমাধানটি না দেখে অবধি ভাবিনি। এটি "ডিজিটাল" স্ট্রিং ( /codegolf//a/54348/32852 ) নির্মাণের জন্য @ ডেনিসের সাম্প্রতিক টিপটি প্রয়োগ করে , পাশাপাশি চ্যাটে ভাগ করা কিছু অন্যান্য ধারণাগুলিও প্রয়োগ করে।

lA,s'[,_el^+"<=>"+:Lf#Ll#bLl#:K;{(Kmd)L=\}hs-]W%

ইনপুট ফর্ম্যাট হল মান এবং তারপরে উত্স এবং গন্তব্য ভিত্তি, প্রত্যেকটির একটি পৃথক লাইনে থাকে। খালি স্ট্রিংয়ের জন্য, প্রথম লাইনটি খালি ছেড়ে দিন। উদাহরণ ইনপুট:

122
2
A

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

ব্যাখ্যা:

l       Get and interpret value from input.
A,s     Build the list of 64 "digits". Start with [0..9]
'[,     Build character sequence from \0 to Z.
_el     Lower case copy of the same sequence.
^       Symmetric set difference gives only letters from both sequences.
+       Concatenate with sequence of decimal digits, creating [0..9A..Za..z].
"<=>"   Remaining 4 characters.
+       Concatenate, resulting in full 64 character "digit" string.
:L      ... and store it in variable L for repeated use.
f#      Look up input characters in digit list.
Ll#     Get source base from input, and look up value in digit list.
b       Base conversion. This produces the input value.
Ll#     Get destination base from input, and look up value in digit list.
:K;     Store it in variable K for use in loop, and pop it off stack.
{       Loop for generating output digits.
  (       Decrement to get ceiling minus 1 after division.
  Kmd     Calculate divmod of current value with destination base.
  )       Increment mod to get 1-based value for digit.
  L=      Look up digit character for digit value.
  \       Swap. Digit stays on stack for output, remaining value is processed
          in next loop iteration until it is 0.
}h      End of loop for generating output digits.
s       Final value is 0. Covert it to a string.
-       And subtract it from second but last value. This eliminates the 0,
        as well as the second but last value if it was a \0 character.
]       Wrap digits in array.
W%      Reverse array, to get result from MSB to LSB.

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