Buat string (agak) referensial sendiri

27

Anda ingin membuat string di mana karakter ( 1-diindeks ) pada indeks nberada n. Ketika nkurang dari 10, ini mudah: "123456789". Ketika n12, misalnya, menjadi tidak mungkin, karena angka lebih besar dari 9 (dalam basis 10) mengambil lebih dari satu karakter. Kita bisa kompromi dengan membagi string menjadi substring dua karakter: "020406081012". Sekarang indeks akhir setiap substring n adalah n.

Ini dapat digeneralisasi untuk semua dangka -digit. Berikut ini penjelasan untuk bagian "0991021" dari string untuk angka tiga digit:

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

Jika Anda belum mengetahuinya, Anda harus menulis program / fungsi yang mengambil string atau integer dan mengeluarkan string referensial sendiri seperti yang ditentukan di atas. Anda juga dapat menampilkan larik angka tunggal, karakter, atau string karakter tunggal.

Bilangan bulat yang diberikan akan selalu positif dan habis dibagi oleh panjangnya (mis. 126 habis dibagi 3; 4928 habis dibagi 4). Program Anda secara teoritis harus bekerja untuk input besar sembarang, tetapi Anda dapat menganggap itu lebih kecil dari bilangan bulat maksimum dan / atau panjang string bahasa Anda.

Beberapa pengamatan jika Anda masih belum mendapatkannya: Panjang output akan selalu menjadi input itu sendiri, dan angka-angka yang muncul dalam output akan habis dibagi dengan jumlah digit pada input.

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Uji kasus

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

Jawaban:

8

Jelly , 12 byte

VRUmLDUz0ZFU

I / O dalam bentuk digit array. Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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.
Dennis
sumber
7
Lihat bu, tidak ada Unicode!
Dennis
8
Namun sepertinya beberapa pengemudi marah.
Jonathan Allan
12

C, 64 byte

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

Mengambil integer tunggal sebagai input pada stdin.

orlp
sumber
9

JavaScript (ES6), 83 byte

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

Ya, itu string templat bersarang. 79 byte dalam ES7:

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

MATL , 15 14 byte

VntG3$:10YA!1e

Cobalah online!

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
Luis Mendo
sumber
6

05AB1E , 15 byte

Kode:

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

Penjelasan:

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.

Penggabungan dilakukan seperti ini:

Dari ini:

000
 12

Hasilnya adalah ini:

012

Menggunakan pengkodean CP-1252 . Cobalah online! .

Adnan
sumber
Keren! Tidak tahu itu ñberhasil seperti itu.
Emigna
1
@ Emigna Ya, tapi terlihat agak panjang. Saya mungkin harus membuat builtin untuk builtin itu: P.
Adnan
Builtin untuk padding akan sangat berguna juga.
Emigna
6

Python 2, 78 70 68 64 63 byte

Sebenarnya mendasarkan pada ide Semangka Destructible membuatnya lebih kecil (menggunakan inputlebih baik) (mengisi string mundur menghemat 4 byte) (tidak ()sama while):

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

Berikut ini adalah pendekatan 70 byte yang lama (Menyimpan 8 byte dengan menggunakan backquotes alih-alih strdan menjatuhkan tanda kurung di sekitar generator berkat Dennis):

def f(n):l=len(`n`);print"".join(`x`.zfill(l)for x in range(l,n+l,l))
Karl Napf
sumber
Saya lupa tentang zfill ... sialan.
Lemon Destructible
Anda bisa menggunakan ​`x`​bukan str(x). Juga, Anda tidak perlu di []sekitar generator.
Dennis
Anda mengalahkan saya lagi ... kali serous meminta langkah-langkah serius: Saya harus mengubah ke python 2
Destructible Lemon
sial kau melakukannya lagi!
Destructible Lemon
1
Anda tidak perlu memiliki orangtua while(n).
Dennis
5

Python 2, 63 byte

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

Uji di Ideone .

Dennis
sumber
3
Dat format string ° _ °
Karl Napf
4

JavaScript (ES6), 66

Rekursif, input nsebagai string (bukan angka) dan membatasi ukuran string output hingga 2GB (yang berada di atas batas string kebanyakan mesin javascript)

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

Uji

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>

edc65
sumber
4

R, 66 64 62 byte

edit:

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

usaha golf pertama ...

lindung nilai dan pajak
sumber
2
Hai, dan selamat datang di PPCG! Posting pertama yang bagus!
Rɪᴋᴇʀ
3

2sable , 13 byte

Kode:

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

Menggunakan pengkodean CP-1252 .

Adnan
sumber
mengapa Anda tidak memberi nama 05AB1F ini? : 3
Conor O'Brien
1
@ ConorO'Brien Saya benar-benar memikirkan hal itu, tetapi kemudian nama-nama itu akan terlihat sangat mirip dan membingungkan:
Adnan
maksud Anda15AB1E
ASCII
3

Brachylog , 53 45 42 37 28 byte

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 \ 
lB,? YbeN: B% 0,10: B ^: N +: ef: {: 16 +: @ Prm .} acbw \ 
lB,? ybeN: B% 0,10: B ^: N +: efbe: 16 +: @ Prmw \
lB,? ybeN: B% 0,10: B ^: N +: efbew \

Cobalah online!

Biarawati Bocor
sumber
3

Bash, 31 22 byte

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

Uji di Ideone .

Terima kasih kepada @izabera karena bermain golf 6 byte!

Dennis
sumber
3

Ruby, 52 48 + nbendera = 49 byte

