(कुछ हद तक) सेल्फ रेफरेंशियल स्ट्रिंग बनाएं


27

आप एक स्ट्रिंग बनाना चाहते हैं जहां इंडेक्स में ( 1-अनुक्रमित ) चरित्र nहै n। जब n10 से कम हो, तो यह आसान है "123456789":। जब n12 वर्ष का होता है, उदाहरण के लिए, यह असंभव हो जाता है, क्योंकि 9 से अधिक संख्या (बेस 10 में) एक से अधिक वर्ण लेते हैं। हम स्ट्रिंग को दो-चरित्र वाले पदार्थों में विभाजित करके समझौता कर सकते हैं "020406081012":। अब प्रत्येक स्थानापन्न के अंत का सूचकांक nहै n

यह किसी भी d-digit नंबर के लिए सामान्यीकृत किया जा सकता है । यहाँ तीन अंकों की संख्या के लिए स्ट्रिंग के "0991021" भाग के लिए एक स्पष्टीकरण दिया गया है:

Index:     ... * 97  98  99*100 101 102*103 ...
               *           *           *
               *---+---+---*---+---+---*---+
Character: ... * 0 | 9 | 9 * 1 | 0 | 2 * 1 | ...
               *---+---+---*---+---+---*---+

यदि आपने अभी तक इसका पता नहीं लगाया है, तो आप एक प्रोग्राम / फ़ंक्शन लिखेंगे जो एक स्ट्रिंग या पूर्णांक लेता है और ऊपर निर्दिष्ट के रूप में इसके सेल्फ-रेफ़रेंशियल स्ट्रिंग को आउटपुट करता है। आप एकल-अंकीय संख्याओं, वर्णों या एकल-वर्ण स्ट्रिंग्स की एक सरणी भी आउटपुट कर सकते हैं।

दिया गया पूर्णांक हमेशा धनात्मक और विभाज्य होगा जिसकी लंबाई (जैसे 126 3 से विभाज्य है; 4928 4 से विभाज्य है)। आपके कार्यक्रम को सैद्धांतिक रूप से एक बड़े पैमाने पर इनपुट के लिए काम करना चाहिए, लेकिन आप यह मान सकते हैं कि यह आपकी भाषा के अधिकतम पूर्णांक और / या स्ट्रिंग लंबाई से छोटा है।

यदि आप अभी भी इसे प्राप्त नहीं करते हैं तो कुछ अवलोकन: आउटपुट की लंबाई हमेशा इनपुट ही होगी, और आउटपुट में दिखाई देने वाली संख्या इनपुट में अंकों की संख्या से विभाज्य होगी।

यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।

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

1    => 1
9    => 123456789
10   => 0204060810
105  => 003006009012015018021024027030033036039042045048051054057060063066069072075078081084087090093096099102105
1004 => 00040008001200160020002400280032003600400044004800520056006000640068007200760080008400880092009601000104010801120116012001240128013201360140014401480152015601600164016801720176018001840188019201960200020402080212021602200224022802320236024002440248025202560260026402680272027602800284028802920296030003040308031203160320032403280332033603400344034803520356036003640368037203760380038403880392039604000404040804120416042004240428043204360440044404480452045604600464046804720476048004840488049204960500050405080512051605200524052805320536054005440548055205560560056405680572057605800584058805920596060006040608061206160620062406280632063606400644064806520656066006640668067206760680068406880692069607000704070807120716072007240728073207360740074407480752075607600764076807720776078007840788079207960800080408080812081608200824082808320836084008440848085208560860086408680872087608800884088808920896090009040908091209160920092409280932093609400944094809520956096009640968097209760980098409880992099610001004

जवाबों:


8

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

VRUmLDUz0ZFU

I / O अंक सरणियों के रूप में है। इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

यह काम किस प्रकार करता है

VRUmLDUz0ZFU  Main link. Argument: A (digit array)

V             Eval; turn the digits in A into an integer n.
 R            Range; yield [1, ..., n].
  U           Upend; reverse to yield [n, ..., 1].
    L         Yield the length (l) of A.
   m          Modular; keep every l-th integer in A.
     D        Decimal; convert each kept integer into the array of its digits.
      U       Upend; reverse the digits of each integer.
       z0     Zip/transpose with fill value 0.
         Z    Zip again.
              This right-pads all digit arrays with zeroes.
          F   Flatten the resulting 2D array.
           U  Upend/reverse it.

