इंडेक्स से एक्सेल कॉलम नाम बनाएं


21

यह एक वास्तविक जीवन की समस्या से आता है। हमने इसे हल किया, लेकिन निश्चित रूप से यह महसूस करता है कि इसे बेहतर किया जा सकता है, यह बहुत लंबा और गोल चक्कर समाधान है। हालाँकि मेरा कोई भी सहकर्मी इसे लिखने के अधिक रसीले तरीके के बारे में नहीं सोच सकता है। इसलिए मैं इसे कोड-गोल्फ के रूप में प्रस्तुत करता हूं।

लक्ष्य यह है कि जिस तरह से एक्सेल अपने कॉलम हेडर को प्रस्तुत करता है उसी तरह एक नॉनजेटिव पूर्णांक को एक स्ट्रिंग में परिवर्तित करें। इस प्रकार:

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

इसमें कम से कम 16,383 तक काम करना पड़ता है , लेकिन इससे परे भी स्वीकार्य है (कोई बोनस अंक नहीं)। मैं सी # समाधान के लिए सबसे आगे देख रहा हूं, लेकिन, कोड-गोल्फ की परंपराओं के अनुसार, किसी भी वास्तविक प्रोग्रामिंग भाषा का स्वागत है।


क्या आप सुनिश्चित हैं कि 16383 XFD होना चाहिए? 676 और 702 के लिए क्या मिलता है?
पीटर टेलर

खैर, यह वही है जो एक्सेल दिखाता है, और मैंने इसे वेब पर पाया कि इसमें 16384 कॉलम हैं। मैं इसे कल हमारे (काम करने के लिए ज्ञात) कोड के साथ परीक्षण करूंगा (अभी देर रात है, जहां मैं रहता हूं)।
विल्क्स-

साथ ही, एक्सेल के साथ परीक्षण से ही पता चलता है कि 676 = ZA और 702 = AAA।
विल्क्स-

1
मेरे द्वारा पूछे जाने का कारण यह है कि मैंने कुछ सीधा आधार -26 कोड लिखा था, जिसके परिणाम आपको ठीक मिले, लेकिन 676 और 702 पर टूट गया।
पीटर टेलर

1
हाँ। यह बेस -26 नहीं है। यही समस्या है। ;)
विल्क्स-

जवाबों:



20

एक्सेल फॉर्मूला :), 36 वर्ण

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

उपयोग:

यहां छवि विवरण दर्ज करें

क्षमा करें, विरोध नहीं कर सका ...


Arghh! मैंने वास्तव में इसे प्रतिबंधित करने के बारे में सोचा था, लेकिन पोस्ट में इसका उल्लेख करना भूल गया! : D स्टिल, एक्सेल फ़ार्मुले एक प्रोग्रामिंग लैंग्वेज नहीं है (और हाँ, एक्सेल VBA ऑफ लिमिट्स भी है)। : पी
विल्क्स-

@ विलक्स- भगवान का शुक्र है कि कोई छोटा समाधान लेकर आया। मैं इतिहास को केवल एक व्यक्ति के रूप में दर्ज नहीं करना चाहता, जिसने एक्सेल
फॉर्मूलों

मैं अब भी आपका उत्तर स्वीकार कर सकता हूं। >: डी
विल्क्स- 13

3
<laughter type="evil">Muhahahahaha!</laughter>
विल्क्स-

4
आप की जगह 2 बाइट्स ड्रॉप कर सकते हैं "1"के साथ1
टेलर स्कॉट

9

पर्ल, 17 अक्षर

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

..ऑपरेटर जादुई ऑटो वेतन वृद्धि के रूप में एक ही बात करता है, लेकिन अस्थायी चर और पाश की आवश्यकता के बिना। जब तक strict subsगुंजाइश नहीं है, नंगे पासवर्ड Aऔर XFDस्ट्रिंग्स के रूप में व्याख्या किए जाते हैं।

( यह उत्तर किसी अनाम उपयोगकर्ता द्वारा किसी मौजूदा उत्तर को संपादित करने के रूप में सुझाया गया था । मुझे लगा कि यह एक अलग उत्तर देने के योग्य है, और इसे एक बना दिया है। चूंकि यह मेरे लिए इसे पुनः प्राप्त करने के लिए उचित नहीं होगा, इसलिए मैं ' मैंने इसे सामुदायिक विकी बना दिया है। )


चूंकि यह अब तक का सबसे छोटा जवाब है, इसलिए मुझे लगता है कि इसे "स्वीकार" के रूप में चिह्नित किया जाना चाहिए, जब तक कि एक छोटा समाधान नहीं मिलता है (शायद केवल जॉनस्केटेस्क्रिप्ट में उपलब्ध है): पी आयरनिक।
विल्क्स

1
चूंकि यह सवाल अस्पष्ट है कि इनपुट और आउटपुट कैसे किया जाता है, जो वास्तव में इसे काफी कम कर देता है। उदाहरण के लिए, यदि इनपुट में है $_और आउटपुट अभिव्यक्ति का मूल्य है, तो (A..XFD)[$_]केवल 12 वर्णों के साथ चुनौती हल करता है ।
इल्मरी करोनन

क्षमा करें, यह कैसे चलाया जाना चाहिए? Perl 5.18 के साथ यह कुछ भी नहीं छापता है जब -E को तर्क के रूप में दिया जाता है।
एड एविस

@EdAvis: यह आपके लिए संख्या में टाइप करने की प्रतीक्षा कर रहा है। या आप किसी फ़ाइल में नंबर डाल सकते हैं और कर सकते हैं 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''

आप 2 कोष्ठकों को +chr(65+i%26)अंदर खींच कर निकाल सकते हैं और परीक्षण कर सकते हैं i>=0, जिससे आप 1 पात्र बचा सकते हैं :)
quasimodo

