Tạo một chuỗi (phần nào) tự tham chiếu


27

Bạn muốn thực hiện một chuỗi nơi ( 1-lập chỉ mục ) nhân vật tại index nn. Khi nnhỏ hơn 10, điều này thật dễ dàng : "123456789". nChẳng hạn, khi 12 tuổi, điều đó trở nên bất khả thi, vì các số lớn hơn 9 (trong cơ sở 10) chiếm nhiều hơn một ký tự. Chúng ta có thể thỏa hiệp bằng cách chia chuỗi thành chuỗi hai ký tự : "020406081012". Bây giờ chỉ số kết thúc của mỗi chuỗi con nn.

Điều này có thể được khái quát cho bất kỳ dsố-chữ số. Đây là lời giải thích cho phần "0991021" của chuỗi cho số có ba chữ số:

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

Nếu bạn chưa tìm ra nó, bạn phải viết một chương trình / hàm lấy một chuỗi hoặc số nguyên và xuất chuỗi tự tham chiếu của nó như được chỉ định ở trên. Bạn cũng có thể xuất một mảng các số có một chữ số, ký tự hoặc chuỗi ký tự đơn.

Số nguyên đã cho sẽ luôn dương và chia hết cho độ dài của nó (ví dụ: 126 chia hết cho 3; 4928 chia hết cho 4). Về mặt lý thuyết, chương trình của bạn sẽ hoạt động với đầu vào lớn tùy ý, nhưng bạn có thể cho rằng nó nhỏ hơn số nguyên tối đa và / hoặc độ dài chuỗi của ngôn ngữ của bạn.

Một số quan sát nếu bạn vẫn không nhận được: Độ dài của đầu ra sẽ luôn là đầu vào và các số xuất hiện trong đầu ra sẽ chia hết cho số chữ số trong đầu vào.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.

Các trường hợp thử nghiệm

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

Câu trả lời:


8

Thạch , 12 byte

VRUmLDUz0ZFU

I / O ở dạng mảng số. Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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
Nhìn này, không có Unicode!
Dennis

8
Tuy nhiên, nó trông giống như một số tài xế tức giận.
Jonathan Allan

12

C, 64 byte

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

Lấy một số nguyên duy nhất làm đầu vào trên stdin.


9

JavaScript (ES6), 83 byte

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

Vâng, đó là một chuỗi mẫu lồng nhau. 79 byte trong ES7:

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

7

MATL , 15 14 byte

VntG3$:10YA!1e

Hãy thử trực tuyến!

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 byte

Mã số:

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

Giải trình:

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.

Việc sáp nhập được thực hiện như thế này:

Từ đó:

000
 12

Kết quả là:

012

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Mát mẻ! Không biết rằng ñđã làm việc như thế.
Emigna

1
@Emigna Vâng, nhưng có vẻ hơi dài. Tôi có lẽ nên tạo một nội dung cho nội dung đó: P.
Ad Nam

Một nội trang cho phần đệm cũng thực sự hữu ích.
Emigna

6

Python 2, 78 70 68 64 63 byte

Trên thực tế, dựa trên ý tưởng của dưa hấu Dest phá hủy làm cho nó thậm chí còn nhỏ hơn (sử dụng inputthậm chí còn tốt hơn) (điền vào chuỗi ngược lại tiết kiệm 4 byte) (không ()tại while):

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

Đây là cách tiếp cận 70 byte cũ (Tiết kiệm 8 byte bằng cách sử dụng backquote thay vì strvà bỏ dấu ngoặc vuông xung quanh trình tạo nhờ Dennis):

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

Tôi quên mất zfill ... chết tiệt.
Lemon phá hủy

Bạn có thể sử dụng ​`x`​thay vì str(x). Ngoài ra, bạn không cần []xung quanh máy phát điện.
Dennis

Bạn đã vượt qua tôi một lần nữa ... những lần nghiêm túc kêu gọi các biện pháp nghiêm túc: Tôi sẽ phải đổi thành trăn 2
Lemon phá hủy

chết tiệt, bạn đã làm điều đó một lần nữa!
Lemon phá hủy

1
Bạn không cần parens trong 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))

Kiểm tra nó trên Ideone .


3
Chuỗi định dạng Đạt ° _ °
Karl Napf

4

JavaScript (ES6), 66

Đệ quy, nhập ndưới dạng chuỗi (không phải số) và giới hạn kích thước chuỗi đầu ra ở mức 2GB (vượt quá giới hạn chuỗi của hầu hết các công cụ javascript)

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

Kiểm tra

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 byte

chỉnh sửa:

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

nỗ lực chơi gôn đầu tiên ...


2
Xin chào, và chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

3

2sable , 13 byte

Mã số:

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

Sử dụng mã hóa CP-1252 .


Tại sao bạn không đặt tên cho 05AB1F này? : 3
Conor O'Brien

1
@ ConorO'Brien Tôi thực sự đã nghĩ về điều đó, nhưng sau đó những cái tên sẽ trông rất giống nhau và khó hiểu: p.
Ad Nam

ý bạn là15AB1E
ASCII-chỉ

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 \

Hãy thử trực tuyến!


3

Bash, 31 22 byte

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

Kiểm tra nó trên Ideone .

Cảm ơn @izabera vì đã chơi golf 6 byte!


3

