সূচী থেকে এক্সেল কলামের নাম উত্পন্ন করুন


21

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

এক্সেলটি তার কলামের শিরোনামকে ঠিক একইভাবে একটি স্ট্রিনে রূপান্তর করা লক্ষ্য এভাবে:

0 -> A
1 -> B
...
25 -> Z
26 -> AA
27 -> AB
...
51 -> AZ
52 -> BA
...
16,383 -> XFD

এটি কমপক্ষে 16,383 অবধি কাজ করতে হবে তবে এর বাইরেও এটি গ্রহণযোগ্য (যদিও কোনও বোনাস পয়েন্ট নেই)। আমি স # সমাধানের সর্বাধিক প্রত্যাশায় রয়েছি, তবে কোড-গল্ফের traditionsতিহ্য অনুসারে যে কোনও বাস্তব প্রোগ্রামিং ভাষা স্বাগত।


আপনি কি নিশ্চিত যে 16383 এক্সএফডি হওয়া উচিত? 676 এবং 702 এর জন্য আপনি কী পাবেন?
পিটার টেলর

ওয়েল, এটিই এক্সেল দেখায় এবং আমি এটি ওয়েবে খুঁজে পেয়েছি যে এটিতে 16384 কলাম রয়েছে। আমি আগামীকাল এটি আমাদের (কাজের জন্য পরিচিত) কোড দিয়ে পরীক্ষা করব (এখনই যেখানে থাকি সেখানে গভীর রাত হয়েছে)।
ভিলাক্স

এছাড়াও, এক্সেলের সাথে নিজেই পরীক্ষা করা প্রকাশ করে যে 676 = জেডএ এবং 702 = এএএ।
ভিলেক্স-

1
আমি জিজ্ঞাসার কারণটি হ'ল আমি কিছু সোজা বেস -২ code কোড লিখেছি, ফলাফল পেয়েছি যা আপনার সঠিকভাবে ফিট করে তবে broke 676 এবং 2০২
পিটার টেলর

1
হা. এটি বেস -26 নয়। এটাই সমস্যা। ;)
ভিলাক্স-

উত্তর:


3

পার্ল 6 ,16 14 বাইট

{("A"..*)[$_]}

এমনকি এক্সএফডি ছাড়িয়েও কাজ করে। পার্ল 6-এ অসীম তালিকার জন্য ধন্যবাদ, এটি কার্যকর করতে চিরকালের জন্য (এবং দেড়) সময় নেয় না।

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


20

এক্সেল সূত্র :), 36 টি অক্ষর

=SUBSTITUTE(ADDRESS(1,A1,4),"1","")

ব্যবহার:

এখানে চিত্র বর্ণনা লিখুন

দুঃখিত, প্রতিরোধ করতে পারিনি ...


Arghh! আমি আসলে এটি নিষিদ্ধ করার কথা ভেবেছিলাম, তবে পোস্টে এটি উল্লেখ করতে ভুলে গেছি! : ডি তবুও, এক্সেল সূত্রগুলি কোনও প্রোগ্রামিং ভাষা নয় (এবং হ্যাঁ, এক্সেল ভিবিএও সীমাবদ্ধ নয়)। : পি
ভিলাক্স-

@ ভিলাক্স- Godশ্বরের ধন্যবাদ কেউ একটি সংক্ষিপ্ত সমাধান নিয়ে এসেছিল। আমি একমাত্র ব্যক্তি যিনি এক্সেল সূত্রগুলি ব্যবহার করে গল্ফ প্রতিযোগিতা জিতেছেন বলে ইতিহাসে প্রবেশ করতে চাই না :)
ডঃ বেলিসারিয়াস

আমি এখনও আপনার উত্তর গ্রহণ করতে পারেন। >: ডি
ভিলাক্স-

3
<laughter type="evil">Muhahahahaha!</laughter>
ভিলেক্স-

4
আপনি প্রতিস্থাপন 2 বাইট ড্রপ করতে পারেন "1"সঙ্গে1
টেলর স্কট

9

পার্ল, 17 টি অক্ষর

say[A..XFD]->[<>]

..অপারেটর ঐন্দ্রজালিক স্বয়ংক্রিয় বৃদ্ধি একই জিনিস না, কিন্তু অস্থায়ী পরিবর্তনশীল এবং লুপ প্রয়োজন ছাড়াই। যদি না strict subsসুযোগ রয়েছে, barewords Aএবং XFDস্ট্রিং হিসেবে ব্যাখ্যা করা হয়।

