Kendinden referanslı bir dize yapın


27

Sen (burada bir dize yapmak istiyorum 1-endeksli endeksine) karakteri nolduğunu n. Ne zaman n10 daha azdır, bu kolaydır: "123456789". nÖrneğin 12 olduğunda , imkansız hale gelir, çünkü 9'dan büyük (10 tabanındaki) sayılar birden fazla karakter alır. Biz iki karakterlik alt dizeleri içine dize bölerek tehlikeye atabilir: "020406081012". Şimdi her sonunun endeksi alt dize n olduğunu n.

Bu, herhangi bir ddijit sayısı için genelleştirilebilir . İşte üç basamaklı bir sayı için dizenin "0991021" kısmı için bir açıklama:

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

Henüz çözmediyseniz, bir dize veya tam sayı alan bir program / işlev yazacak ve yukarıda belirtilen şekilde kendi kendini yönlendiren dizesini yazacaksınız. Ayrıca, tek basamaklı sayıların, karakterlerin veya tek karakterli dizelerin bir dizisini de çıkarabilirsiniz.

Verilen tamsayı her zaman uzunluğu boyunca pozitif ve bölünebilir olacaktır (örneğin, 126, 3 ile bölünebilir; 4928, 4 ile bölünebilir). Programınız isteğe bağlı olarak büyük bir girdi için teorik olarak çalışmalıdır, ancak bunun dilinizin maksimum tamsayı ve / veya string uzunluğundan daha küçük olduğunu varsayabilirsiniz.

Hâlâ anlamadıysanız, bazı gözlemler: Çıktının uzunluğu her zaman girdinin kendisi olacaktır ve çıktıda görünen sayılar, girişteki hane sayısı ile bölünebilir olacaktır.

Bu , bayt cinsinden en kısa cevap kazanır.

Test durumları

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

Yanıtlar:


8

Jöle , 12 bayt

VRUmLDUz0ZFU

G / Ç basamak dizileri şeklindedir. Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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
Bakın anne, Unicode yok!
Dennis,

8
Yine de kızgın bir sürücüye benziyor.
Jonathan Allan,

12

C, 64 bayt

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

Stdin'de girdi olarak tek bir tamsayı alır.


9

JavaScript (ES6), 83 bayt

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

Evet, iç içe geçmiş bir şablon dizesidir. ES7'de 79 bayt:

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

7

MATL , 15 14 bayt

VntG3$:10YA!1e

Çevrimiçi deneyin!

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 bayt

Kod:

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

Açıklama:

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.

Birleştirme böyle yapılır:

Bunlardan:

000
 12

Bu sonuçlanır:

012

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


Güzel! Bunun böyle ñçalıştığını bilmiyordum .
Emigna

1
@Emigna Evet, ama oldukça uzun görünüyor. Muhtemelen bu yapı için bir eklenti yapmalıyım: P.
Adnan,

Dolgu için bir yerleşik de gerçekten yararlı olacaktır.
Emigna

6

Python 2, 78 70 68 64 63 bayt

Aslında yıkılabilir Karpuz fikrine dayanarak (kullanarak bile daha küçük hale getirir inputhatta iyidir) (hayır (string geriye 4 bayt kaydeder doldurulması) ()en while):

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

İşte eski 70 bayt yaklaşımı ( strDennis yerine köşeli parantezler yerine ters tırnak kullanarak 8 bayttan tasarruf edin ).

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

Zfill'i unuttum ... kahretsin.
Yıkılabilir Limon

Sen kullanabilirsiniz ​`x`​yerine str(x). Ayrıca, []jeneratörün etrafına ihtiyacınız yok .
Dennis,

Beni yine aştın ... zor zamanlar ciddi önlemler almak için çağırır: Python 2'ye değiştirmem gerekecek
Yıkılabilir Limon

Allah kahretsin yine yaptın!
Yıkılabilir Limon

1
İçeride parens gerek yok while(n).
Dennis,

5

Python 2,63 bayt

def f(n):l=len(`n`);print'%%0%dd'%l*(n/l)%tuple(range(l,n+1,l))

İdeone üzerinde test et .


3
Dat formatı dizesi ° _ °
Karl Napf

4

JavaScript (ES6), 66

Özyinelemeli, nbir dizge olarak giriş (sayı değil) ve çıktı dizesi boyutunu 2 GB ile sınırlama (bu, çoğu javascript motorunun dize sınırının üstünde)

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

Ölçek

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

R, 66 64 62 bayt

Düzenle:

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

ilk golf denemesi ...


2
Merhaba ve PPCG'ye hoş geldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ

3

2sable , 13 bayt

Kod:

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

CP-1252 kodlamasını kullanır .


neden bu 05AB1F adını vermedin? : 3
Conor O'Brien,

1
@ ConorO'Brien Aslında bunu düşündüm, ama sonra isimler gerçekten benzer ve kafa karıştırıcı görünürdü : p.
Adnan,

demek istiyorsun ki15AB1E
ASCII-sadece

3

Brachylog , 53 45 42 37 28 bayt

lB, ybeN: B% 0, N: ef: {, "0": "9" y:? m.} acAl: Br -: "0" rjb: Acw \ lB 
, ybeN: B% 0,10 : B ^ N +: ef: {, "0", "9" y:. m} acbw \
 , ybeN: B% 0,10: B ^: N +: ef: {: 16 +: @ Prm .} acbw \ lB 