Ruby, 52 48 + ncờ = 49 byte

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

Có lẽ bạn không cần chopnếu bạn cho rằng đầu vào được thông qua mà không có dòng mới? Tôi không chắc điều đó có hiệu quả không. Hoặc làm thế nào về giả định luôn luôn có một, và viết l=~-size?
Lynn

@Lynn gọi sizenhư thế không làm việc cho tôi. Ồ, tôi đã nhớ một mẹo mà tôi đã sử dụng trong một câu trả lời trước đó là dù sao ngắn hơn
Value Ink

2

Python 3 2, 79 74 69 65 68 67 byte

Cảm ơn Dennis!

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

số byte tăng từ phương thức đầu ra xấu


1
Không nên len(x)thay thế fvà sau đó lưu byte bằng cách gán nó cho một biến?
Karl Napf

Tôi không nghĩ vậy .. ý bạn là gì. Ngoài ra, tôi sẽ vượt xa bạn với python 2, nhưng một số thứ ngu ngốc nó đang xảy ra ngay bây giờ ._.
Lemon phá hủy

Bạn dường như đã chuyển sang Python 2. Ngoài ra, theo sự đồng thuận về meta , sử dụng backspace để ghi đè lên một phần đầu ra chỉ được phép trong các thách thức nghệ thuật ASCII.
Dennis

Trong Python 2, /thực hiện các đối số foe.integer chia số nguyên.
Dennis

2

zsh, 28 byte

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

zsh + seq, 21 20 byte

Đây là câu trả lời khá giống với Dennis nhưng trong 20 byte vì zsh

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

2

Haskell, 51 byte

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

2

Perl, 40 byte

Mã 39 byte + 1 cho -n.

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

Sử dụng

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}

Không thực sự chơi golf ở tất cả, chỉ là một thực hiện thẳng của thông số kỹ thuật.

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

hoặc 71 nếu cho phép đối số chuỗi:

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

Cảm ơn @ user81655!

Ung dung:

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

nhiều nơi để cải thiện, nhưng tôi đang mệt mỏi


Tốt đẹp! Tôi tìm thấy một vài cải tiến có thể được thực hiện (76 byte) : n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Các bit chính đang sử dụng một forvòng lặp và 1e${b}thủ thuật của Neil .
user81655

@ user81655 - nó mang lại cho tôi Uncaught SyntaxError: Invalid or unexpected token. Chưa được gỡ lỗi vì tôi mới thức dậy: D
diễn ra vào

Hừm. Nó có thể là các ký tự ẩn đôi khi được thêm vào bình luận SO. Hãy thử viết nó ra.
dùng81655

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

Việc để lại ncharmã cho một chương trình có cùng số byte hơn là thay thế nó b, nhưng việc có các chữ cái ngẫu nhiên đi lang thang trong mã khiến nó trở nên ... bí ẩn hơn

Ungolfed:
Mỗi nchar(strtoi(something))giấy phép để tính số lượng chữ số trong một số đã cho.

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

Các strsplitchức năng kết quả đầu ra một danh sách các vectơ chứa các yếu tố splitten. Đó là lý do tại sao bạn phải tiếp cận 1phần tử thứ của danh sách, và sau đó là iphần tử thứ của vectơ, viếtstrsplit[[1]][i]


hãy thử sử dụng str_pad ()
hedgedandlevered

@hedgedandlevered: tốt, chức năng này cần một gói (nghĩa là không thể chạy với vanilla R) và tôi không muốn sử dụng như vậy trong khi PPCG-ing
Frédéric

1

SQF - 164

Sử dụng định dạng hàm dưới dạng tệp:

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

Gọi như INTEGER call NAME_OF_COMPILED_FUNCTION


1

PowerShell, 77 byte

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

Sử dụng phép nội suy chuỗi để rút ngắn chuỗi phôi. Các phần trước dấu chấm phẩy thứ hai rút ngắn tên của những thứ được sử dụng lại. Sau đó, mọi số nguyên cho đến đầu vào - và chỉ những số nguyên là bội số của độ dài đầu vào - được đệm dài bằng chuỗi đầu vào và cuối cùng được nối thành một.


1

Trên thực tế, 30 byte

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

Hãy thử trực tuyến!

Tôi không hài lòng với độ dài của mã này, nhưng tôi không chắc rằng nó có thể được rút ngắn hơn nhiều (nếu có).

Giải trình:

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

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

Hãy thử trực tuyến . Chưa có ai đăng ở CJam, vì vậy đây là kịch bản tôi đã sử dụng cho các trường hợp thử nghiệm.

Giải trình

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 byte

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

Lời khuyên được nhiều hơn thì hoan nghênh. Quản lý để tự đánh gôn nó bằng một byte bằng cách thay đổi nó từ vòng lặp for thành vòng lặp while.

Mã này giả định rằng điều này đang được thực thi từ dòng lệnh và $ argv [1] là int.

Nhờ vào:

@AlexGittemeier Gợi ý của anh ấy (xem bình luận) đã đánh dấu điều này bằng 5 byte đến 78 byte.


Bạn có thể thay đổi echo sprintf(...)->printf(...)
Alex Gittemeier

0

Perl 6, 69 59 46 byte

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

1
Bạn có thể sử dụng fmttrong danh sách thay vì map, sprintf[~]. 42 byte
Jo King
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.