制作一个(有点)自引用字符串


27

您想创建一个字符串,其中index 处的(1-indexed)字符nn。当n小于10,这是很容易:"123456789"n例如,当值为12时,它变得不可能,因为大于9的数字(以10为底)占用一个以上的字符。我们可以通过将字符串转换成两个字符子妥协:"020406081012"。现在,每个子字符串 结尾的索引nn

可以将其概括为任何d数字。这是三位数字字符串的“ 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

Answers:


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
看,没有Unicode!
丹尼斯

8
然而,看起来有些生气的司机。
乔纳森·艾伦

12

C,64字节

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

将单个整数作为stdin的输入。


9

JavaScript(ES6),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

MATL15 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编码。在线尝试!


凉!不知道那样ñ工作。
Emigna '16

1
@Emigna是的,但是看起来有点长。我可能应该为内置的:P创建一个内置的。
阿德南

内置的填充也将非常有用。
Emigna'8

6

Python 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了Dennis,通过使用反引号而不是在方括号中放置方括号来节省8个字节):

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

我忘了zfill ...该死。
破坏的柠檬

您可以使用​`x`​代替str(x)。另外,您不需要[]生成器周围。
丹尼斯

您再次使我失望...严重的时刻要求采取严肃的措施:我将不得不更改为python 2
Destructible Lemon

该死的,你又做了一次!
破坏的柠檬

1
您不需要输入while(n)
丹尼斯


4

JavaScript(ES6),66

递归,n以字符串(不是数字)形式输入,并将输出字符串大小限制为2GB(超出大多数JavaScript引擎的字符串限制)

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

R,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
Conor O'Brien

1
@ ConorO'Brien我实际上想到了,但是然后它们的名称看起来真的很相似并且令人困惑:p。
阿德南

你的意思是15AB1E
仅ASCII码

3

Brachylog53 45 42 37 28字节

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 \

在线尝试!



3

Ruby,52个48 + n标志= 49个字节

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

chop如果您假设输入是在没有尾随换行符的情况下传递的,也许您不需要?我不确定是否行得通。或者假设总是存在一个,然后写作l=~-size呢?
林恩

@Lynn这样的电话size对我不起作用。哦,对了,我还记得我在一个较早的答案中使用过的技巧,无论如何,该技巧仍然比较短
Value Ink

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,然后通过将其分配给变量来保存字节吗?
Karl Napf

我不这么认为..你的意思是。另外,我本来会用python 2打败您的,但是它现在却发生了一些愚蠢的事情._。
破坏的柠檬

您似乎已切换到Python2。此外,根据对meta的共识,仅在ASCII艺术挑战中才允许使用退格键覆盖部分输出。
丹尼斯

在Python 2中,/执行整数除法foe.integer参数。
丹尼斯

2

zsh,28个字节

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

zsh + seq,21个 20字节

答案与Dennis大致相同,但答案是20字节,因为zsh

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

2

Haskell,51个字节

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

2

Perl,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

Javascript-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!

取消高尔夫:

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 '16

@ user81655-它给了我Uncaught SyntaxError: Invalid or unexpected token。因为我
刚醒,

嗯 它可能是隐藏的字符,有时会添加到SO注释中。尝试写出来。
user81655

2

R,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,但是在代码中四处游荡的随机字母会使程序更加... 神秘

Ungolfed:
每个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函数输出包含分裂元素的向量列表。这就是为什么您必须到达1列表的st元素,然后i到达vector 的th元素的原因:strsplit[[1]][i]


尝试使用str_pad()
树篱danververed

@hedgedandlevered:好,这个功能需要一个包(即它不能运行香草 R),我不希望使用这种同时PPCG-ING
弗雷德里克

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

PowerShell,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[}/

在线尝试。尚无人在CJam中发布过文章,所以这是我用于测试用例的脚本。

说明

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;}

提示更多,然后欢迎。通过将它从for循环更改为while循环,以一个字节设法自己打高尔夫球。

这段代码假定这是从命令行执行的,并且$ argv [1]是int。

谢谢:

@AlexGittemeier他的建议(参见注释)使此内容增加了5个字节,达到了78个字节。


您可以更改echo sprintf(...)->printf(...)
Alex Gittemeier

0

Perl 6,69 59 46字节

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

1
您可以使用fmt该列表,而不是对mapsprintf[~]42个字节
Jo King
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.