, ybeN: B% 0,10: B ^: N +: efbe: 16 +: @ Prmw \
? İB, ybeN:% B 0,10: B ^ N +: efbew \

Çevrimiçi deneyin!


3

Bash, 31 22 bayt

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

İdeone üzerinde test et .

6 baytlık golf oynamak için @izabera'ya teşekkürler!


3

Ruby, 52 48 + nbayrak = 49 bayt

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

Belki chopgirişin izleyen bir yeni satır olmadan iletildiğini varsayarsanız gerek yoktur? İşe yarayıp yaramadığından emin değilim. Ya da her zaman bir tane olduğunu varsaymaya ve yazmaya ne dersiniz l=~-size?
Lynn,

@Lynn böyle çağırmak sizebenim için işe yaramıyor. Oh, daha önceki bir cevapta kullandığım bir numarayı zaten daha kısa hatırladım
Value Ink

2

Python 3 2, 79 74 69 65 68 67 bayt

Teşekkürler Dennis!

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

Kötü çıktı yönteminden bayt sayısı artışı


1
Bunun len(x)yerine olmamalı fve ardından bir değişkene atayarak baytları kurtarmalı mıyım?
Karl Napf

Sanmıyorum .. ne demek istiyorsun? Ayrıca, seni python 2 ile aşardım, ama şu anda olan bazı aptal şeyler.
Yıkılabilir Limon

Python 2'ye geçmiş gibi görünüyorsunuz. Ayrıca, meta üzerindeki fikir birliğine göre, çıktının bir kısmının üzerine yazmak için geri almanın kullanılmasına yalnızca ASCII sanat zorluklarında izin verilir.
Dennis,

Python 2'de, /tamsayılar bölümü foe.integer argümanlarını gerçekleştirir.
Dennis,

2

zsh, 28 bayt

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

zsh + seq, 21 20 bayt

Bu hemen hemen Dennis ile aynı cevabı ancak 20 byte, zsh çünkü

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

2

Haskell, 51 bayt

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

2

Perl, 40 bayt

İçin 39 bayt kodu + 1 -n.

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

kullanım

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}

Gerçekten hiç golf oynamayan, sadece spec ileri düz bir uygulama.

                        $ / 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

Javascript - 76

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

veya 71 dize bağımsız değişkenler için izin eğer:

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

@ User81655 için teşekkürler!

Ungolfed:

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

iyileştirme için çok fazla yer var ama şu an yorgunum


Güzel! Ben (76 bayt) yapılmış olabilir birkaç iyileştirme bulundu: n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Ana bit bir fordöngü ve Neil'in 1e${b}hilesi kullanıyor.
user81655

@ user81655 - bana veriyor Uncaught SyntaxError: Invalid or unexpected token. Henüz uyanık olduğum için henüz hata ayıklamadım: D
Ağustos'ta

Hmmm. SO yorumlarına bazen eklenen gizli karakterler olabilir. Yazmayı dene.
kullanici81655

2

R, 149 142 138 bayt

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="")

Kodda bırakmak nchar, değiştirmeyle aynı sayıda baytlık bir program verir b, ancak kodda dolaşan rastgele harflerin olması onu daha gizemli yapar.

Ungolfed:
Her biri nchar(strtoi(something))verilen bir sayıdaki sayıları hesaplamaya izin verir.

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İşlev splitten elemanları içeren vektörün bir listesini verir. Bu yüzden 1listenin st öğesine, sonra ida vektörün th öğesine erişmelisiniz.strsplit[[1]][i]


str_pad ()
hedgedandlevered

@hedgedandlevered: peki, bu fonksiyon bir pakete ihtiyaç duyar (yani, vanilya R ile çalıştırılamaz ) ve PPCG-ing
Frédéric

1

SQF - 164

Dosya olarak işlevini kullanarak:

#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]}

Ara INTEGER call NAME_OF_COMPILED_FUNCTION


1

PowerShell, 77 bayt

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

Dize atmalarını kısaltmak için string enterpolasyonu kullanır. İkinci noktalı virgülten önceki bölümler, yeniden kullanılanların adlarını kısaltır. Ardından, girdiye kadar olan her tam sayı - ve yalnızca giriş uzunluğunun katları olan - giriş dizesi kadar uzun olacak ve sonunda bir araya gelecektir.


1

Aslında, 30 bayt

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

Çevrimiçi deneyin!

Bu kodun uzunluğundan memnun değilim ama çok daha kısa yapılabileceğinden emin değilim (eğer varsa).

Açıklama:

;╝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 bayt

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

Çevrimiçi deneyin . Henüz kimse CJam'da yayınlanmadı, bu yüzden test senaryoları için kullandığım senaryo bu.

açıklama

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 bayt

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

İpuçları daha sonra açığız. Kendimi bir bayt ile bir for döngüden bir süre döngüsüne değiştirerek golf oynamak için yönetin.

Bu kod bunun komut satırından çalıştırıldığını ve $ argv [1] ın int olduğunu varsayar.

Sayesinde:

@AlexGittemeier Önerisi (yorumlara bakın) bunu 5 bayt ile 78 bayta kadar yükseltti.


Değiştirebilirsiniz echo sprintf(...)->printf(...)
Alex Gittemeier

0

Perl 6, 69 59 46 bayt

{my \a=.chars;(a,2*a...$_).fmt("%0"~a~"s","")}

1
Sen kullanabilirsiniz fmtyerine listesinde map, sprintfve [~]. 42 bayt
Jo King,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.