7
देखो 'मा, नो यूनिकोड!
डेनिस

8
फिर भी यह कुछ गुस्सैल ड्राइवर की तरह दिखता है।
जोनाथन एलन

12

सी, 64 बाइट्स

l,i;main(n){for(scanf("%d%n",&n,&l);i<n;)printf("%0*d",l,i+=l);}

स्टड पर इनपुट के रूप में एक पूर्णांक लेता है।


9

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

n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${+`1e${l}`+l*++i}`.slice(1)).join``

हाँ, यह एक नेस्टेड टेम्पलेट स्ट्रिंग है। ES7 में 79 बाइट्स:

n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${10**l+l*++i}`.slice(1)).join``

7

MATL , 15 14 बाइट्स

VntG3$:10YA!1e

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

V        % Implicitly input number, n. Convert to string
n        % Length of that string, s
t        % Duplicate s
G        % Push n again
3$:      % 3-input range (s,s,n): generates [s, 2*s, ... ] up to <=n
10YA     % Convert each number to base 10. This gives a 2D array of char, with each
         % number on a row, left-padded with zeros if needed
!1e      % Reshape into a string, reading in row-major order. Implicitly display

6

05AB1E , 15 बाइट्स

कोड:

LD¹gÖÏvy0¹g×0ñ?

स्पष्टीकरण:

L                # Get the array [1, ..., input].
 D               # Duplicate this array.
  ¹g             # Get the length of the first input.
    Ö            # Check if it's divisible by input length.
     Ï           # Keep those elements.
      vy         # For each...
         ¹g      # Get the length of the first input.
        0  ×     # String multiply that with "0".
            0ñ   # Merge with the number.
              ?  # Pop and print without a newline.

विलय इस तरह किया जाता है:

इनमे से:

000
 12

यह इस में परिणाम है:

012

CP-1252 एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!


ठंडा! पता नहीं था कि ñइस तरह काम किया।
23

1
@Emigna हाँ, लेकिन यह थोड़ा लंबा दिखता है। मुझे शायद उस बिलिन के लिए एक बेसिन बनाना चाहिए: पी।
अदनान

पैडिंग के लिए एक बिलिन वास्तव में भी उपयोगी होगा।
एमिगा

6

पायथन 2, 78 70 68 64 63 बाइट्स

वास्तव में विनाशकारी तरबूज के विचार पर आधारित यह इसे और भी छोटा बनाता है (उपयोग inputकरना बेहतर है) (स्ट्रिंग को पीछे की ओर 4 बाइट्स बचाता है) (नहीं ()पर while):

n,s=input(),''
l=len(`n`)
while n:s=`n`.zfill(l)+s;n-=l
print s

यहाँ पुराने 70 बाइट दृष्टिकोण है ( strडेनिस धन्यवाद के लिए जनरेटर के चारों ओर वर्ग कोष्ठक छोड़ने के बजाय बैकक्वाट्स का उपयोग करके 8 बाइट्स को सहेजना ):

def f(n):l=len(`n`);print"".join(`x`.zfill(l)for x in range(l,n+l,l))

मैं zfill के बारे में भूल गया ... झकना।
विध्वंसक नींबू

आप उपयोग कर सकते हैं ​`x`​के बजाय str(x)। इसके अलावा, आप []जनरेटर के आसपास की जरूरत नहीं है ।
डेनिस

आपने मुझे फिर से उकसाया ... गंभीर उपायों के लिए गंभीर बार कॉल: मैं अजगर 2 में बदलने वाला हूं
विनाशकारी नींबू

Goddamnit आप इसे फिर से किया!
विनाशकारी नींबू

1
आप में कोष्ठक की जरूरत नहीं है while(n)
डेनिस


4

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

पुनरावर्ती, nएक स्ट्रिंग के रूप में इनपुट (संख्या नहीं) और आउटपुट स्ट्रिंग आकार को 2GB तक सीमित करता है (जो कि सबसे जावास्क्रिप्ट इंजन की स्ट्रिंग सीमा से ऊपर है)

f=(n,i=1e9,s='',l=n.length)=>s[n-1]?s:f(n,i+=l,s+(i+'').slice(-l))