तुम भी 4 पात्रों से दाढ़ी कर सकते थे f=lambda i:बजाय का उपयोग करकेdef f(i):return
Strigoides

वास्तव में यह संख्या 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

एक्सेल VBA, 31 बाइट्स

बेनामी VBE तत्काल विंडो फ़ंक्शन जो सेल से इनपुट लेता है [A1]और VBE तत्काल विंडो में आउटपुट करता है

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

2

जावास्क्रिप्ट (Node.js) , 50 बाइट्स

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

इसे ऑनलाइन आज़माएं!

यह देखकर कि बहुत से लोगों ने इसका जवाब देना शुरू कर दिया, मैंने भी जवाब दिया।

ध्यान दें :

यह मूल रूप से जावा में @ kevinCruijssen के उत्तर का एक चीर है जो जेएस होने के लिए धन्यवाद देता है।


2

PHP, 30 बाइट्स

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

`-Nr 'के साथ पाइप के रूप में चलाएँ या इसे ऑनलाइन आज़माएँ


मुझे पूरा यकीन है कि यह वह नहीं करता जो आवश्यक है। इसके बजाय Zइसके [बजाय जाना होगा AA
विल्क्स-

@ विलक्स- मैं इसे सबूत के रूप में लेता हूं कि आप बहुत से PHP नहीं जानते हैं। मैंने एक तिवारी को जोड़ा; अपने आप को देखो।
टाइटस

पवित्र ... तुम सही हो! मैं PHP को अच्छी तरह से जानता हूं, लेकिन यह अजीब सामान से भरा है, यह सब जानना असंभव है। इस विशेष विषमता ने मुझे दूर फेंक दिया। यहाँ, एक उत्थान और मेरी माफी है!
विल्क्स-

1

VBA / VB6 / VBScript (गैर-एक्सेल), 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


PPCG में आपका स्वागत है! क्या आप VB से अपरिचित उपयोगकर्ताओं के लिए स्पष्टीकरण जोड़ सकते हैं?
AdmBorkBork

1
@AdmBorkBork पिछले उत्तरों में जोड़ने के लिए ज्यादा नहीं, बस भाषा बाँध!
LS_ᴅᴇᴠ

यह सभी मामलों में विफल रहता है, जहां i>675 - s(676)=A@@(अपेक्षित YZ), s(677)=A@A(अपेक्षित ZA)
टेलर स्कॉट

1
@TaylorScott आप सही कह रहे हैं। इस पर काम करना ...
एलएस_ᴅᴇᴠ २०'१ it को LS:

1
@TaylorScott सही किया, +6 बाइट्स ... धन्यवाद।
एलएस_

1

जावास्क्रिप्ट, 147 बाइट्स

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। यह समाधान का गोल्फ है। एक्सेल कॉलम बायजेक्टिव बेस -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
आप एक TIO लिंक जोड़ सकते हैं। इसके अलावा एक महान पहला जवाब। पीपीसीजी में भी आपका स्वागत है।
मुहम्मद सलमान

साथ ही 7 साल पहले पूछे गए एक सवाल का जवाब देना वास्तव में एक महान विचार नहीं है।
मुहम्मद सलमान

ठीक है, nvm यह इतने सारे स्तरों पर गलत है कि मैंने कभी यह कैसे नहीं देखा
मुहम्मद सलमान

मैं यह सवाल पूछना चाहता था लेकिन यह एक डुप्लिकेट था। मुझे यकीन नहीं है कि आपको
@MuhammadSalman

एक मिनट में पीपीसीजी में आपका स्वागत है। अच्छा उत्तर। कृपया ध्यान दें कि उत्तर लिखते समय आपको एक पूर्ण कार्यक्रम या एक समारोह प्रदान करना होगा
मुहम्मद सलमान

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

फोर्थ (gforth) , 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

नोट: Powershell एक divऑपरेटर प्रदान नहीं करता है ।


0

हास्केल, 48

मैंने वास्तव में सोचा था कि मैं अन्य हास्केल प्रविष्टि को हरा पाऊंगा, लेकिन अफसोस ...

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

मुझे यकीन है कि कुछ पात्रों को इस से दूर करना संभव है, लेकिन मैंने हास्केल में लगभग एक वर्ष तक कोड नहीं किया है, इसलिए मैं काफी कठोर हूं।

यह वही नहीं है जिसे आप सुरुचिपूर्ण कहेंगे।


बुरा नहीं! :) लेकिन हा - 3 से अधिक वर्षों के बाद, अभी भी कोई सी # समाधान नहीं है। : डी
विल्क्स-

हाहा, वास्तव में। लेकिन इसी विधि का उपयोग करके लिखने के लिए एक C # समाधान तुच्छ है। string f(int n){return n<0?"":f(n/26-1)+(char)(n%26+65);}57 अक्षर, इसलिए मुझे उत्तर के रूप में पोस्ट करके लगभग बुरा लगेगा।
फोर्स

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

इसे ऑनलाइन आज़माएं!



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.