স্ট্রিং সহ বেস রূপান্তর


16

ভূমিকা

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

চ্যালেঞ্জ

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

আরও কিছু বিবরণ এবং নিয়ম নীচে রয়েছে:

  • রূপান্তরিত করার সংখ্যাটি একটি অ-নেতিবাচক পূর্ণসংখ্যা হবে (যেহেতু -এবং .চরিত্রের সেটে হতে পারে)। সুতরাং খুব আউটপুট হবে।
  • শীর্ষস্থানীয় শূন্যগুলি (চরিত্রের সেটটিতে প্রথম অক্ষর) ছাঁটাই করা উচিত। ফলাফলটি যদি শূন্য হয় তবে একটি একক শূন্য সংখ্যা থাকবে।
  • নূন্যতম সমর্থিত বেস ব্যাপ্তিটি মুদ্রণযোগ্য আসকি অক্ষর সমন্বয়ে 2 থেকে 95 অবধি।
  • রূপান্তরিত করতে সংখ্যার ইনপুট, অক্ষর সেট এবং আউটপুট সমস্ত স্ট্রিং ডেটাটাইপের হতে হবে। বেসগুলি অবশ্যই বেস -10 পূর্ণসংখ্যা ডেটাটাইপ (বা পূর্ণসংখ্যার ভাসমান) এর হতে হবে।
  • ইনপুট নম্বর স্ট্রিংয়ের দৈর্ঘ্য খুব বড় হতে পারে। কোনও বুদ্ধিমান ন্যূনতম পরিমাণ নির্ধারণ করা শক্ত, তবে এটি কমপক্ষে 1000 টি অক্ষর পরিচালনা করতে সক্ষম হবে এবং একটি শালীন মেশিনে 10 সেকেন্ডেরও কম সময়ে 100 টি অক্ষরের ইনপুট সম্পূর্ণ করতে সক্ষম হবে (এই ধরণের সমস্যার জন্য খুব উদার, তবে আমি চাই না) ফোকাস হতে গতি)।
  • আপনি পরিবর্তিত-বেস ফাংশনগুলিতে নির্মিত ব্যবহার করতে পারবেন না।
  • অক্ষর সেট ইনপুট যে কোনও বিন্যাসে হতে পারে, কেবল আদর্শ 0-9a-z ... ইত্যাদি নয়।
  • ধরে নিন যে কেবল বৈধ ইনপুট ব্যবহার করা হবে। ত্রুটি পরিচালনার বিষয়ে চিন্তা করবেন না।

বিজয়ীটি সংক্ষিপ্ততম কোড দ্বারা নির্ধারিত হবে যা মানদণ্ডটি সম্পাদন করে। এগুলি কমপক্ষে base বেস -10 দিনের মধ্যে বা যদি / যখন পর্যাপ্ত জমা দেওয়া হয়েছে তা নির্বাচিত হবে। টাই হওয়ার ক্ষেত্রে, যে কোডটি দ্রুত চলে তা বিজয়ী হবে। যদি গতি / পারফরম্যান্সে পর্যাপ্ত পরিমাণ থাকে তবে আগে যে উত্তরটি আসে তা জয়ী হয়।

উদাহরণ

আপনার কোড হ্যান্ডেল করতে সক্ষম হওয়া ইনপুট এবং আউটপুট এর কয়েকটি উদাহরণ এখানে রয়েছে:

F("1010101", 2, 10, "0123456789")
> 85

F("0001010101", 2, 10, "0123456789")
> 85

F("85", 10, 2, "0123456789")
> 1010101

F("1010101", 10, 2, "0123456789")
> 11110110100110110101

F("bababab", 2, 10, "abcdefghij")
> if

F("10", 3, 2, "0123456789")
> 11

