आधार-एन संख्या से ASCII कला असम्बद्धता


24

यह मैजिक ऑक्टूपस यूरन द्वारा 05AB1E उत्तर से प्रेरित है ।

दो तर्क दिए, एक सकारात्मक पूर्णांक और एक स्ट्रिंग / पात्रों की सूची:

  1. संख्या को आधार-एन में अनुवाद करें, जहां n स्ट्रिंग की लंबाई है।
  2. प्रत्येक वर्ण के लिए, उस वर्ण के सूचकांक के प्रत्येक स्वरूप को आधार-n संख्या में उस वर्ण से बदलें।
  3. नया स्ट्रिंग प्रिंट या वापस करें।

उदाहरण:

Input:
2740, ["|","_"]
2740 -> 101010110100 in base 2
     -> Replace 0s with "|" and 1s with "_"
Output: _|_|_|__|_||

Input:
698911, ["c","h","a","o"]
698911 ->  2222220133 in base 4
       ->  Replace 0s with "c", 1s with "h", 2s with "a", and 3s with "o"
Output -> "aaaaaachoo"

Input:
1928149325670647244912100789213626616560861130859431492905908574660758972167966, [" ","\n","|","_","-"]
Output:
    __   __    
   |  |_|  |   
___|       |___
-   -   -   -  
 - - - - - - - 
- - - - - - - -
_______________

Input: 3446503265645381015412, [':', '\n', '.', '_', '=', ' ', ')', '(', ',']
Output:
_===_
(.,.)
( : )
( : )

नियम:

  • IO लचीला है
    • आप किसी भी आधार में संख्या ले सकते हैं, जब तक कि यह आदानों के बीच संगत हो
    • वर्णों की सूची को 0-अनुक्रमित किया जाना है, जहां 0 पहला वर्ण है और n-1 अंतिम है
  • संभावित वर्ण किसी भी मुद्रण योग्य ASCII हो सकते हैं, साथ ही व्हाट्सएप जैसे टैब और न्यूलाइन्स
  • पात्रों की दी गई सूची में 2-10शामिल सीमा में लंबाई होगी । यही है, सबसे छोटा आधार द्विआधारी है और सबसे बड़ा दशमलव है ( यहाँ कोई pesky पत्र नहीं )
  • मानक खामियों को मना किया जाता है
  • यहां तक ​​कि अगर आपकी भाषा बड़े परीक्षण मामलों को संभाल नहीं सकती तो भी बेझिझक जवाब दें।

जैसा कि यह , प्रत्येक भाषा के लिए सबसे छोटा कोड जीतता है। ( मुझे पता है कि आप सभी गोल्फिंग भाषाओं में एक बाइट बिल्ट-इन तैयार हैं ;)



3
D'awwh, मैं सम्मानित महसूस करता हूँ। 05AB1E एससीआई -आर्ट मेरा पसंदीदा समय था।
मैजिक ऑक्टोपस Urn

आप एक नई चुनौती बना सकते हैं: संख्या को कम करने के लिए सरणी में वर्णों की क्रमबद्धता का पता
लगाएं

जवाबों:


8

05AB1E , 7 6 बाइट्स

gв¹sèJ

चूंकि यह 05AB1E उत्तर से प्रेरित था, इसलिए 05AB1E में दिया गया उत्तर उपयुक्त लगता है। :)

-1 बाइट के लिए धन्यवाद @Enigma द्वारा फोर्क को हटाकर और इस तरह से।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

g         # `l`: Take the length of the first (string) input
 в        # And then take the second input in base `l`
          # For each digit `y` of this base-converted number:
  ¹sè     #  Push the `y`'th character of the first input
     J    # Join everything together (and output implicitly)

1
gв¹sèJएक बाइट को बचाने के लिए।
इमीना

@Emigna धन्यवाद विश्वास कर सकते हैं नहीं मैं के बारे में नहीं सोचा था ¹sèअपने आप को अब .. (मैं बदल रहा है पता था कि ?एक करने के लिए Jइस मामले में एक ही आउटपुट देना होगा।)
केविन Cruijssen

6

जावा 8, 72 50 बाइट्स

a->n->n.toString(a.length).chars().map(c->a[c-48])

-22 बाइट्स सीधे मुद्रण के बजाय वापस लौटने पर @ ओलिवियरग्रेयर के लिए धन्यवाद IntStream

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

स्पष्टीकरण:

a->n->                  // Method with char-array and BigInteger parameters
  n.toString(a.length)  //  Convert the input-number to Base `amount_of_characters`
   .chars()             //  Loop over it's digits (as characters)
   .map(c->a[c          //   Convert each character to the `i`'th character of the input
              -48])     //   by first converting the digit-character to index-integer `i`

2
a->n->n.toString(a.length).chars().map(c->a[c-48])(50 बाइट्स) चूंकि "आईओ लचीला है"
ओलिवियर ग्रेजायर

String f(char[]a,int n){return n>0?f(a,n/a.length)+a[n%a.length]:"";}(69 बाइट्स) पुनरावर्ती एक, मज़े के लिए।
ओलिवियर ग्रेजायर

6

पायथन 3 , 49 बाइट्स

अभी तक टिप्पणी नहीं की जा सकती है, इसलिए मैं पायथन 2 उत्तर को पायथन 3.5 से अनुकूलित करता हूं।