( এই উত্তরটি কোনও বেনামে ব্যবহারকারীর দ্বারা বিদ্যমান উত্তরের সম্পাদনা হিসাবে প্রস্তাব করা হয়েছিল I আমি অনুভব করেছি যে এটি আলাদা উত্তর হওয়ার দাবিদার এবং এটিকে একটি করে দিয়েছি it যেহেতু এটির কাছ থেকে উত্তর অর্জন করা আমার পক্ষে উপযুক্ত হবে না, আমি ' এটি সম্প্রদায় উইকি বানিয়েছে ))


যেহেতু এটি এখন পর্যন্ত সংক্ষিপ্ত উত্তর, আমি অনুমান করি যে একটি সংক্ষিপ্ত সমাধান না পাওয়া পর্যন্ত এটি "গৃহীত" হিসাবে চিহ্নিত হওয়ার দাবিদার (সম্ভবত কেবলমাত্র জোনস্কিটস্ক্রিপ্টে উপলব্ধ): পি আইরনিক।
ভিলাক্স-

1
যেহেতু প্রশ্নটি ইনপুট এবং আউটপুট কীভাবে সম্পন্ন হয় তা সম্পর্কে অস্পষ্ট, এটি আসলে এটি যথেষ্ট সংক্ষিপ্তকরণের অনুমতি দেয়। উদাহরণস্বরূপ, যদি ইনপুট থাকে $_এবং আউটপুটটি প্রকাশের মান হয় তবে (A..XFD)[$_]কেবল 12 টি অক্ষর দিয়ে চ্যালেঞ্জটি সমাধান করে ।
ইলমারি করোনেন

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

@ এডভিস: এটি আপনার জন্য একটি সংখ্যায় টাইপ করার অপেক্ষা করছে। অথবা আপনি একটি ফাইলের মধ্যে নম্বর স্থাপন এবং করতে পারে perl -E 'say[A..XFD]->[<>]' < number.txt। অথবা, শেলগুলি যে এটি সমর্থন করে, কেবল কমান্ড লাইনে ইনপুট দিন perl -E 'say[A..XFD]->[<>]' <<< 123
ইলমারি করোনেন

1
আমি মনে করি say+(A..XFD)[<>]
এটিতে

6

সি, 53 টি অক্ষর

এটি হাতুড়ি দিয়ে গল্ফ খেলার মতো ...

char b[4],*p=b+3;f(i){i<0||(*--p=i%26+65,f(i/26-1));}

সাধারণ সংস্করণ:

char b[4];
char *p = b+3;
void f(int i) {
    if (i >= 0) {
        --p;
        *p = i%26 + 65;
        f(i/26-1);
    }
}

এবং ব্যবহারটি এর মতো:

int main(int argc, char *argv[])
{
    f(atoi(argv[1]));
    printf("%s\n", p);
    return 0;
}

5

হাস্কেল, 48

f=(!!)(sequence=<<(tail$iterate(['A'..'Z']:)[]))

কম গল্ফড:

f n = (concatMap sequence $ tail $ iterate (['A'..'Z'] :) []) !! n

ব্যাখ্যা

হাস্কেলের সংযুক্তকারী sequenceক্রিয়াগুলির একটি তালিকা গ্রহণ করে এবং সেগুলি সম্পাদন করে, প্রতিটি ক্রিয়াকলাপের ফলাফলকে তালিকায় ফিরিয়ে দেয়। উদাহরণ স্বরূপ:

sequence [getChar, getChar, getChar]

সমান:

do
    a <- getChar
    b <- getChar
    c <- getChar
    return [a,b,c]

হাসকেলে ক্রিয়াগুলি মানগুলির মতো আচরণ করা হয় এবং >>=(বাইন্ড) এবং returnআদিম ব্যবহার করে একসাথে আঠালো করা হয় । কোনও মোনাড উদাহরণ থাকার পরে যদি এই অপারেটরগুলি প্রয়োগ করে তবে কোনও ধরণের একটি "ক্রিয়া" হতে পারে ।

ঘটনাচক্রে, তালিকার ধরণটিতে একটি ম্যানড উদাহরণ রয়েছে। উদাহরণ স্বরূপ:

do
    a <- [1,2,3]
    b <- [4,5,6]
    return (a,b)

এটি সমান [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]। কীভাবে তালিকার বোধগম্যতা লক্ষণীয়ভাবে অনুরূপ: লক্ষ্য করুন

[(a,b) | a <- [1,2,3], b <- [4,5,6]]

যেহেতু তালিকাগুলি এক ধরণের "ক্রিয়া", তাই আমরা sequenceতালিকা সহ ব্যবহার করতে পারি । উপরোক্ত হিসাবে প্রকাশ করা যেতে পারে:

sequence [[1,2,3],[4,5,6]]

সুতরাং, sequenceআমাদের বিনামূল্যে সংমিশ্রণ দেয়!

সুতরাং, তালিকা তৈরি করতে:

["A","B"..."Z","AA","AB"]

পাস করার জন্য আমার কেবল তালিকা তৈরি করা দরকার sequence

[['A'..'Z'],['A'..'Z','A'..'Z'],...]

তারপরে তালিকাগুলিতে concatMapপ্রয়োগ করুন sequenceএবং ফলস্বরূপ তালিকাগুলি একত্রিত করুন। কাকতালীয়ভাবে, concatMapহয় =<<, তাই তালিকা একসংখ্যা আমাকে একটা কয়েকটি অক্ষর এখানে খুব শেভ দেয় তালিকার জন্য ফাংশন।



3

রুবি, 35 টি অক্ষর

e=->n{a=?A;n.times{a.next!};a}

ব্যবহার:

puts e[16383]   # XFD

দ্রষ্টব্য: পুনরাবৃত্তি ব্যবহার করে একটি সংক্ষিপ্ত সংস্করণ (30 টি অক্ষর) রয়েছে।

    e=->n{n<1??A:e[n-1].next}

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


3

গ্রোভি, 47

m={it<0?'':m(((int)it/26)-1)+('A'..'Z')[it%26]}

[0:'A',1:'B',25:'Z',
        26:'AA',
        27:'AB',
        51:'AZ',
        52:'BA',
        16383:'XFD'].collect {k,v-> assert v == m(k);m(k) }

3

পাইথন 45 51

f=lambda i:i>=0and f(i/26-1)+chr(65+i%26)or''

আপনি নিজের 1 অক্ষর সংরক্ষণ করে +chr(65+i%26)ভিতরে টান দিয়ে এবং পরীক্ষা করে 2 টি বন্ধনী সরাতে পারেন i>=0:)
কোসিমোডো

