(やや)自己参照文字列を作成する


27

あなたは(ここで、文字列を作りたい1-インデックス化されたインデックスの)文字がnありますn。ときにn10未満である、これは簡単です:"123456789"nたとえば、12の場合、9を超える数(10を基数)は複数の文字を使用するため、不可能になります。文字列を2文字の部分文字列に分割することで妥協できます"020406081012"。これで、各部分文字列 の終わりのインデックスnnです。

これは、任意のd数字に一般化できます。3桁の数字の文字列の「0991021」部分の説明は次のとおりです。

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

まだ理解していない場合は、文字列または整数を受け取り、上記のように自己参照文字列を出力するプログラム/関数を作成します。1桁の数字、文字、または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
まあ、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エンコードを使用します。オンラインでお試しください!


クール!それがそのñように働いたことを知りませんでした。
エミグナ

1
@Emignaええ、でも少し長く見えます。私はおそらく、そのビルトイン用のビルトインを作成する必要があります。
アドナン

パディング用のビルトインも非常に便利です。
エミグナ

6

Python 2、78 70 68 64 63バイト

実際、Destructible Watermelonのアイデアに基づいて、Destructible Watermelonをさらに小さくします(使用inputはさらに良い)(文字列を埋めることで4バイト節約できます)(no ()at 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)。また、[]ジェネレーターの周りは必要ありません。
デニス

あなたは再び私を打ち負かしました...深刻な時は深刻な対策を求めます:私はpython 2に変更する必要があります
破壊可能なレモン

あなたは再びそれをやった!
破壊可能なレモン

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
コナーオブライエン

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

バッシュ、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入力が末尾の改行なしで渡されると仮定する必要はないでしょうか?それがうまくいくかどうかはわかりません。または、常に1つあると仮定して書いてみてはl=~-sizeどうですか?
リン

そのようsizeな@Lynnの呼び出しは私には機能しません。まあ、私はとにかく短いです以前の回答に使用していたトリックを思い出し
バリューインク

2

Pythonの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に、変数に割り当ててバイトを節約するべきではありませんか?
カールナップ

私はそうは思いません。また、私はpython 2であなたを追い抜いていたでしょうが、それが今起こっているいくつかの愚かなこと._。
破壊可能なレモン

Python 2に切り替えたようです。また、metaのコンセンサスにより、バックスペースを使用して出力の一部を上書きすることはASCIIアートチャレンジでのみ許可されています。
デニス

Python 2では、/整数除算foe.integer引数を実行します。
デニス

2

zsh、28バイト

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

zsh + seq、21 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

@ user81655-それは私に与えますUncaught SyntaxError: Invalid or unexpected token。まだ起きていないので、まだデバッグしていません:D
16年

うーん。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ベクトルのth要素に到達しなければなりません。strsplit[[1]][i]


str_padを()を使用してみてください
hedgedandlevered

@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')})

文字列の補間を使用して、文字列のキャストを短縮します。2番目のセミコロンの前の部分は、再利用されるものの名​​前を短縮します。次に、入力までのすべての整数(および入力の長さの倍数である整数のみ)が入力文字列と同じ長さになるように埋め込まれ、最終的に1つに結合されます。


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ループに変更することで、1バイトずつ自分でゴルフを管理できます。

このコードは、これがコマンドラインから実行され、$ argv [1]がintであると想定しています。

おかげで:

@AlexGittemeier彼の提案(コメントを参照)は、これを5バイトから78バイトまで増やしました。


変更できますecho sprintf(...)->printf(...)
アレックスギッテマイヤー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.