परीक्षा

f=(n,i=1e9,s='',l=n.length)=>s[n-1]?s:f(n,i+=l,s+(i+'').slice(-l))

function test() {
  var v=I.value;
  Alert.textContent=v % v.length ?
    'Warning: input value is not divisible by its string length':'\n';
  Result.textContent=f(v);
}  

test()
<input type=number id=I value=105 oninput='test()' max=500000>
<pre id=Alert></pre>
<pre id=Result></pre>


4

आर, 66 64 62 बाइट्स

संपादित करें:

x=nchar(n<-scan());paste0(str_pad(1:(n/x)*x,x,,0),collapse="")

पहला गोल्फ प्रयास ...


2
नमस्ते, और PPCG में आपका स्वागत है! अच्छी पहली पोस्ट!
R

3

2sable , 13 बाइट्स

कोड:

g©÷F®N>*0®×0ñ

CP-1252 एन्कोडिंग का उपयोग करता है ।


आपने इस 05AB1F का नाम क्यों नहीं रखा? : 3
कॉनर ओ'ब्रायन

1
@ ConorO'Brien मैं वास्तव में उस के बारे में सोचा था, लेकिन तब नाम वास्तव में समान और भ्रमित दिखेंगे : पी।
अदनान

आपका मतलब है15AB1E
केवल


3

बैश, 31 22 बाइट्स

seq -ws '' ${#1}{,} $1

Ideone पर इसका परीक्षण करें ।

6 बाइट्स से गोल्फ के लिए @izabera धन्यवाद!


3

रूबी, 52 48 + nध्वज = 49 बाइट्स

((l= ~/$/)..$_.to_i).step(l){|j|$><<"%0#{l}d"%j}

हो सकता है chopकि आपको यह मानने की आवश्यकता न हो कि क्या आप मानते हैं कि इनपुट एक अनुगामी न्यूलाइन के बिना पारित किया गया है? मुझे यकीन नहीं है कि अगर यह काम करेगा। या कैसे वहाँ के बारे में हमेशा एक है, और लेखन l=~-size?
लिन

@ इस sizeतरह कॉल करना मेरे लिए काम नहीं करता है। ओह ठीक है, मुझे एक चाल याद है जो मैंने पहले वाले उत्तर में इस्तेमाल की थी जो कि छोटी है
वैल्यू इंक

2

पायथन 3 2, 79 74 69 65 68 67 बाइट्स

धन्यवाद डेनिस!

def f(n):i=l=len(`n`);s='';exec n/l*"s+=`i`.zfill(l);i+=l;";print s

खराब आउटपुट विधि से बाइट की गिनती बढ़ जाती है


1
len(x)इसके बजाय इसे नहीं होना चाहिए fऔर फिर इसे एक चर में निर्दिष्ट करके बाइट्स को बचाएं?
कार्ल नेपफ

मुझे ऐसा नहीं लगता .. आपका क्या मतलब है। इसके अलावा, मैंने आपको अजगर 2 के साथ आउटगोल्ड कर दिया होगा, लेकिन कुछ बेवकूफ चीजें जो अभी हो रही हैं ।_।
विनाशकारी नींबू

आपको लगता है कि पाइथन 2 पर स्विच किया गया है। इसके अलावा, मेटा पर सहमति के अनुसार , आउटपुट के भाग को अधिलेखित करने के लिए बैकस्पेस का उपयोग केवल ASCII कला चुनौतियों में किया जाता है।
डेनिस

पायथन 2 में, /पूर्णांक विभाजन foe.integer तर्क करता है।
डेनिस

2

zsh, 28 बाइट्स

printf %0$#1d {$#1..$1..$#1}

zsh + seq, 21 20 बाइट्स

यह बहुत डेनिस के रूप में एक ही जवाब है, लेकिन 20 बाइट्स में क्योंकि zsh

seq -ws '' $#1{,} $1

2

हास्केल, 51 बाइट्स

f n|k<-length$show n=[k,2*k..n]>>=tail.show.(+10^k)

2

पर्ल, 40 बाइट्स

39 बाइट्स कोड + 1 के लिए -n

$}=y///c;printf"%0$}d",$i+=$}while$i<$_

प्रयोग