আপনি এর f=lambda i:চেয়ে 4 অক্ষর শেভ করতে পারেনdef f(i):return
স্ট্রাইগয়েডস

আসলে এটি 37 নম্বর বা তদূর্ধ্বের জন্য ভাল কাজ করে না। আমাকে এই কোডটি কিছুটা আপডেট করতে হয়েছিল:f = lambda i: i >= 0 and f(math.floor(i / 26 - 1)) + chr(int(round(65 + i % 26))) or ''
user007

2

স্কালা, 62 অক্ষর

def f(i:Int):String=if(i<0)""else f((i/26)-1)+(i%26+65).toChar

ব্যবহার:

println(f(16383))

আয়:

XFD

আপনি এটি সহজভাবে স্কেলে চেষ্টা করতে পারেন । ফাংশনটি অনুলিপি করুন এবং পেস্ট করুন এবং f(some integer)ফলাফলটি দেখতে ব্যবহার করুন ।


আপনি প্রয়োজন হবে না ""+উপর elseকেস।
পিটার টেলর

2

এক্সেল ভিবিএ, 31 বাইট

বেনামে VBE অবিলম্বে উইন্ডো ফাংশন যা ঘর থেকে ইনপুট নেয় [A1]এবং ভিবিই তাত্ক্ষণিক উইন্ডোতে আউটপুট নেয়

?Replace([Address(1,A1,4)],1,"")

2

জাভাস্ক্রিপ্ট (নোড.জেএস) , 50 বাইট

f=_=>_<0?'':f(_/26-1)+String.fromCharCode(_%26+65)

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

প্রচুর লোকেরা এর উত্তর দিতে শুরু করে দেখে আমিও উত্তর দিয়েছি।

বিঃদ্রঃ :

এটি মূলত জাভাতে @ কেভিন ক্রুজসেনের উত্তরটি খুব শীঘ্রই বন্ধ করে দিয়েছে এটি জেএসকে ধন্যবাদ জানায়।


2

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

for($c=A;$argn--;)$c++;echo$c;

Pipe -nr 'দিয়ে পাইপ হিসাবে চালান বা অনলাইনে চেষ্টা করুন