((l= ~/$/)..$_.to_i).step(l){|j|$><<"%0#{l}d"%j}
Nilai Tinta
sumber
Mungkin Anda tidak perlu chopjika Anda menganggap input dilewatkan tanpa mengekor baris baru? Saya tidak yakin apakah itu akan berhasil. Atau bagaimana dengan anggapan selalu ada, dan menulis l=~-size?
Lynn
@Lynn menelepon sizeseperti itu tidak berhasil untuk saya. Oh well, saya ingat trik yang saya gunakan dalam jawaban sebelumnya yang lebih pendek
Value Ink
2

Python 3 2, 79 74 69 65 68 67 byte

Dennis terima kasih!

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

peningkatan jumlah byte dari metode output buruk

Lemon dirusak
sumber
1
Bukankah seharusnya itu len(x)bukan fdan kemudian menyimpan byte dengan menugaskannya ke variabel?
Karl Napf
Saya kira tidak .. apa maksudmu. Juga, saya akan mengalahkan Anda dengan python 2, tetapi beberapa hal bodoh itu terjadi sekarang.
Destructible Lemon
Anda tampaknya telah beralih ke Python 2. Juga, per konsensus tentang meta , menggunakan backspace untuk menimpa bagian dari output hanya diperbolehkan dalam tantangan seni ASCII.
Dennis
Dalam Python 2, /melakukan argumen integer divisi foe.integer.
Dennis
2

zsh, 28 byte

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

zsh + seq, 21 20 byte

Ini adalah jawaban yang hampir sama dengan Dennis tetapi dalam 20 byte karena zsh

seq -ws '' $#1{,} $1
izabera
sumber
2

Haskell, 51 byte

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

Perl, 40 byte

39 byte kode +1 untuk -n.

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

Pemakaian

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
Dom Hastings
sumber
2

k4, 27

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

Tidak benar-benar bermain golf sama sekali, hanya implementasi langsung dari spec.

                        $ / 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)
Aaron Davies
sumber
2

Javascript - 76

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

atau 71 jika memungkinkan untuk argumen string:

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

Terima kasih kepada @ user81655!

Tidak Disatukan:

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

banyak tempat untuk perbaikan, tapi saya lelah sekarang

eithed
sumber
Bagus! Saya menemukan beberapa perbaikan yang dapat dibuat (76 bytes): n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Bit utama menggunakan forloop dan 1e${b}trik Neil .
user81655
@ user81655 - itu memberi saya Uncaught SyntaxError: Invalid or unexpected token. Belum debugged karena saya baru bangun: D
eithed
Hmmm. Mungkin karakter tersembunyi yang terkadang ditambahkan ke komentar SO. Coba tulis itu.
user81655
2

R, 149 142 138 byte

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

Membiarkan ncharkode memberikan program dengan jumlah byte yang sama daripada menggantinya b, tetapi memiliki huruf acak yang berkeliaran dalam kode membuatnya lebih ... misterius

Tidak Digabungkan:
Masing-masing nchar(strtoi(something))memungkinkan untuk menghitung jumlah angka dalam angka tertentu.

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

The strsplitfungsi output daftar vektor yang mengandung unsur-unsur splitten. Itu sebabnya Anda harus mencapai 1elemen st daftar, dan kemudian ielemen th dari vektor, menulisstrsplit[[1]][i]

Frédéric
sumber
coba gunakan str_pad ()
hedgedandlevered
@hedgedandlevered: well, fungsi ini membutuhkan paket (yaitu tidak dapat dijalankan dengan vanilla R), dan saya tidak ingin menggunakan itu sementara PPCG-ing
Frédéric
1

SQF - 164

Menggunakan format fungsi-sebagai-file:

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

Sebut sebagai INTEGER call NAME_OF_COMPILED_FUNCTION

Suram
sumber
1

PowerShell, 77 byte

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

Menggunakan interpolasi string untuk mempersingkat gips string. Bagian-bagian sebelum titik koma kedua mempersingkat nama-nama hal yang digunakan kembali. Kemudian, setiap bilangan bulat hingga input - dan hanya mereka yang merupakan kelipatan dari panjang input - yang diisi sepanjang string input dan akhirnya bergabung menjadi satu.

Ben N
sumber
1

Sebenarnya, 30 byte

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

Cobalah online!

Saya tidak senang dengan panjang kode ini, tapi saya tidak yakin itu bisa dibuat lebih pendek (jika ada).

Penjelasan:

;╝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
Mego
sumber
0

CJam, 19 byte

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

Cobalah online . Belum ada yang diposting di CJam, jadi ini skrip yang saya gunakan untuk test case.

Penjelasan

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
}/
NinjaBearMonkey
sumber
0

PHP, 83 78 byte

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

Tips lebih dari diterima. Kelola untuk golf sendiri dengan satu byte dengan mengubahnya dari loop for menjadi loop sementara.

Kode ini mengasumsikan bahwa ini sedang dieksekusi dari baris perintah dan $ argv [1] adalah int.

Terimakasih untuk:

@AlexGittemeier Sarannya (lihat komentar) memutari ini dengan 5 byte hingga 78 byte.

Jeroen
sumber
Anda dapat mengubah echo sprintf(...)->printf(...)
Alex Gittemeier
0

Perl 6, 69 59 46 byte

{my \a=.chars;(a,2*a...$_).fmt("%0"~a~"s","")}
bb94
sumber
1
Anda dapat menggunakan fmtdaftar alih-alih map, sprintfdan [~]. 42 byte
Jo King