F("<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> !!~~~~~~~!!!~!~~!!!!!!!!!~~!!~!!!!!!~~!~!~!!!~!~!~!!~~!!!~!~~!!~!!~~!~!!~~!!~!~!!!~~~~!!!!!!!!!!!!~!!~!~!~~~~!~~~~!~~~~~!~~!!~~~!~!~!!!~!~~

F("~~~~~~~~~~", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? ")
> ~

F("9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz")
> 231ceddo6msr9

F("ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
> 6173180047113843154028210391227718305282902

F("howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> o3K9e(r_lgal0$;?w0[`<$n~</SUk(r#9W@."0&}_2?[n

F("1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? ")
> this is much shorter

আমরা করেছি অবাধ দৈর্ঘ্য সংখ্যার মোকাবেলায় পরিকল্পিত ছিল।
পিটার টেলর

@ পিটারটেলর ওয়েল ডাং, কোনওভাবে আমার সন্ধানে সেটিকে মিস করেছেন। তবুও, আমি তর্ক করব যে তারা যথেষ্ট আলাদা। অন্য একটিতে একটি ডিফল্ট অক্ষর সেট, মাল্টি-বাইট সিকোয়েন্সস, ত্রুটি হ্যান্ডলিং এবং সিকোয়েন্স-টু-সিকোয়েন্স রূপান্তর জড়িত। এগুলি উত্তরে আরও বড় ফোঁটা যুক্ত করে এবং বিভিন্ন অপ্টিমাইজেশনে মনোনিবেশ করে। এই চ্যালেঞ্জটি আরও অনেক ছাঁটাই হয়েছে এবং এর ফলে অন্য চ্যালেঞ্জ (কোর অ্যালগরিদমের সংক্ষিপ্ত) থেকে সম্পূর্ণ আলাদা কোড আসবে।
Mwr247

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

7
যদিও এই চ্যালেঞ্জটি আগেরটির মতোই একই রকম, তবে আমি আসলে এটির একটি রূপ হিসাবে পূর্ববর্তীটি বন্ধ করার পক্ষে ছিলাম। এই চ্যালেঞ্জটি পুরানোটির চেয়ে অনেক পরিষ্কার এবং উচ্চ মানের।
মেগো

আপনি কি কিছুটা ব্যাখ্যা করতে পারেন You cannot use built in change-of-base functions to convert the entire input string/number at once? বিশেষত, আমি কি ইনপুটটিকে মধ্যবর্তী বেসে রূপান্তর করতে একটি বিল্ট-ইন ব্যবহার করতে পারি? তাহলে আমি কি টার্গেট বেসে রূপান্তর করতে একটি বিল্ট-ইন ব্যবহার করতে পারি? কিছু চাইবে convert input with canonical form for given base; convert to base 10; convert to target base; convert back to specified character set with string replacement?
মেগো

উত্তর:


5

সিজেম, 34 বাইট

0ll:Af#lif{@*+}~li:X;{XmdA=\}h;]W%

ইনপুট ফর্ম্যাট input_N alphabet input_B output_Bপ্রতিটি পৃথক লাইনে।

সমস্ত পরীক্ষার কেস চালান।

ব্যাখ্যা

0     e# Push a zero which we'll use as a running total to build up the input number.
l     e# Read the input number.
l:A   e# Read the alphabet and store it in A.
f#    e# For each character in the input number turn it into its position in the alphabet,
      e# replacing characters with the corresponding numerical digit value.
li    e# Read input and convert to integer.
f{    e# For each digit (leaving the base on the stack)...
  @*  e#   Pull up the running total and multiply it by the base.
  +   e#   Add the current digit.
}
~     e# The result will be wrapped in an array. Unwrap it.
li:X; e# Read the output base, store it in X and discard it.
{     e# While the running total is not zero yet...
  Xmd e#   Take the running total divmod X. The modulo gives the next digit, and
      e#   the division result represents the remaining digits.
  A=  e#   Pick the corresponding character from the alphabet.
  \   e#   Swap the digit with the remaining value.
}h
;     e# We'll end up with a final zero on the stack which we don't want. Discard it.
]W%   e# Wrap everything in an array and reverse it, because we've generated the 
      e# digits from least to most significant.

এটি একই বাইট গণনার জন্য কাজ করে:

L0ll:Af#lif{@*+}~li:X;{XmdA=@+\}h;

পার্থক্যটি হ'ল আমরা স্ট্যাকের সবকিছু সংগ্রহ এবং এটির পরিবর্তে স্ট্রিং তৈরি করছি।


7

পাইথন 2 , 115 114 106 105 94 বাইট

গল্ফিং পরামর্শ স্বাগত জানাই। এটি অনলাইন চেষ্টা করুন!

সম্পাদনা করুন: -9 বাইট mbomb007 ধন্যবাদ। -২ বাইটস ফ্লিপট্যাককে ধন্যবাদ।

def a(n,f,t,d,z=0,s=''):
 for i in n:z=z*f+d.find(i)
 while z:s=d[z%t]+s;z/=t
 print s or d[0]

Ungolfed:

def arbitrary_base_conversion(num, b_from, b_to, digs, z=0, s=''):
    for i in num:
        z = z * b_from + digs.index(i)
    while z:
        s = digs[z % b_to] + s
        z = z / t
    if s:
        return s
    else:
        return d[0]

1
while z:s=d[z%t]+s;z/=t9 বাইট সংরক্ষণ
mbomb007

আপনি রাখতে পারেন z=0এবং s=''বাইটস সংরক্ষণ করার জন্য ফাংশন ঘোষণা।
ফ্লিপট্যাক

ব্যবহার printপরিবর্তে returnহয় ডিফল্ট অনুসারে অনুমোদিত
ফ্লিপট্যাক

6

সিরিয়াসলি, 50 বাইট

0╗,╝,2┐,3┐,4┐╛`4└í╜2└*+╗`MX╜ε╗W;3└@%4└E╜@+╗3└@\WX╜

হেক্স ডাম্প:

30bb2cbc2c32bf2c33bf2c34bfbe6034c0a1bd32c02a2bbb60
4d58bdeebb573b33c0402534c045bd402bbb33c0405c5758bd

আমি এর দৈর্ঘ্য সত্ত্বেও এটি নিয়ে গর্বিত। কেন? কারণ এটি দ্বিতীয় চেষ্টাতে পুরোপুরি কাজ করেছিল। আমি এটি লিখেছিলাম এবং আক্ষরিক 10 মিনিটে এটি ডিবাগ করেছি। সাধারণত সিরিয়াসলি প্রোগ্রাম ডিবাগ করা এক ঘন্টা শ্রম।

ব্যাখ্যা:

0╗                                                  Put a zero in reg0 (build number here)
  ,╝,2┐,3┐,4┐                                       Put evaluated inputs in next four regs
             ╛                                      Load string from reg1
              `         `M                          Map over its chars
               4└                                   Load string of digits
                 í                                  Get index of char in it.
                  ╜                                 Load number-so-far from reg0
                   2└*                              Multiply by from-base
                      +                             Add current digit.
                       ╗                            Save back in reg0
                          X                         Discard emptied string/list.
                           ╜                        Load completed num from reg0
                            ε╗                      Put empty string in reg0
                              W                W    While number is positive
                               ;                    Duplicate
                                3└@%                Mod by to-base.
                                    4└E             Look up corresponding char in digits
                                       ╜@+          Prepend to string-so-far.
                                                      (Forgetting this @ was my one bug.)
                                          ╗         Put it back in reg0
                                           3└@\     integer divide by to-base.
                                                X   Discard leftover 0
                                                 ╜  Load completed string from reg0
                                                    Implicit output.

3

সিএম (ফাংশন) জিএমপি লাইব্রেরি সহ , 260

এটি আমার প্রত্যাশার চেয়ে বেশি দিন বেরিয়েছে তবে এখানে এটি যাইহোক। mpz_*কাপড় সত্যিই বাইট অনেকটা খরচ করে। আমি চেষ্টা করেছি #define M(x) mpz_##x, তবে এটি 10 ​​বাইটের নেট লাভ করেছে।

#include <gmp.h>
O(mpz_t N,int t,char*d){mpz_t Q,R;mpz_inits(Q,R,0);mpz_tdiv_qr_ui(Q,R,N,t);mpz_sgn(Q)&&O(Q,t,d);putchar(d[mpz_get_ui(R)]);}F(char*n,int f,int t,char*d){mpz_t N;mpz_init(N);while(*n)mpz_mul_ui(N,N,f),mpz_add_ui(N,N,strchr(d,*n++)-d);O(N,t,d);}

ফাংশনটি F()এন্ট্রি-পয়েন্ট। এটি ডিজিট তালিকার প্রদত্ত অঙ্কের সূচকটি -বেস এবং সংযোজন mpz_tদ্বারা ধারাবাহিক গুণিত দ্বারা ইনপুট স্ট্রিংটিকে fromএকটিতে রূপান্তর করে ।

ফাংশনটি O()একটি পুনরাবৃত্তির আউটপুট ফাংশন। প্রতিটি পুনরাবৃত্তি-বেজ mpz_tদ্বারা toভাগ করে। যেহেতু এটি বিপরীত ক্রমে আউটপুট অঙ্কগুলি উপার্জন করে, পুনরাবৃত্তি কার্যকরভাবে অঙ্কগুলি স্ট্যাক এবং আউটপুটকে সঠিক ক্রমে সংরক্ষণ করতে দেয়।

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

পঠনযোগ্যতার জন্য নিউলাইনস এবং ইনডেন্টিং যোগ করা হয়েছে।

#include <stdio.h>
#include <string.h>

#include <gmp.h>
O(mpz_t N,int t,char*d){
  mpz_t Q,R;
  mpz_inits(Q,R,0);
  mpz_tdiv_qr_ui(Q,R,N,t);
  mpz_sgn(Q)&&O(Q,t,d);
  putchar(d[mpz_get_ui(R)]);
}
F(char*n,int f,int t,char*d){
  mpz_t N;
  mpz_init(N);
  while(*n)
    mpz_mul_ui(N,N,f),mpz_add_ui(N,N,strchr(d,*n++)-d);
  O(N,t,d);
}

int main (int argc, char **argv) {
  int i;

  struct test_t {
    char *n;
    int from_base;
    int to_base;
    char *digit_list;
  } test[] = {
    {"1010101", 2, 10, "0123456789"},
    {"0001010101", 2, 10, "0123456789"},
    {"85", 10, 2, "0123456789"},
    {"1010101", 10, 2, "0123456789"},
    {"bababab", 2, 10, "abcdefghij"},
    {"10", 3, 2, "0123456789"},
    {"<('.'<)(v'.'v)(>'.'>)(^'.'^)", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? "},
    {"~~~~~~~~~~", 31, 2, "~!@#$%^v&*()_+-=`[]{}|';:,./<>? "},
    {"9876543210123456789", 10, 36, "0123456789abcdefghijklmnopqrstuvwxyz"},
    {"ALLYOURBASEAREBELONGTOUS", 62, 10, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"},
    {"howmuchwoodcouldawoodchuckchuckifawoodchuckcouldchuckwood", 36, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? "},
    {"1100111100011010101010101011001111011010101101001111101000000001010010100101111110000010001001111100000001011000000001001101110101", 2, 95, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+=[{]}\\|;:'\",<.>/? "},
    {0}
  };

  for (i = 0; test[i].n; i++) {
    F(test[i].n, test[i].from_base, test[i].to_base, test[i].digit_list);
    puts("");
  }

  return 0;
}

3

জাভাস্ক্রিপ্ট (ES6), 140 বাইট

(s,f,t,m)=>[...s].map(c=>{c=m.indexOf(c);for(i=0;c||i<r.length;i++)r[i]=(n=(r[i]|0)*f+c)%t,c=n/t|0},r=[0])&&r.reverse().map(c=>m[c]).join``

@ Mwr247 এর কোডের বিপরীতে (যা প্রতিটি সময়কে টি দ্বারা বিভক্ত করতে বেস-চ গাণিতিক ব্যবহার করে, প্রতিটি অবশিষ্ট হিসাবে তিনি সংগ্রহ করার সময় সংগ্রহ করে) আমি প্রতিটি সময় উত্তরকে চ এর সাথে গুণিত করতে বেস-টি গাণিতিক ব্যবহার করি, প্রতিটি সংখ্যার সাথে আমি যেতে যেতে যোগ করি।

Ungolfed:

function base(source, from, to, mapping) {
    result = [0];
    for (j = 0; j < s.length; s++) {
        carry = mapping.indexOf(s[j]);
        for (i = 0; carry || i < result.length; i++) {
            next = (result[i] || 0) * from + carry;
            result[i] = next % to;
            carry = Math.floor(next / to);
         }
    }
    string = "";
    for (j = result.length; j --> 0; )
        string += mapping[result[j]];
    return string;
}

3

রুবি, 113 112 105 98 97 95 87 বাইট

আমি আমার পাইথন উত্তরটি (কোনওভাবে) ডাবল পোস্ট করেছি, তাই এখানে একটি রুবি উত্তর। ম্যানটওয়ার্কের জন্য আরও সাতটি বাইট ধন্যবাদ, মার্টিন বাটনারকে আরও একটি বাইট এবং সিআইআরানা-কে আরও 8 টি বাইট ধন্যবাদ ।

->n,f,t,d{z=0;s='';n.chars{|i|z=z*f+d.index(i)};(s=d[z%t]+s;z/=t)while z>0;s[0]?s:d[0]}

Ungolfed:

def a(n,f,t,d)
  z=0
  s=''
  n.chars do |i|
    z = z*f + d.index(i)
  end
  while z>0 
    s = d[z%t] + s
    z /= t
  end
  if s[0]   # if n not zero
    return s
  else
    return d[0]
  end
end

s=d[z%t]+s;z/=tপরিবর্তে ব্যবহার সম্পর্কে কীভাবে z,m=z.divmod t;s=d[m]+s?
cia_rana

3

এপিএল, 10 বাইট

{⍺⍺[⍵⍵⍳⍵]}

এটি একটি এপিএল অপারেটর। এপিএলে, এবং মানগুলি পাস করার জন্য ব্যবহৃত হয়, যখন ⍵⍵এবং ⍺⍺সাধারণত ফাংশনগুলি পাস করতে ব্যবহৃত হয়। আমি এখানে 3 টি যুক্তি দেওয়ার জন্য এটি গালাগালি করছি। ⍺⍺বাম আর্গুমেন্ট, ⍵⍵"অভ্যন্তরীণ" ডান যুক্তি এবং এটি "বাহ্যিক" ডান আর্গুমেন্ট।

মূলত: ⍺(⍺⍺{...}⍵⍵)⍵

তারপরে যা দরকার তা হ'ল "থেকে" টেবিলের ইনপুট স্ট্রিংয়ের অবস্থানগুলি অনুসন্ধান করা এবং তারপরে []এই অবস্থানগুলির সাথে "টু" টেবিলের সূচীতে ব্যবহার করুন ।

উদাহরণ:

    ('012345'{⍺⍺[⍵⍵⍳⍵]}'abcdef')'abcabc'
012012

2

জাভাস্ক্রিপ্ট (ES6), 175 বাইট

(s,f,t,h)=>eval('s=[...s].map(a=>h.indexOf(a));n=[];while(s.length){d=m=[],s.map(v=>((e=(c=v+m*f)/t|0,m=c%t),e||d.length?d.push(e):0)),s=d,n.unshift(m)}n.map(a=>h[a]).join``')

অনুভূত হয়েছে যে এখন দীর্ঘকাল হয়ে গেছে যে উদাহরণগুলি তৈরি করতে আমি যেটি তৈরি করেছি তা জমা দিতে পারি। আমি চেষ্টা করে দেখতে পারি এবং আরও পরে এটি গল্ফ করতে পারি।


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