আমি নিশ্চিত যে এটি যা প্রয়োজন তা করে না। পরে বরং Zএটি যেতে হবে । [AA
ভিলক্স-

@ ভিলেক্স- আমি এটিকে প্রমাণ হিসাবে গ্রহণ করি যে আপনি খুব বেশি পিএইচপি জানেন না। আমি একটি টিআইও যোগ করেছি; নিজের জন্য দেখুন.
তিতাস

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

1

ভিবিএ / ভিবি 6 / ভিবিএস স্ক্রিপ্ট (অ এক্সেল), 73 বাইট

Function s(i):While i:i=i-1:s=Chr(i Mod 26+65)&s:i=i\26:Wend:End Function

কলিং s(16383)ফিরবে XFC


পিপিসিজিতে আপনাকে স্বাগতম! আপনি কি ভিবি-র সাথে অপরিচিত ব্যবহারকারীদের জন্য একটি ব্যাখ্যা যুক্ত করতে পারেন?
অ্যাডমবর্কবার্ক

1
@ অ্যাডমবার্কবার্ক পূর্বের উত্তরগুলিতে যুক্ত করার মতো বেশি নয়, কেবল ভাষার বাঁধাই!
এলএস_ᴅᴇᴠ

এটি সমস্ত ক্ষেত্রেই ব্যর্থ বলে মনে হচ্ছে যেখানে i>675 - s(676)=A@@(প্রত্যাশিত YZ), s(677)=A@A(প্রত্যাশিত ZA)
টেলর স্কট

1
@ টেলরস্কট আপনি ঠিক বলেছেন এটিতে কাজ করা হচ্ছে ...
LS_ᴅᴇᴠ

1
@ টেলরস্কট সংশোধন, +6 বাইট ... ধন্যবাদ
এলএস_ᴅᴇᴠ

1

জাভাস্ক্রিপ্ট, 147 বাইট

আমারও একই সমস্যা ছিল। এটি সমাধানের গল্ফ। এক্সেল কলাম হয় bijective বেস-26

n=>{f=Math.floor;m=Math.max;x=m(0,f((n-24)/676));y=m(0,f(n/26-x*26));return String.fromCharCode(...[x,y,n+1-x*676-y*26].filter(d=>d).map(d=>d+64))}

1-সূচক ব্যবহার ব্যতীত প্রসারিত:

function getColName(colNum){ // example: 16384 => "XFD"
    let mostSig = Math.max(0, Math.floor((colNum - 26 - 1)/26**2));
    let midSig = Math.max(0, Math.floor((colNum - mostSig*26**2 - 1)/26));
    let leastSig = colNum - mostSig*26**2 - midSig*26;

    return String.fromCharCode(...[mostSig,midSig,leastSig].filter(d=>d).map(d=>d+64));
}

1
আপনি একটি টিআইও লিঙ্ক যুক্ত করতে পারেন। এটি ছাড়া একটি দুর্দান্ত প্রথম উত্তর। পিপিসিজিতেও স্বাগতম।
মুহাম্মদ সালমান

এছাড়াও 7 বছর আগে জিজ্ঞাসিত একটি প্রশ্নের উত্তর দেওয়া আসলেই দুর্দান্ত ধারণা নয়।
মুহাম্মদ সালমান

ঠিক আছে, এনভিএম এটি এতগুলি স্তরে ভুল যে আমি কখনই এটি দেখিনি
মুহাম্মদ সালমান

আমি এই প্রশ্নটি জিজ্ঞাসা করতে চেয়েছিলাম তবে এটি একটি সদৃশ ছিল। আমি নিশ্চিত না আপনি
@

আমি এক মিনিটের মধ্যে আপনার কাছে ফিরে আসব, যাইহোক পিপিসিজিতে স্বাগতম। চমৎকার উত্তর. প্লিজ নোট করুন যে উত্তর লেখার সময় আপনাকে অবশ্যই একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন সরবরাহ করতে হবে
মুহাম্মদ সালমান 15

1

জাভা, 57 বাইট (পুনরাবৃত্ত)

String f(int n){return n<0?"":f(n/26-1)+(char)(n%26+65);}

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

ব্যাখ্যা:

String f(int n){        // Recursive method with integer parameter and String return-type
  return n<0?           //  If `n` is negative:
    ""                  //   Return an empty String
   :                    //  Else:
    f(n/26-1)           //   Recursive call with `n` integer-divided by 26, minus 1
    +(char)(n%26+65);}  //   And append `n%26+65` as character

জাভা 10, 62 বাইট (পুনরাবৃত্ত)

n->{var r="";for(;n>=0;n=n/26-1)r=(char)(n%26+65)+r;return r;}

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

ব্যাখ্যা:

n->{                      // Method with integer parameter and String return-type
  var r="";               //  Result-String, starting empty
  for(;n>=0;              //  Loop as long as `n` is not negative
      n=n/26-1)           //    After every iteration: divide `n` by 26, and subtract 1
    r=(char)(n%26+65)+r;  //   Prepend `n%26+65` as character to the result-String
  return r;}              //  Return the result-String

ওহে. দুঃখিত তবে আমি আপনার কোডটি চুরি করেছি: এখানে । :)
মুহাম্মদ সালমান