echo -n 9 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
123456789
echo -n 10 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
0204060810
echo -n 102 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
003006009012015018021024027030033036039042045048051054057060063066069072075078081084087090093096099102
echo -n 1000 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
0004000800120016002000240028003200360040004400480052005600600064006800720076008000840088009200960100010401080112011601200124012801320136014001440148015201560160016401680172017601800184018801920196020002040208021202160220022402280232023602400244024802520256026002640268027202760280028402880292029603000304030803120316032003240328033203360340034403480352035603600364036803720376038003840388039203960400040404080412041604200424042804320436044004440448045204560460046404680472047604800484048804920496050005040508051205160520052405280532053605400544054805520556056005640568057205760580058405880592059606000604060806120616062006240628063206360640064406480652065606600664066806720676068006840688069206960700070407080712071607200724072807320736074007440748075207560760076407680772077607800784078807920796080008040808081208160820082408280832083608400844084808520856086008640868087208760880088408880892089609000904090809120916092009240928093209360940094409480952095609600964096809720976098009840988099209961000

2

k4, 27

{,/"0"^(-c)$$c*1+!_x%c:#$x}

वास्तव में बिल्कुल भी गोल्फ नहीं है, बस कल्पना के सीधे-सीधे कार्यान्वयन।

                        $ / string
                       #  / count
                     c:   / assign to c
                   x%     / divide x by
                  _       / floor
                 !        / range (0-based)
               1+         / convert to 1-based
             c*           / multiply by count
            $             / string
       (-c)               / negative count
           $              / pad (negative width -> right-aligned)
   "0"^                   / fill blanks with zeros
 ,/                       / raze (list of string -> string)

2

जावास्क्रिप्ट - 76

n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)')

या 71 यदि तर्कों के लिए अनुमति दे:

n=>eval('c="";for(a=b=n.length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)')

@ User81655 को धन्यवाद!

Ungolfed:

function x(n)
{ 
   c = "", a = b = (""+n).length; 
   while(a<=n)
   {
       c=c+"0".repeat(b-(""+a).length)+a
       a+=b;
   }
   return c;
}

सुधार के लिए बहुत जगह है, लेकिन मैं अभी थक गया हूँ


अच्छा! मुझे कुछ सुधार मिले (76 बाइट्स) n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'):। मुख्य बिट्स एक forलूप और नील की 1e${b}चाल का उपयोग कर रहे हैं ।
user81655

@ user81655 - यह मुझे देता है Uncaught SyntaxError: Invalid or unexpected token। अभी तक जागृत नहीं हूं क्योंकि मैं अभी जाग रहा हूं: D
eithed

हममम। यह छिपे हुए पात्र हो सकते हैं जिन्हें कभी-कभी SO टिप्पणियों में जोड़ा जाता है। इसे लिखने का प्रयास करें।
user81655

2

आर, 149 142 138 बाइट्स

x=rep(0,n);a=strtoi;b=nchar;for(i in 1:(n=scan()))if(!i%%b(a(n)))x[i:(i-b(a(i))+1)]=strsplit(paste(a(i)),"")[[1]][b(a(i)):1];cat(x,sep="")

ncharकोड में छोड़ने से बाइट्स की समान संख्या के साथ एक प्रोग्राम दिया जाता है b, लेकिन इसके साथ कोड में घूमते हुए यादृच्छिक अक्षर इसे और अधिक रहस्यमय बनाते हैं ... रहस्यमय

अघोषित:
प्रत्येक nchar(strtoi(something))दिए गए संख्या में अंकों की संख्या की गणना करने की अनुमति देता है।

n=scan()   #Takes the integer 
x=rep(0,n) #Creates a vector of the length of this integer, full of zeros

for(i in 1:n)
    if(!i%%b(strtoi(n)))         #Divisibility check
        x[i:(i-nchar(as.integer(i))+1)]=strsplit(paste(a(i)),"")[[1]][nchar(as.integer(i)):1]; 
        #This part replace the zeros from a given position (the index that is divisible) by the numerals of this position, backward.

cat(x,sep="")

strsplitसमारोह splitten तत्वों से युक्त वैक्टर की एक सूची आउटपुट। इसलिए आपको 1सूची के सेंट एलिमेंट तक पहुंचना होगा , और फिर iवेक्टर के वें एलिमेंट को लिखना होगाstrsplit[[1]][i]