f=lambda n,s:n and f(n//len(s),s)+s[n%len(s)]or''

2
PPCG में आपका स्वागत है! अपने समाधान को दिखाने में मदद करने के लिए एक TIO लिंक शामिल करने के लिए स्वतंत्र महसूस करें ।
जो राजा

5

जाप, 2 बाइट्स

एक सरणी या एक स्ट्रिंग के रूप में दूसरा इनपुट ले सकते हैं। अंतिम 2 परीक्षण मामलों को विफल करता है क्योंकि संख्याएँ जावास्क्रिप्ट के अधिकतम पूर्णांक से अधिक होती हैं। इसके बजाय वर्णों की एक सरणी आउटपुट करने sके ìलिए बदलें ।

sV

कोशिश करो


5

हास्केल , 40 39 बाइट्स

0!_=[]
n!l=cycle l!!n:div n(length l)!l

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

जैसा कि हास्केल का Intप्रकार सीमित है 9223372036854775807, यह बड़ी संख्या के लिए विफल रहता है।

-1 बाइट लाईकोनी की बदौलत

Ungolfed

(!) :: Int -> [Char] -> [Char]

0 ! _ = []  -- If the number is 0, we reached the end. Base case: empty string
n ! l = 
  let newN = (n `div` length l) in   -- divide n by the base
    cycle l!!n                       -- return the char encoded by the LSD ... 
    : newN!l                         -- ... prepended to the rest of the output (computed recursively)

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


के cycleबजाय उपयोग करने के लिए अच्छा विचार है mod! div n(length l)एक बाइट बचाता है।
लकोनी

4

MATL , 2 बाइट्स

YA

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

इनपुट एक संख्या और एक स्ट्रिंग हैं।

संख्या से अधिक के लिए विफल 2^53फ़्लोटिंग-पॉइंट सटीक की वजह ।

व्याख्या

क्या YAपता, एक बिलिन (निर्दिष्ट लक्ष्य प्रतीकों के साथ आधार रूपांतरण)।


4

जावास्क्रिप्ट (ईएस 6), 48 बाइट्स

करी सिंटैक्स में इनपुट लेता है (c)(n), जहाँ c वर्णों की सूची है और n एक पूर्णांक है।

केवल n <2 53 के लिए सुरक्षित है ।

c=>n=>n.toString(c.length).replace(/./g,i=>c[i])

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


जावास्क्रिप्ट (ईएस 6), 99 बाइट्स

बड़े पूर्णांक के लिए समर्थन के साथ

वाक्य रचना currying में इनपुट लेता है (c)(a), जहां सी वर्णों की एक सूची है और एक एक (पूर्णांक के रूप में) दशमलव अंक की सूची है।

c=>g=(a,p=0,b=c.length,r=0)=>1/a[p]?g(a.map((d,i)=>(r=d+r*10,d=r/b|0,r%=b,d|i-p||p++,d)),p)+c[r]:''

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


4

x86 32-बिट मशीन कोड (32-बिट पूर्णांक): 17 बाइट्स।

(32-बिट या 64-बिट के लिए 16 बाइट्स सहित, डीएफ = 1 कॉलिंग कन्वेंशन सहित, नीचे अन्य संस्करण भी देखें।)

कॉलर रजिस्टरों में आर्ग पास करता है, जिसमें एक आउटपुट बफर के अंत में एक सूचक भी शामिल है (जैसे मेरा सी उत्तर ; इसे एल्गोरिदम के औचित्य और स्पष्टीकरण के लिए देखें।) glibc का आंतरिक _itoaकरता है। , इसलिए यह कोड-गोल्फ के लिए ही नहीं है। आर्ग-पासिंग रजिस्टर x86-64 सिस्टम V के करीब हैं, सिवाय इसके कि हमारे पास EDX के बजाय EAX में एक arg है।

वापसी पर, ईडीआई आउटपुट बफर में 0-टर्मिनेटेड सी स्ट्रिंग के पहले बाइट की ओर इशारा करता है। सामान्य रिटर्न-वैल्यू रजिस्टर EAX / RAX है, लेकिन असेंबली भाषा में आप एक फ़ंक्शन के लिए जो भी कॉलिंग कन्वेंशन सुविधाजनक है, उसका उपयोग कर सकते हैं। ( xchg eax,ediअंत में 1 बाइट जोड़ेगा)।

कॉल करने वाला स्पष्ट लंबाई की गणना कर सकता है यदि वह चाहता है, से buffer_end - edi। लेकिन मुझे नहीं लगता कि हम टर्मिनेटर को छोड़ने का औचित्य साबित कर सकते हैं जब तक कि फ़ंक्शन वास्तव में प्रारंभ + अंत बिंदु या सूचक + लंबाई दोनों को वापस नहीं करता है। इस संस्करण में 3 बाइट्स बचेंगे, लेकिन मुझे नहीं लगता कि यह उचित है।

  • EAX = n = डिकोड करने की संख्या। ( idivअन्य अर्गों के निहितार्थ नहीं हैं।)
  • EDI = आउटपुट बफर का अंत (64-बिट संस्करण अभी भी उपयोग करता है dec edi, इसलिए निम्न 4GiB में होना चाहिए)
  • ईएसआई / आरएसआई = लुकअप टेबल, उर्फ ​​लुट। लबादा नहीं।
  • ECX = तालिका की लंबाई = आधार। लबादा नहीं।

nasm -felf32 ascii-compress-base.asm -l /dev/stdout | cut -b -30,$((30+10))- (टिप्पणी संपादित करने के लिए संपादित हाथ, लाइन नंबरिंग अजीब है।)

   32-bit: 17 bytes        ;  64-bit: 18 bytes
                           ; same source assembles as 32 or 64-bit
 3                         %ifidn __OUTPUT_FORMAT__, elf32
 5                         %define rdi edi
 6   address               %define rsi esi
11          machine        %endif
14          code           %define DEF(funcname) funcname: global funcname
16          bytes           
22                         ;;; returns: pointer in RDI to the start of a 0-terminated string
24                         ;;; clobbers:; EDX (tmp remainder)
25                         DEF(ascii_compress_nostring)
27 00000000 C60700             mov     BYTE [rdi], 0
28                         .loop:                    ; do{
29 00000003 99                 cdq                    ; 1 byte shorter than   xor edx,edx / div
30 00000004 F7F9               idiv    ecx            ; edx=n%B   eax=n/B
31                         
32 00000006 8A1416             mov     dl, [rsi + rdx]   ; dl = LUT[n%B]
33 00000009 4F                 dec     edi               ; --output  ; 2B in x86-64
34 0000000A 8817               mov     [rdi], dl         ; *output = dl
35                         
36 0000000C 85C0               test    eax,eax           ; div/idiv don't write flags in practice, and the manual says they're undefined.
37 0000000E 75F3               jnz     .loop         ; }while(n);
38                         
39 00000010 C3                 ret
           0x11 bytes = 17
40 00000011 11             .size: db $ - .start

यह आश्चर्य की बात है मूल रूप से कोई गति / आकार तालमेल के साथ सबसे सरल संस्करण में सबसे छोटी है कि है, लेकिन std/ cldउपयोग करने के लिए लागत 2 बाइट्स stosbअवरोही क्रम में जाने के लिए और अभी भी आम DF = 0 का पालन करें सम्मेलन बुला। (और स्टोरेज के बाद एसटीओएस घटता है , पॉइंटर को लूप एग्जिट पर एक बाइट बहुत कम इंगित करता है, जिससे हमें काम करने के लिए अतिरिक्त बाइट की लागत आती है।)

संस्करण:

मैं 4 महत्वपूर्ण भिन्न कार्यान्वयन ट्रिक्स (सरल movलोड / स्टोर (ऊपर) का उपयोग करके, lea/ / movsb(साफ-सुथरा लेकिन इष्टतम नहीं), xchg/ xlatb/ stosb/ का उपयोग करके आया था xchg, और एक जो ओवरलैपिंग-निर्देश हैक के साथ लूप में प्रवेश करता है। नीचे कोड देखें)। । आखिरी 0में आउटपुट स्ट्रिंग टर्मिनेटर के रूप में कॉपी करने के लिए लुकअप टेबल में एक अनुगामी की आवश्यकता होती है, इसलिए मैं +1 बाइट के रूप में गिन रहा हूं। 32/64-बिट (1-बाइट incया नहीं) पर निर्भर करता है , और क्या हम मान सकते हैं कि कॉलर सेट DF = 1 ( stosbअवरोही) या जो भी हो, अलग-अलग संस्करण सबसे कम (बंधे) हैं।

DF = 1 अवरोही क्रम में स्टोर करने के लिए इसे xchg / stosb / xchg की जीत बनाता है, लेकिन कॉलर अक्सर ऐसा नहीं चाहेगा; ऐसा लगता है कि कॉल करने वाले को हार्ड-टू-जस्ट तरीके से ऑफ़लोड करने का काम। (कस्टम एर्ग-पासिंग और रिटर्न-वैल्यू रजिस्टरों के विपरीत, जो आमतौर पर एएसएम कॉलर को किसी भी अतिरिक्त काम की लागत नहीं देते हैं।) लेकिन 64-बिट कोड में, cld/ scasbकाम करता है inc rdi, आउटपुट पॉइंटर को 32-बिट तक रौंदने से बचता है, इसलिए यह कभी-कभी होता है। 64-बिट-क्लीन कार्यों में DF = 1 को संरक्षित करने के लिए असुविधाजनक। । (स्थिर कोड / डेटा के पॉइंट्स लिनक्स पर x86-64 नॉन-पीआईई निष्पादनयोग्य में 32-बिट और हमेशा लिनक्स एक्स 32 एबीआई में होते हैं, इसलिए 32-बिट पॉइंटर्स का उपयोग करने वाला x86-64 संस्करण कुछ मामलों में उपयोग करने योग्य है। वैसे भी) यह सहभागिता आवश्यकताओं के विभिन्न संयोजनों को देखना दिलचस्प बनाती है।

  • IA32 एक DF = 0 के साथ प्रवेश / निकास कॉलिंग कन्वेंशन पर: 17B ( nostring)
  • IA32: 16B (एक DF = 1 सम्मेलन के साथ: stosb_edx_argया skew) ; या आने वाले DF = NOTcare के साथ, इसे सेट करते हुए: 16 + 1Bstosb_decode_overlap या 17Bstosb_edx_arg
  • 64-बिट पॉइंटर्स के साथ x86-64, और एंट्री / एग्जिट कॉलिंग कन्वेंशन पर एक DF = 0: 17 + 1 बाइट्स ( stosb_decode_overlap) , 18B ( stosb_edx_argया skew)
  • 64-बिट पॉइंटर्स के साथ x86-64, अन्य DF हैंडलिंग: 16B (DF = 1 skew) , 17B ( nostringDF = 1 के साथ, scasbइसके बजाय का उपयोग करके dec)। 18B ( stosb_edx_arg3-बाइट के साथ DF = 1 का संरक्षण inc rdi)।

    या अगर हम स्ट्रिंग से पहले 1 बाइट को पॉइंटर वापस करने की अनुमति देते हैं, तो 15 बी ( अंत में stosb_edx_argबिना inc)। सभी ने फिर से कॉल करने के लिए और अलग बेस / टेबल के साथ बफर में एक और स्ट्रिंग का विस्तार करने के लिए सेट किया ... लेकिन अगर हम एक टर्मिनेटिंग स्टोर नहीं करते हैं 0, तो यह अधिक समझ में आता है , और आप फ़ंक्शन बॉडी को लूप के अंदर रख सकते हैं ताकि वास्तव में एक अलग समस्या।

  • 32-बिट आउटपुट पॉइंटर के साथ x86-64, DF = 0 कॉलिंग कन्वेंशन: 64-बिट आउटपुट पॉइंटर पर कोई सुधार नहीं, लेकिन 18B ( nostring) अब टाई।

  • 32-बिट आउटपुट पॉइंटर के साथ x86-64: सर्वश्रेष्ठ 64-बिट पॉइंटर संस्करणों पर कोई सुधार नहीं, इसलिए 16 बी (डीएफ = 1 skew)। या DF = 1 सेट करने के लिए और इसे छोड़ दें, लेकिन इसके skewसाथ 17B । या के बजाय अंत के साथ 17 + 1 बी / के लिए ।stdcldstosb_decode_overlapinc edicldscasb

DF = 1 कॉलिंग कन्वेंशन के साथ: 16 बाइट्स (IA32 या x86-64)

इनपुट पर DF = 1 की आवश्यकता है, इसे सेट करता है। बमुश्किल प्रशंसनीय , कम से कम प्रति-कार्य के आधार पर। उपरोक्त संस्करण के समान ही काम करता है, लेकिन XLATB के बाद / AL से पहले / बाहर शेष पाने के लिए xchg के साथ (बेस के रूप में R / EBX के साथ टेबल लुकअप) और STOSB ( *output-- = al)।

एक सामान्य DF = 0 प्रवेश / बाहर निकलें सम्मेलन में रहते हुए, / / संस्करण 32 और 64-बिट कोड के लिए 18 बाइट्स की है, और 64-बिट साफ है (64-बिट उत्पादन सूचक के साथ काम करता है)।stdcldscasb

ध्यान दें कि इनपुट आर्गन्स विभिन्न रजिस्टरों में हैं, जिसमें तालिका के लिए RBX भी शामिल है (के लिए xlatb)। यह भी ध्यान दें कि यह लूप AL को संचय करके शुरू होता है, और अंतिम चार के साथ समाप्त होता है जो अभी तक संग्रहीत नहीं है (इसलिए movअंत में)। तो लूप दूसरों के सापेक्ष "तिरछा" है, इसलिए नाम।

                            ;DF=1 version.  Uncomment std/cld for DF=0
                            ;32-bit and 64-bit: 16B
157                         DEF(ascii_compress_skew)
158                         ;;; inputs
159                             ;; O in RDI = end of output buffer
160                             ;; I in RBX = lookup table  for xlatb
161                             ;; n in EDX = number to decode
162                             ;; B in ECX = length of table = modulus
163                         ;;; returns: pointer in RDI to the start of a 0-terminated string
164                         ;;; clobbers:; EDX=0, EAX=last char
165                         .start:
166                         ;    std
167 00000060 31C0               xor    eax,eax
168                         .loop:                    ; do{
169 00000062 AA                 stosb
170 00000063 92                 xchg    eax, edx
171                         
172 00000064 99                 cdq                    ; 1 byte shorter than   xor edx,edx / div
173 00000065 F7F9               idiv    ecx            ; edx=n%B   eax=n/B
174                         
175 00000067 92                 xchg    eax, edx       ; eax=n%B   edx=n/B
176 00000068 D7                 xlatb                  ; al = byte [rbx + al]
177                         
178 00000069 85D2               test    edx,edx
179 0000006B 75F5               jnz     .loop         ; }while(n = n/B);
180                         
181 0000006D 8807               mov     [rdi], al     ; stosb would move RDI away
182                         ;    cld
183 0000006F C3                 ret

184 00000070 10             .size: db $ - .start

एक समान गैर-तिरछा संस्करण EDI / RDI का निरीक्षण करता है और फिर इसे ठीक करता है।

                            ; 32-bit DF=1: 16B    64-bit: 17B (or 18B for DF=0)
70                         DEF(ascii_compress_stosb_edx_arg)  ; x86-64 SysV arg passing, but returns in RDI
71                             ;; O in RDI = end of output buffer
72                             ;; I in RBX = lookup table  for xlatb
73                             ;; n in EDX = number to decode
74                             ;; B in ECX = length of table
75                         ;;; clobbers EAX,EDX, preserves DF
76                             ; 32-bit mode: a DF=1 convention would save 2B (use inc edi instead of cld/scasb)
77                             ; 32-bit mode: call-clobbered DF would save 1B (still need STD, but INC EDI saves 1)
79                         .start:
80 00000040 31C0               xor     eax,eax
81                         ;    std
82 00000042 AA                 stosb
83                         .loop:
84 00000043 92                 xchg    eax, edx
85 00000044 99                 cdq
86 00000045 F7F9               idiv    ecx            ; edx=n%B   eax=n/B
87                         
88 00000047 92                 xchg    eax, edx       ; eax=n%B   edx=n/B
89 00000048 D7                 xlatb                  ; al = byte [rbx + al]
90 00000049 AA                 stosb                  ; *output-- = al
91                         
92 0000004A 85D2               test    edx,edx
93 0000004C 75F5               jnz     .loop
94                         
95 0000004E 47                 inc    edi
96                             ;; cld
97                             ;; scasb          ; rdi++
98 0000004F C3                 ret
99 00000050 10             .size: db $ - .start
    16 bytes for the 32-bit DF=1 version

मैंने इसके साथ lea esi, [rbx+rdx]/ movsbआंतरिक लूप बॉडी के रूप में एक वैकल्पिक संस्करण की कोशिश की । (आरएसआई हर पुनरावृत्ति को रीसेट करता है, लेकिन आरडीआई घटता है)। लेकिन यह टर्मिनेटर के लिए xor-zero / stos का उपयोग नहीं कर सकता है, इसलिए यह 1 बाइट बड़ा है। (और यह LEA पर REX उपसर्ग के बिना लुकअप टेबल के लिए 64-बिट क्लीन नहीं है।)


स्पष्ट लंबाई और एक 0 टर्मिनेटर के साथ LUT : 16 + 1 बाइट्स (32-बिट)

यह संस्करण DF = 1 सेट करता है और इसे इस तरह से छोड़ देता है। मैं कुल बाइट गिनती के हिस्से के रूप में आवश्यक अतिरिक्त एलयू बाइट की गिनती कर रहा हूं।

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

फ़ंक्शन के माध्यम से पहली बार, लूप के पहले 3 बाइट्स को LEA के लिए disp32 के उच्च बाइट्स के रूप में खपत किया जाता है। यह LEA EDX को आधार (मापांक) की प्रतिलिपि बनाता है, idivबाद के पुनरावृत्तियों के लिए शेष उत्पादन करता है।

2 बाइट idiv ebpहै FD, जो stdइस निर्देश के लिए opcode है कि इस फ़ंक्शन को काम करने की आवश्यकता है। (यह एक भाग्यशाली खोज थी। मैं इसे पहले से देख रहा था div, जो अपने आप को ModRM में बिट्स idivका उपयोग करने से अलग करता है /rdiv epb रूप में cmc, जो हानिरहित है लेकिन सहायक नहीं है। लेकिन idiv ebpक्या हम वास्तव stdमें शीर्ष से निकाल सकते हैं । समारोह के।)

ध्यान दें कि इनपुट रजिस्टर एक बार फिर से भिन्न हैं: आधार के लिए ईबीपी।

103                         DEF(ascii_compress_stosb_decode_overlap)
104                         ;;; inputs
105                             ;; n in EAX = number to decode
106                             ;; O in RDI = end of output buffer
107                             ;; I in RBX = lookup table, 0-terminated.  (first iter copies LUT[base] as output terminator)
108                             ;; B in EBP = base = length of table
109                         ;;; returns: pointer in RDI to the start of a 0-terminated string
110                         ;;; clobbers: EDX (=0), EAX,  DF
111                             ;; Or a DF=1 convention allows idiv ecx (STC).  Or we could put xchg after stos and not run IDIV's modRM
112                         .start:
117                             ;2nd byte of div ebx = repz.  edx=repnz.
118                             ;            div ebp = cmc.   ecx=int1 = icebp (hardware-debug trap)
119                             ;2nd byte of idiv ebp = std = 0xfd.  ecx=stc
125                         
126                             ;lea    edx, [dword 0 + ebp]
127 00000040 8D9500             db  0x8d, 0x95, 0   ; opcode, modrm, 0 for lea edx, [rbp+disp32].  low byte = 0 so DL = BPL+0 = base
128                             ; skips xchg, cdq, and idiv.
129                             ; decode starts with the 2nd byte of idiv ebp, which decodes as the STD we need
130                         .loop:
131 00000043 92                 xchg    eax, edx
132 00000044 99                 cdq
133 00000045 F7FD               idiv    ebp            ; edx=n%B   eax=n/B;
134                             ;; on loop entry, 2nd byte of idiv ebp runs as STD.  n in EAX, like after idiv.  base in edx (fake remainder)
135                         
136 00000047 92                 xchg    eax, edx       ; eax=n%B   edx=n/B
137 00000048 D7                 xlatb                  ; al = byte [rbx + al]
138                         .do_stos:
139 00000049 AA                 stosb                  ; *output-- = al
140                         
141 0000004A 85D2               test    edx,edx
142 0000004C 75F5               jnz     .loop
143                         
144                         %ifidn __OUTPUT_FORMAT__, elf32
145 0000004E 47                 inc     edi         ; saves a byte in 32-bit.  Makes DF call-clobbered instead of normal DF=0
146                         %else
147                             cld
148                             scasb          ; rdi++
149                         %endif
150                         
151 0000004F C3                 ret
152 00000050 10             .size: db $ - .start
153 00000051 01                     db 1   ; +1 because we require an extra LUT byte
       # 16+1 bytes for a 32-bit version.
       # 17+1 bytes for a 64-bit version that ends with DF=0

इस ओवरलैपिंग डिकोड ट्रिक का भी उपयोग किया जा सकता है cmp eax, imm32: यह केवल 4 बाइट्स को प्रभावी ढंग से कूदने के लिए 1 बाइट लेता है, केवल क्लोबरबर्स झंडे। (यह CPU पर प्रदर्शन के लिए भयानक है जो L1i कैश, BTW में निर्देश सीमाओं को चिह्नित करता है।)

लेकिन यहाँ, हम एक रजिस्टर की प्रतिलिपि बनाने और लूप में कूदने के लिए 3 बाइट्स का उपयोग कर रहे हैं। यह सामान्य रूप से 2 + 2 (mov + jmp) लेगा, और हमें XLATB से पहले STOS से ठीक पहले लूप में कूदने देगा। लेकिन फिर हमें एक अलग एसटीडी की आवश्यकता होगी, और यह बहुत दिलचस्प नहीं होगा।

इसे ऑनलाइन आज़माएं! (एक _startकॉलर के साथ जो उपयोग करता हैsys_write परिणाम पर )

डिबगिंग के लिए यह सबसे अच्छा है कि इसे नीचे चलाया जाए strace, या आउटपुट को हेक्सडंप किया जाए, ताकि आप देख सकें कि \0सही जगह पर टर्मिनेटर वगैरह है । लेकिन आप इसे वास्तव में काम कर सकते हैं, और AAAAAACHOOइनपुट के लिए उत्पादन कर सकते हैं

num  equ 698911
table:  db "CHAO"
%endif
    tablen equ $ - table
    db 0  ; "terminator" needed by ascii_compress_stosb_decode_overlap

(वास्तव में xxAAAAAACHOO\0x\0\0..., क्योंकि हम बफर में 2 बाइट्स से पहले एक निश्चित लंबाई तक डंप कर रहे हैं। इसलिए हम देख सकते हैं कि फ़ंक्शन ने बाइट्स को लिखा था और इसे किसी भी बाइट्स पर कदम नहीं रखना चाहिए था। स्टार्ट-पॉइंटर को फंक्शन में पास किया गया, दूसरा-अंतिम xकैरेक्टर था, जिसके बाद ज़ीरो था।)


3

जेली , 4 बाइट्स

ṙ1ṃ@

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

वस्तुतः इसके लिए एक अंतर्निर्मित है। जेली के एक-आधारित अनुक्रमण के लिए अन्य तीन बाइट्स खाते हैं।


जिज्ञासा से बाहर, जेली में भी बेसिन " बेस डीकंप्रेसन क्यों है? एक्स को बेस लेंथ (वाई) में बदलें फिर इंडेक्स में वाई ?"। क्या यह बहुत ही असाधारण मामलों के लिए है जहाँ आप स्ट्रिंग / पूर्णांक / सूची में परिवर्तित होने के लिए आधार के लिए समान हैं और समान हैं? जब मैं इसे खोजता हूं, तो मैं इसका उपयोग करते हुए केवल तीन उत्तर पा सकता हूं: 1 ; 2 ; । किंडा हर दिन कोड-गोल्फ चुनौतियों में एक अजीब बिलिन बनाता है। : एस
केविन क्रूज़सेन

3
@KevinCruijssen यह बहुत उपयोगी है जब आप चाहते हैं, उदाहरण के लिए, संख्याओं की सूची के बजाय हेक्स पत्रों का उपयोग करके एन को हेक्साडेसिमल में बदलना ।
श्री एक्सकोडर

@ केविनक्रूजसेन यह तार के लिए एक संपीड़न विधि है। पहले उदाहरण में वांछित स्ट्रिंग है “sspspdspdspfdspfdsp”, लेकिन आपके साथ “çƥ÷£ḟ’ṃ“spdf”¤छह बाइट्स बचाते हैं। यह जेली के बेस 250 नंबरों के साथ विशेष रूप से उपयोगी है
डायलन जू

3

पायथन 2 , 49 48 बाइट्स

-1 किंग जोए को धन्यवाद

f=lambda n,s:n and f(n/len(s),s)+s[n%len(s)]or''

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

वैकल्पिक संस्करण (बड़ी संख्या के लिए समाप्त नहीं होगा), 45 43 बाइट्स

-2 बाइट्स जो किंग को धन्यवाद

f=lambda n,s:s*n and f(n/len(s),s)+(s*n)[n]

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


3

चारकोल , 3 1 बाइट्स

θη

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। संपादित करें: @ ASCII- केवल के लिए 2 बाइट्स सहेजे गए। अंतर्निहित संस्करण से पहले पिछला संस्करण जोड़ा गया था, 8 बाइट्स:

⭆↨θLη§ηι

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

    η       Second input
   L        Length
  θ         First input
 ↨          Base convert to array
⭆           Map over values and join
      η     Second input
       ι    Current value
     §      Index into list
            Implicitly print result

वास्तव में यह पहले से ही काम करने वाला है, लेकिन जाहिर है कि मैंने अभी तक फिर से गड़बड़ कर दिया है> _>
केवल

इसके अलावा, यह वास्तव में 1 बाइट होगा : पी (यह वर्तमान में हालांकि टूट गया है, इसलिए मैं तर्कों के रूप में संख्या और स्ट्रिंग सरणी का उपयोग नहीं कर रहा हूं) (यह भी, मुझे आश्चर्य है कि कैसे (अन) उपयोगी निहित इनपुट है)
ASCII- केवल

@ ASCII- केवल आपका मतलब "1 बाइट्स" नहीं है (अपने -vl आउटपुट देखें;; और साथ ही, इस तरह की चुनौतियों को छोड़कर, चारकोल में निहित इनपुट लगभग बेकार प्रतीत होगा।
नील

1
@ ASCII- केवल बहुवचन "बाइट" के बजाय एकवचन "बाइट" नील का मतलब है। ;) अपने 1-बाइट उत्तर के लिए, क्यों पार-बाहर θη? थोड़ा भ्रमित करने वाला tbh लगता है। क्यों नहीं इसे पूरी तरह से हटा दें और छोड़ दें ?
केविन क्रूज़सेन

1
@ सवाल पूछने से पहले मैंने डबल-चेक किया और बिल्ट-इन जोड़ा गया था, लेकिन मुझे इस बात का एहसास नहीं था क्योंकि इसमें बग था।
नील

3

डी , 112 बाइट्स

import std.conv;C u(C,I)(I n,C b){C t;for(I l=b.length;n;n/=l)t=to!C(n%l)~t;foreach(ref c;t)c=b[c-48];return t;}

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

यह का एक बंदरगाह है HatsuPointerKun के C ++ उत्तर

कॉलिंग शैली u(ulong(n), to!(char[])(b)), कहाँ nऔर कहाँ हैb छोड़ दिया और सही तर्क हैं

डी विशिष्ट सामान

अफसोस की बात है, हमें std.convकिसी भी प्रकार के रूपांतरणों को बहुत ऊपर करने के लिए आयात करने की आवश्यकता है बुनियादी प्रकार के रूपांतरण के ।

गोल्फ टेम्प्लेट सिस्टम का उपयोग करना, और फ़ंक्शन को आवश्यक प्रकार देना (यही कारण है कि यह कॉलिंग सिर्फ यह नहीं है u(n,b)), हम फ़ंक्शन के अंदर char[]और प्रत्येक ulongको 1बाइट को छोटा कर सकते हैं, जब एफ फ़ंक्शन के अंदर।

डी हमारे लिए हमारे प्रकार को इनिशियलाइज़ करता है, इसलिए इसके C t;लिए कम हैC t=cast(char[])([])

to!Cपूर्णांक n%lको वर्ण सरणी में परिवर्तित करता है (कोडपॉइंट्स का उपयोग करके), और ~कॉन्सेटेशन है

foreach(ref c;t)C ++ के for(... : ...)लूप की तरह है , लेकिन थोड़ी देर। refयह पसंद है &, यह cकॉपी-बाय-रेफरेंस के रूप में व्यवहार करता है (यानी, हम संशोधित कर सकते हैं t)। सौभाग्य से, डी cबिना किसी प्रकार का उल्लंघन करता है कीवर्ड के टाइपिंग के प्रकार को संक्रमित करता है।



3

सी ++, 150 144 बाइट्स,uint64 इनपुट

-6 बाइट्स Zacharý को धन्यवाद

#include<string>
using s=std::string;s u(uint64_t n,s b){s t;for(;n;n/=b.size())t=std::to_string(n%b.size())+t;for(auto&a:t)a=b[a-48];return t;}

आकार को स्टोर करने के लिए एक वैरिएबल का उपयोग करके 1 से bytecount बढ़ेगा

फ़ंक्शन को कॉल करने के लिए:

u(2740, "|_")

पहला नंबर, दूसरा स्ट्रिंग (चार सरणी) है

परीक्षण के मामलों :

std::cout << u(2740, "|_") << '\n' << u(698911, "chao") << '\n';
return 0;

1
3 बाइट्स शेव करने के लिए: आपको उस स्थान की आवश्यकता नहीं है #include, आप ;;बस बदल सकते हैं ;, और '0'बस हो सकता है48
Zacharý

1
इसके अलावा, जबकि लूप एक लूप हो सकता है for:for(;n;n/=b.size())t=std::to_string(n%b.size())+t;
Zacharý

@ceilingcat, मैं भूल गया कि b.size()उस पाश में परिवर्तन नहीं होता है।
ज़ाचारि

@ceilingcat 1 के बाइट को बढ़ाता है, इसे कम करने के बजाय
HatsuPointerKun

2

टहनी, 66 बाइट्स

बनाया गया है macroकि importएक टेम्पलेट में एड किया जाना चाहिए ।

{%macro d(n,c)%}{%for N in n|split%}{{c[N]}}{%endfor%}{%endmacro%}

अपेक्षित मूल्य:

पहले तर्कों के लिए ( n):

  • संख्या
  • तार

दूसरे तर्क के लिए ( c):

  • संख्या की सरणी
  • तार की सरणी

कैसे इस्तेमाल करे:

  • बनाओ .twig फ़ाइल
  • जोड़ना {% import 'file.twig' as uncompress %}
  • मैक्रो को कॉल करें uncompress.d()

अनगुल्ड (गैर-कार्यात्मक):

{% macro d(numbers, chars) %}
    {% for number in numbers|split %}
        {{ chars[number] }}
    {% endfor %}
{% endmacro %}


आप इस कोड को: https://twigfiddle.com/54a0i9 पर देख सकते हैं


2

Pyth, 9 8 7 बाइट्स

s@LQjEl

बाइट के लिए धन्यवाद hakr14 और श्री Xcoder के लिए एक और धन्यवाद।
इसे यहाँ आज़माएँ

व्याख्या

s@LQjEl
    jElQ      Convert the second input (the number) to the appropriate base.
 @LQ          Look up each digit in the list of strings.
s             Add them all together.

की जगह एक बाइट सहेजें m@Qdके साथ@LQ
hakr14

के vzसाथ प्रतिस्थापित करके एक बाइट सहेजें E
श्री एक्सकोडर

2

C89, सीमित-सीमा पर हस्ताक्षरित int n, 64 53 बाइट्स

  • चैंज: एक char **outलेने के लिए और लौटने के बजाय, इसे संशोधित करें और इसे संशोधित करेंchar *

संख्या को intएक सरणी, लंबाई के रूप में लुकअप तालिका के रूप में लेता है ।
आउटपुट ए में लिखा गया है char *outbuf। कॉलर पास (संदर्भ द्वारा) बफर के अंत में एक पॉइंटर। फ़ंक्शन उस पॉइंटर को संशोधित करता है जो वापसी पर स्ट्रिंग के पहले बाइट को इंगित करता है।

g(n,I,B,O)char*I,**O;{for(**O=0;n;n/=B)*--*O=I[n%B];}

यह C89 मान्य है, और ऑप्टिमाइज़ेशन सक्षम होने पर भी सही तरीके से काम करता है। यानी gcc पर निर्भर नहीं है-O0 गैर-शून्य फ़ंक्शन के अंत में गिरने व्यवहार या कोई अन्य यूबी नहीं है।

बफर के अंत में एक पॉइंटर पास करना एक अनुकूलित int-> स्ट्रिंग फ़ंक्शन के लिए सामान्य है, जैसे कि ग्लिबक का आंतरिक_itoaइस उत्तर को एक div / mod पाश के साथ अंकों में पूर्णांक को तोड़ने के एक विस्तृत विवरण के लिए देखें जैसे हम यहाँ कर रहे हैं, साथ ही साथ C86-64 asm में भी। यदि आधार 2 की शक्ति है, तो आप अंकों को पहले एमएसडी निकालने के लिए शिफ्ट / मास्क कर सकते हैं, लेकिन अन्यथा एकमात्र अच्छा विकल्प कम से कम महत्वपूर्ण-अंकों वाला पहला (मोडुलो के साथ) है।

इसे ऑनलाइन आज़माएं! । Ungolfed संस्करण:

/* int n = the number
 * int B = size of I = base
 * char I[] = input table
 * char **O = input/output arg passed by ref:
 *    on entry: pointer to the last byte of output buffer.
 *    on exit:  pointer to the first byte of the 0-terminated string in output buffer
 */
void ungolfed_g(n,I,B,O)char*I,**O;
{
    char *outpos = *O;     /* Golfed version uses *O everywhere we use outpos */
    *outpos = 0;           /* terminate the output string */
    for(;n;n/=B)
        *--outpos = I[n%B]; /* produce 1 char at a time, decrementing the output pointer */
    *O = outpos;
}

इस स्पष्ट लंबाई वाले संस्करण में, इनपुट एक है char table[]जिसे 0 बाइट को समाप्त करने की आवश्यकता नहीं है, क्योंकि हम इसे एक स्ट्रिंग के रूप में कभी नहीं मानते हैं। यह int table[]हम सभी की देखभाल के लिए हो सकता है। C में ऐसे कंटेनर नहीं होते हैं जो उनकी खुद की लंबाई जानते हों, इसलिए पॉइंटर + लंबाई एक आकार के साथ एक सरणी पास करने का सामान्य तरीका है। इसलिए हम जरूरत के बजाय इसे चुनते हैंstrlen

अधिकतम बफर आकार लगभग है sizeof(int)*CHAR_BIT + 1, इसलिए यह छोटा और संकलन-समय स्थिर है। (हम बेस = 2 के साथ इस स्थान का उपयोग करते हैं और 1. सेट किए गए सभी बिट्स।) जैसे 32 बिट पूर्णांक के लिए 33 बाइट, 0टर्मिनेटर सहित ।


C89, हस्ताक्षरित int, तालिका एक अंतर्निहित लंबाई सी स्ट्रिंग, 65 बाइट्स के रूप में

B;f(n,I,O)char*I,**O;{B=strlen(I);for(**O=0;n;n/=B)*--*O=I[n%B];}

यह एक ही बात है, लेकिन इनपुट एक अंतर्निहित लंबाई का तार है इसलिए हमें स्वयं लंबाई ढूंढनी होगी।


2

बैश + कोर यूटिलिटीज , 49 बाइट्स

dc -e`echo -en $2|wc -c`o$1p|tr -dc 0-9|tr 0-9 $2

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

टिप्पणियाँ / स्पष्टीकरण

यह इनपुट के रूप में कमांड-लाइन तर्क लेता है (आधार 10 में संख्या, फिर पात्रों की सूची के साथ एक स्ट्रिंग) और आउटपुट को स्टडआउट करता है। अंतरिक्ष, न्यू लाइन, आदि जैसे विशेष वर्ण अष्टाधारी अंकन में (उदाहरण के लिए, में प्रवेश किया जा सकता है \040एक अंतरिक्ष के लिए), या \n, एक नई पंक्ति के लिए \tटैब के लिए, या किसी अन्य एस्केप अनुक्रम कि echo -eऔरtr व्याख्या करते हैं।

यहां बहुत सारे बाइट्स विशेष वर्ण और बड़े परीक्षण मामलों को संभालने के लिए हैं। यदि मुझे केवल गैर-भयानक वर्णों को संभालना है और संख्याएँ छोटी हैं (उदाहरण के लिए, पहला परीक्षण मामला), तो निम्न 24 बाइट्स इसे करेंगे:

dc -e${#2}o$1p|tr 0-9 $2

यह ${#2}स्ट्रिंग में वर्णों की संख्या प्राप्त करने के लिए पैरामीटर विस्तार का उपयोग करता है, आधार रूपांतरण करने के लिए एक डीसी प्रोग्राम बनाता है, और फिर परिवर्तित माध्यम से भेजता हैtr

हालांकि, यह नई कहानियों या रिक्त स्थान या टैब को संभाल नहीं पाएगा, हालांकि, आधार को प्रभावित किए बिना भागने के क्रम से निपटने के लिए, मैं wc -cपलायन के साथ व्याख्या करने के बाद एक चरित्र गणना करता हूं echo -en। यह कार्यक्रम को 38 बाइट तक विस्तारित करता है:

dc -e`echo -en $2|wc -c`o$1p|tr 0-9 $2

दुर्भाग्य से, डीसी के पास एक कष्टप्रद "सुविधा" है जहां अगर यह बड़ी संख्या में आउटपुट कर रहा है, तो यह इसे स्लैश + न्यूलाइन अनुक्रम के साथ लपेट देगा, इसलिए बड़े परीक्षण के मामलों में यह अतिरिक्त आउटपुट है। इसे हटाने के लिए, मैं tr -dc 0-9गैर-संख्यात्मक वर्णों को हटाने के लिए डीसी के आउटपुट को पाइप करता हूं । और हम वहां हैं।


मैं dc -e${#2}o$1p|tr 0-9 "$2"इनपुट को शाब्दिक रूप से ले जाने के लिए सुझाव देने जा रहा था, क्योंकि यह रिक्त स्थान को संभाल सकता है, लेकिन उदाहरण के लिए, रेंज कैरेक्टर के रूप में trव्यवहार नहीं करने का विकल्प नहीं है -। यदि इनपुट -स्ट्रिंग के एक छोर पर नहीं है, तो यह टूट जाता है। शायद आप उपयोग कर सकते हैं sed "y/0123456789/$2/"। नहीं, मुझे नहीं लगता है, जीएनयू sedको दोनों आर्ग्स की yलंबाई समान होने की आवश्यकता है , और यह न्यूलाइन पर चोक करने लगता है।
पीटर कॉर्ड्स

2

एपीएल (डायलॉग यूनिकोड) , 14 13 12 बाइट्स

⊢⌷⍨∘⊂⊥⍣¯1⍨∘≢

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

इन्फिक्स टैसिट फ़ंक्शन; फ्लोटिंग पॉइंट प्रतिनिधित्व के कारण सबसे बड़ा परीक्षण मामला नहीं संभाल सकता।

सहेजे गए 1 2 बाइट्स @ Adám को धन्यवाद!

हेडर के लिए 13 बाइट्स जोड़े गए ⎕IO←0:: मैं ndex O rigin = 0 और ⎕FR←1287: F loat R epretation = 128 बिट्स। (मैं भूल गया कि यह लागू नहीं होता है। )

कैसे?

⊢⌷⍨∘⊂⊥⍣¯1⍨∘≢    Tacit function, infix.
               Tally (number of elements in) the right argument.
         ⍨∘     Then swap the arguments of
     ⊥⍣¯1       Base conversion (to base ≢<r_arg>)
               Enclose (convert to an array)
  ⍨∘            Then swap the arguments of
               Index
               (Into) the right argument.


1

कैनवस , 7 बाइट्स

L┬{╵⁸@p

यहाँ यह कोशिश करो!

सीधे आगे कार्यान्वयन:

L┬{╵⁸@p
L      get the length of the input (popping the item)
 ┬     base decode the other input
  {    for each number there
   ╵     increment
    ⁸@   in the 1st input get that numbered item
      p  and output that

इनपुट कैरेक्टर सेट तब भी एक स्ट्रिंग हो सकता है, जब तक इसमें एक नई रेखा नहीं होती है, क्योंकि कैनवास में एक नया वर्ण नहीं होता है और स्वचालित रूप से इसे 2 डी ऑब्जेक्ट में बदल देता है।



1

SOGL V0.12 , 10 बाइट्स

l;A─{IaWp}

यह कोशिश करो!

सुंदर लंबे, विचार पर विचार भाषा में बहुत अधिक कार्यान्वित किया जाता है: यहां , दर्ज करना

¶    __   __    ¶   |  |_|  |   ¶___|       |___¶-   -   -   -  ¶ - - - - - - - ¶- - - - - - - -¶_______________¶

इस विधि का उपयोग कर एक संकुचित स्ट्रिंग देता है।



1

स्टैक्स , 2 बाइट्स

:B

इसे चलाएं और डीबग करें

:Bएक निर्देश है जो ऐसा करता है। यह सामान्य रूप से "स्ट्रिंग्स" की एक सरणी के बजाय "स्ट्रिंग" * पर काम करेगा। अंत में, इसका मतलब है कि आउटपुट एकल वर्ण सरणियों की एक सरणी है। लेकिन आउटपुट में स्पष्ट रूप से कुछ भी समतल होता है।

* स्टैक्स वास्तव में एक स्ट्रिंग प्रकार नहीं है। पाठ को कोडपॉइंट के पूर्णांक सरणियों द्वारा दर्शाया गया है।


हुह, मैंने इस आदेश पर कभी गौर नहीं किया ...
15:12 पर

यह बहुत है। मैंने एक बार स्टैक्स में एक निर्देश जोड़ा था जो पहले से मौजूद था, और मैं अभी भूल गया था। (सरणी गैर-अवरोही है?)
पुनरावृत्ति



1

सी (जीसीसी) , 110 बाइट्स

char s[99],S[99];i;f(x,_)char*_;{i=strlen(_);*s=*S=0;while(x)sprintf(S,"%c%s",_[x%i],s),strcpy(s,S),x/=i;x=s;}

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

विवरण:

char s[99],S[99];           // Two strings, s and S (capacity 99)
i;                          // A variable to store the length of the string
f(x,_)char*_;{              // f takes x and string _
    i=strlen(_);            // set i to the length of _
    *s=*S=0;                // empty s and S
    while(x)                // loop until x is zero
        sprintf(S,"%c%s",   // print into S a character, then a string
                _[x%i],s),  // character is the x%i'th character of _, the string is s
        strcpy(s,S),        // copy S into s
        x/=i;               // divide x by the length of the string (and loop)
    x=s;}                   // return the string in s

1
यदि आप एक बफर के अंत में शुरू करते हैं और पीछे की ओर काम करते हैं, तो आप बच सकते हैं sprintfमेरा सी संस्करण 53 बाइट्स है , जिसमें कॉलर द्वारा प्रदान किए गए आउटपुट बफर हैं। strcpyयदि आप बाइट्स को बफ़र की शुरुआत में कॉपी करना चाहते हैं तो आप अंत में एक कर सकते हैं ।
पीटर कॉर्ड्स

यह शानदार है। मुझे परवाह नहीं है अगर इसकी अजीब I / O प्रारूप है। अजीब I / O सी प्रसिद्धि का दावा है! अच्छा किया, मैं सुझाव है कि सी सुझाव पोस्ट में डाल देंगे।
लैंबडाटा

C को समझाने और तकनीक को सही ठहराने के लिए टिप्स ऑन गोल्फ में जवाब दिया ।
पीटर कॉर्ड्स

1

सीजेएम , 11 बाइट्स

liq_,@\b\f=

इसे ऑनलाइन आज़माएं! संख्या के रूप में इनपुट लेता है, फिर एक नई रेखा, फिर ASCII कला में वर्ण।

व्याख्या

li           e# Read the first line and convert it to an integer
  q_,        e# Read the rest of the input and push its length n
     @\b     e# Convert the number to its base-n equivalent, as an array of numbers
        \f=  e# Map over the array, taking each element's index from the string

चूंकि "आईओ लचीला है", मुझे लगता है कि आप liqशुरुआत में छुटकारा पा सकते हैं , और यह आपको 3 बाइट्स बचाता है!
क्रोमियम

1

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

रॉड ऑफ़ पाइथन सॉल्यूशन का पोर्ट ।

s=>g=n=>n?g(n/(l=s.length)|0)+s[n%l]:""

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


केवल n64-बिट तक ही काम करता है , है ना? (पायथन में मनमाने ढंग से सटीक पूर्णांकों का निर्माण किया गया है, लेकिन JS संख्याएँ स्वाभाविक रूप से- doubleतैरती हैं जिन्हें पूर्णांक में परिवर्तित किया जा सकता है)। 192814932567064724491210078921362661656086113085943149290590857466075897216166666 जैसे प्रश्न में बड़े परीक्षण मामलों के लिए काम नहीं लगता है, लेकिन प्रश्न इस तरह के उत्तर की अनुमति देता है। फिर भी, ध्यान दिया जाना चाहिए।
पीटर कॉर्डेस

1

SimpleTemplate , 86 बाइट्स

वाह, यह एक बहुत बड़ी चुनौती थी!

जब सूचकांक एक चर होता है, तो विशिष्ट अनुक्रमितों तक सीधे पहुंच की कमी के कारण इसे कठिन बना दिया गया था।
एक बग ने इसे लंबे समय तक बना दिया, जिसमें एक चर के अंदर मूल्यों को संग्रहीत करने की आवश्यकता होती है।

{@setA argv.1}{@eachargv.0}{@setC C,"{@echoA.",_,"}"}{@calljoin intoC"",C}{@/}{@evalC}

अपेक्षित मूल्य:

पहला तर्क ( argv.0) हो सकता है:

  • पूर्णांक
  • संख्याओं के साथ एक स्ट्रिंग
  • पूर्णांकों की एक सरणी

दूसरा तर्क ( argv.1) हो सकता है:

  • एक स्ट्रिंग
  • एक सरणी

यह कैसे काम करता है?

यह इस तरह से काम करता है:

  • संख्या / स्ट्रिंग के माध्यम से चक्र पहले तर्क के रूप में पारित हुए
  • चर Cको एक सरणी युक्त सेट करता है :
    • पिछला मान C
    • डोर "{@echoA."
    • लूप का मान
    • डोर "}"
  • एक साथ सब कुछ जोड़ता है (PHP के joinफ़ंक्शन का उपयोग करके )
    यह परिणाम, उदाहरण के लिए, Cयुक्त है"{@echoA.0}{@echoA.1}..."
  • के परिणाम का मूल्यांकन करता है C

Ungolfed:

{@set args argv.1}
{@each argv.0 as number}
    {@set code code, "{@echo args.", number , "}"}
    {@call join into code "", code}
{@/}
{@eval code}

आप इस कोड को इस पर आज़मा सकते हैं: https://ideone.com/NEKl2q


इष्टतम परिणाम

यदि कीड़े नहीं थे, तो यह सबसे अच्छा परिणाम होगा, सीमाओं के लिए लेखांकन (77 बाइट्स):

{@eachargv.0}{@setC C,"{@echoargv.1.",_,"}"}{@calljoin intoC"",C}{@/}{@evalC}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.