@ মুহাম্মাদসালমান হেহে, কোনও সমস্যা নেই। আমি আসলে আমার স্কেল উত্তরটি পেয়েছি । ;)
কেভিন ক্রুইজসেন

1

ফোর্থ (গফোর) , 59 বাইট

: f dup 0< if drop else 26 /mod 1- recurse 65 + emit then ;

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

ব্যাখ্যা

dup 0<            \ duplicate the top of the stack and check if negative
if drop           \ if negative, drop the top of the stack
else              \ otherwise
   26 /mod        \ divide by 26 and get the quotient and remainder
   1- recurse     \ subtract one from quotient and recurse on result
   65 + emit      \ add 65 to remainder and output ascii char
then              \ exit if statement


1

পাওয়ারশেল, 68 বাইট

param($n)for(;$n-ge0;$n=($n-$r)/26-1){$s=[char](($r=$n%26)+65)+$s}$s

বিকল্প পুনরাবৃত্তি সংস্করণ, 68 বাইট:

filter g{if($_-ge0){(($_-($r=$_%26))/26-1|f)+[char]($r+65)}else{''}}

পরীক্ষার স্ক্রিপ্ট:

$f = {

param($n)for(;$n-ge0;$n=($n-$r)/26-1){$s=[char](($r=$n%26)+65)+$s}$s

}

filter g{if($_-ge0){(($_-($r=$_%26))/26-1|f)+[char]($r+65)}else{''}}


@(
    ,(0 , "A")
    ,(1 , "B")
    ,(25 , "Z")
    ,(26 , "AA")
    ,(27 , "AB")
    ,(51 , "AZ")
    ,(52 , "BA")
    ,(676 , "ZA")
    ,(702 , "AAA")
    ,(16383 , "XFD")
) | % {
    $n, $expected = $_
    $result = &$f $n
    # $result = $n|g      # Alternative
    "$($result-eq$expected): $result"
}

আউটপুট:

True: A
True: B
True: Z
True: AA
True: AB
True: AZ
True: BA
True: ZA
True: AAA
True: XFD

দ্রষ্টব্য: পাওয়ারশেল কোনও divঅপারেটর সরবরাহ করে না ।


0

হাস্কেল, 48

আমি সত্যিই ভেবেছিলাম যে আমি অন্যান্য হাস্কেলের প্রবেশকে পরাজিত করতে পারব, তবে হায় হায় ...

f(-1)=""
f n=f(div n 26-1)++[toEnum$mod n 26+65]

আমি নিশ্চিত যে এ থেকে কয়েকটা চরিত্রের শেভ করা সম্ভব, তবে আমি প্রায় এক বছর ধরে হাস্কেলকে কোড করি নি, তাই আমি বেশ মরিচা পড়ে আছি।

আপনি ঠিক মার্জিত বলা হবে এটি ঠিক নয়।


খারাপ না! :) তবে হা - 3 বছরেরও বেশি পরে, এখনও কোনও # সমাধান নেই। : ডি
ভিলক্স-

হাহাহা। তবে এই একই পদ্ধতি ব্যবহার করে লেখার জন্য একটি সি # সমাধান তুচ্ছ। string f(int n){return n<0?"":f(n/26-1)+(char)(n%26+65);}57 টি অক্ষর, সুতরাং আমি উত্তর হিসাবে পোস্ট করে প্রায় খারাপ লাগবে।
Fors

0

Jq 1.5 , 71 বাইট

[range(1;4)as$l|[65+range(26)]|implode/""|combinations($l)]|map(add)[N]

ইনপুট আশা করে N। যেমন

def N:16383;

সম্প্রসারিত:

[                       # create array with
   range(1;4) as $l     #  for each length 1,2,3
 | [65+range(26)]       #   list of ordinal values A-Z
 | implode/""           #   converted to list of strings ["A", "B", ...]
 | combinations($l)     #   generate combinations of length $l
]
| map(add)[N]           # return specified element as a string

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



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