str_pad ()
hedgedandlevered

@hedgedandlevered: ठीक है, इस फ़ंक्शन को एक पैकेज की आवश्यकता है (अर्थात इसे वेनिला आर के साथ नहीं चलाया जा सकता है ), और मैं PPCG-ing
Frédéric

1

SQF - 164

फंक्शन-ए-ए-फाइल फॉर्मेट का उपयोग करना:

#define Q String""
l=(ceil log _this)+1;s='';for[{a=l},{a<=_this},{a=a+l}]do{c=([a]joinQ)splitQ;reverse c;c=(c+['0'])select[0,l];reverse c;s=format[s+'%1',c joinQ]}

के रूप में बुलाओ INTEGER call NAME_OF_COMPILED_FUNCTION


1

पॉवरशेल, 77 बाइट्स

$x="$($args[0])";$l=$x.Length;-join(1..($x/$l)|%{"$($_*$l)".PadLeft($l,'0')})

स्ट्रिंग स्ट्रिंग को छोटा करने के लिए स्ट्रिंग प्रक्षेप का उपयोग करता है। दूसरे अर्धविराम से पहले के हिस्से पुन: उपयोग की गई चीजों के नामों को छोटा करते हैं। फिर, इनपुट तक प्रत्येक पूर्णांक - और केवल वे जो इनपुट की लंबाई के गुणक हैं - इनपुट स्ट्रिंग के रूप में लंबे समय तक गद्देदार होते हैं और अंत में एक में शामिल हो जाते हैं।


1

दरअसल, 30 बाइट्स

;╝R╛$l;)*@#"%0{}d"f╗`#╜%`MΣ╛@H

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

मैं इस कोड की लंबाई से खुश नहीं हूं, लेकिन मुझे यकीन नहीं है कि इसे बहुत छोटा किया जा सकता है (यदि बिल्कुल भी)।

स्पष्टीकरण:

;╝R╛$l;)*@#"%0{}d"f╗`#╜%`MΣ╛@H
;╝                              duplicate input, push a copy to reg1
  R                             range(1, input+1)
   ╛$l                          push input from reg1, stringify, length
      ;)                        duplicate and move copy to bottom of stack
        *                       multiply range by length of input
         @#                     swap range with length, make length a 1-element list
           "%0{}d"f             "%0{}d".format(length) (old-style Python format string for zero-padding integers to length of input)
                   ╗            save format string in reg0
                    `#╜%`M      for each value in range:
                     #            make it a 1-element list
                      ╜%          format using the format string
                          Σ     concatenate
                           ╛@H  take only the first (input) characters in the resulting string

0

CJam, 19 बाइट्स

q_,:V\i,%{V+sV0e[}/

इसे ऑनलाइन आज़माएं । सीजेएम में अभी तक किसी ने पोस्ट नहीं किया है, इसलिए यह स्क्रिप्ट है जिसे मैंने परीक्षण मामलों के लिए उपयोग किया है।

व्याख्या

q_,:V  e# Store the length of the input as V
\i,    e# Push the range from 0 to the input
%      e# Keep only every V'th number in the array
{      e# Do this for each number:
  V+   e# Add V to get the right number of leading zeroes
  s    e# Convert to string for left padding
  V    e# Push V, the length to bring each string to, and...
  0    e# The character to add to the left
  e[   e# Left pad
}/

0

PHP, 83 78 बाइट्स

<?$a=$argv[1];$i=$y=strlen($a);while($y<=$a){printf('%0'.$i.'d', $y);$y+=$i;}

युक्तियाँ अधिक हैं तो स्वागत है। इसे एक बाइट से एक लूप से थोड़ी देर के लूप में बदलकर अपने आप को गोल्फ के लिए प्रबंधित करें।

यह कोड मानता है कि इसे कमांड लाइन से निष्पादित किया जा रहा है और यह $ argv [1] इंट है।

करने के लिए धन्यवाद:

@AlexGittemeier उनके सुझाव (टिप्पणियों को देखें) ने इसे 5 बाइट्स से 78 बाइट्स तक पहुंचा दिया।


आप बदल सकते हैं echo sprintf(...)->printf(...)
एलेक्स Gittemeier

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