Machen Sie eine (etwas) selbstreferenzierende Zeichenfolge

27

Sie möchten einen String erstellen, in dem das ( 1-indizierte ) Zeichen am Index nsteht n. Wenn nweniger als 10, dann ist dies einfach: "123456789". Wenn nzum Beispiel 12 ist, wird es unmöglich, da Zahlen größer als 9 (in der Basis 10) mehr als ein Zeichen belegen. Wir können durch Kompromisse die Zeichenfolge in zwei Zeichen Teilteilung: "020406081012". Nun wird der Index des Endes jeder Teilkette n ist n.

Dies kann für jede deinstellige Zahl verallgemeinert werden . Hier ist eine Erklärung für den Teil "0991021" der Zeichenfolge für eine dreistellige Zahl:

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

Wenn Sie es noch nicht herausgefunden haben, müssen Sie ein Programm / eine Funktion schreiben, die eine Zeichenfolge oder eine Ganzzahl verwendet und die selbstreferenzierende Zeichenfolge wie oben angegeben ausgibt. Sie können auch ein Array aus einstelligen Zahlen, Zeichen oder Zeichenfolgen ausgeben.

Die angegebene Ganzzahl ist immer positiv und durch ihre Länge teilbar (z. B. 126 ist durch 3 teilbar; 4928 ist durch 4 teilbar). Ihr Programm sollte theoretisch für eine beliebig große Eingabe funktionieren, Sie können jedoch davon ausgehen, dass es kleiner als die maximale Ganzzahl und / oder Zeichenfolgenlänge Ihrer Sprache ist.

Einige Beobachtungen, wenn Sie sie immer noch nicht erhalten: Die Länge der Ausgabe ist immer die Eingabe selbst, und die Zahlen, die in der Ausgabe erscheinen, sind durch die Anzahl der Stellen in der Eingabe teilbar.

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Testfälle

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

Antworten:

8

Gelee , 12 Bytes

VRUmLDUz0ZFU

E / A erfolgt in Form von Ziffernfeldern. Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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
quelle
7
Schau ma, kein Unicode!
Dennis
8
Trotzdem sieht es aus wie ein verärgerter Fahrer.
Jonathan Allan
12

C 64 Bytes

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

Nimmt eine einzelne Ganzzahl als Eingabe für stdin.

orlp
quelle
9

JavaScript (ES6), 83 Byte

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

Ja, das ist eine verschachtelte Vorlagenzeichenfolge. 79 Bytes in ES7:

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

MATL , 15 bis 14 Bytes

VntG3$:10YA!1e

Probieren Sie es 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
quelle
6

05AB1E , 15 Bytes

Code:

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

Erläuterung:

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.

Das Zusammenführen geschieht folgendermaßen:

Von diesen:

000
 12

Daraus ergibt sich:

012

Verwendet die CP-1252- Codierung. Probieren Sie es online! .

Adnan
quelle
Cool! Wusste nicht, dass das so ñfunktioniert.
Emigna
1
@Emigna Ja, aber es sieht ziemlich lang aus. Ich sollte wahrscheinlich ein Builtin für das Builtin machen: P.
Adnan
Ein eingebautes Polster wäre auch sehr nützlich.
Emigna
6

Python 2, 78 70 68 64 63 Bytes

Basierend auf der Idee von Destructible Watermelon wird es sogar noch kleiner (mit inputist sogar noch besser) (Füllen der Zeichenfolge spart 4 Bytes) (no ()at while):

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

Hier ist der alte 70-Byte-Ansatz (Speichern von 8 Byte durch Verwendung von Anführungszeichen anstelle von strund Ablegen der eckigen Klammern um den Generator dank Dennis):

def f(n):l=len(`n`);print"".join(`x`.zfill(l)for x in range(l,n+l,l))
Karl Napf
quelle
Ich habe Zfill vergessen ... verdammt.
Destructible Lemon
Sie können ​`x`​anstelle von verwenden str(x). Auch das []rund um den Generator braucht man nicht .
Dennis
Du hast mich wieder übervorteilt ... schwere Zeiten erfordern ernsthafte Maßnahmen: Ich muss auf Python 2
Destructible Lemon
verdammt, du hast es wieder getan!
Destructible Lemon
1
Du brauchst die Eltern nicht while(n).
Dennis
5

Python 2, 63 Bytes

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

Teste es auf Ideone .

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

JavaScript (ES6), 66

Rekursiv, Eingabe nals Zeichenfolge (keine Zahl) und Beschränkung der Größe der Ausgabezeichenfolge auf 2 GB (dh über der Zeichenfolgenbeschränkung der meisten JavaScript-Engines)

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

Prüfung

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
quelle
4

R, 66 64 62 Bytes

bearbeiten:

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

erster Golfversuch ...

hedgedandlevered
quelle
2
Hallo und willkommen bei PPCG! Schöner erster Beitrag!
12.
3

2sable , 13 Bytes

Code:

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

Verwendet die CP-1252- Codierung.

Adnan
quelle
warum hast du diesen 05AB1F nicht genannt? : 3
Conor O'Brien
1
@ ConorO'Brien Ich dachte eigentlich darüber nach, aber dann würden die Namen wirklich ähnlich und verwirrend aussehen : p.
Adnan
du meinst15AB1E
ASCII
3

Brachylog , 53 45 42 37 28 Bytes

1B, & Dgr; ybeN: B% 0, N: ef: {, 0: 9 y: & Dgr; m.} acAl: Br -: 0 rjb: Acw \ 
1B, & Dgr; ybeN: B% 0,10 : B ^: N +: ef: {, "0": "9" y:? M.} Acbw \
 Dgr; 1B, Dgr; 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 \

Probieren Sie es online!

Undichte Nonne
quelle
3

Bash, 31 22 Bytes

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

Teste es auf Ideone .

Vielen Dank an @izabera für das Golfen mit 6 Bytes!

Dennis
quelle
3

Ruby, 52 48 + nFlag = 49 Bytes

((l= ~/$/)..$_.to_i).step(l){|j|$><<"%0#{l}d"%j}
Wert Tinte
quelle
Möglicherweise müssen Sie dies nicht tun, chopwenn Sie davon ausgehen, dass die Eingabe ohne nachfolgende Zeilenumbrüche übergeben wird. Ich bin mir nicht sicher, ob das funktionieren würde. Oder wie wäre es anzunehmen, dass es immer einen gibt und zu schreiben l=~-size?
Lynn
@Lynn so zu telefonieren sizefunktioniert bei mir nicht. Na ja, ich erinnere mich an einen Trick, den ich in einer früheren Antwort verwendet hatte und der sowieso kürzer war
Value Ink
2

Python 3 2, 79 74 69 65 68 67 Bytes

Danke Dennis!

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

Erhöhung der Byteanzahl aufgrund einer fehlerhaften Ausgabemethode

Zerstörbare Zitrone
quelle
1
Sollte es nicht len(x)stattdessen fBytes speichern, indem es einer Variablen zugewiesen wird?
Karl Napf
Ich glaube nicht ... was meinst du damit? Außerdem hätte ich dich mit Python 2 übervorteilt, aber ein paar blöde Sachen, die gerade passieren.
Destructible Lemon
Sie scheinen zu Python 2 gewechselt zu sein. Außerdem ist es laut Konsens in Bezug auf Meta nur in ASCII-Grafikherausforderungen zulässig, die Rücktaste zum Überschreiben eines Teils der Ausgabe zu verwenden.
Dennis
In Python 2 /Führt die Ganzzahldivision foe.integer-Argumente aus.
Dennis
2

zsh, 28 Bytes

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

zsh + seq, 21 20 Bytes

Dies ist so ziemlich die gleiche Antwort wie Dennis, aber in 20 Bytes, weil zsh

seq -ws '' $#1{,} $1
Izabera
quelle
2

Haskell, 51 Bytes

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

Perl, 40 Bytes

39 Byte Code + 1 für -n.

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

Verwendung

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
quelle
2

k4, 27

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

Überhaupt nicht wirklich golfen, nur eine unkomplizierte Umsetzung der Spezifikation.

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

Javascript - 76

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

oder 71, wenn Zeichenfolgenargumente zulässig sind:

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

Vielen Dank an @ user81655!

Ungolfed:

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

Viel Raum für Verbesserungen, aber ich bin gerade müde

eithed
quelle
Nett! Ich fand ein paar Verbesserungen , die (76 Byte) vorgenommen werden könnten: n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Die Hauptbits verwenden eine forSchleife und Neils 1e${b}Trick.
User81655
@ user81655 - es gibt mir Uncaught SyntaxError: Invalid or unexpected token. Noch nicht ausgetestet , wie ich gerade bin wach: D
eithed
Hmmm. Es können versteckte Zeichen sein, die manchmal zu SO-Kommentaren hinzugefügt werden. Versuchen Sie es zu schreiben.
User81655
2

R 149 142 138 Bytes

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

Verlassen nchar des Codes ergibt ein Programm mit der gleichen Anzahl von Bytes wie das Ersetzen durch b, aber zufällige Buchstaben im Code machen es ... mysteriöser

Ungolfed:
Jedernchar(strtoi(something)) erlaubt die Berechnung der Anzahl der Ziffern in einer bestimmten Anzahl.

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

Die strsplitFunktion gibt eine Liste von Vektoren aus, die die aufgeteilten Elemente enthalten. Deshalb müssen Sie zuerst das 1st-Element der Liste und dann das ith-Element des Vektors erreichen und schreibenstrsplit[[1]][i]

Frédéric
quelle
versuchen Sie es mit str_pad ()
hedgedandlevered
@hedgedandlevered: Nun, für diese Funktion ist ein Paket erforderlich (dh sie kann nicht mit Vanille R ausgeführt werden), und ich möchte es nicht verwenden, während PPCG-ing
Frédéric
1

SQF - 164

Verwenden des Formats "Funktion als Datei":

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

Anrufen als INTEGER call NAME_OF_COMPILED_FUNCTION

Οurous
quelle
1

PowerShell, 77 Byte

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

Verwendet String-Interpolation, um String-Casts zu verkürzen. Die Teile vor dem zweiten Semikolon verkürzen die Namen wiederverwendeter Objekte. Dann wird jede ganze Zahl bis zur Eingabe - und nur die, die ein Vielfaches der Länge der Eingabe sind - mit der Länge der Eingabezeichenfolge aufgefüllt und schließlich zu einer zusammengefügt.

Ben N
quelle
1

Eigentlich 30 Bytes

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

Probieren Sie es online!

Ich bin mit der Länge dieses Codes nicht zufrieden, aber ich bin nicht sicher, ob er (wenn überhaupt) viel kürzer gemacht werden kann.

Erläuterung:

;╝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
quelle
0

CJam, 19 Bytes

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

Probieren Sie es online aus . Bisher hat noch niemand in CJam gepostet. Dies ist also das Skript, das ich für die Testfälle verwendet habe.

Erläuterung

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
quelle
0

PHP, 83-78 Bytes

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

Trinkgelder sind mehr als willkommen. Verwalten Sie es selbst, indem Sie es von einer for-Schleife in eine while-Schleife ändern.

In diesem Code wird davon ausgegangen, dass dies über die Befehlszeile ausgeführt wird und dass $ argv [1] das int ist.

Dank an:

@AlexGittemeier Sein Vorschlag (siehe Kommentare) golfte dies um 5 Bytes auf 78 Bytes.

Jeroen
quelle
Sie können ändern echo sprintf(...)->printf(...)
Alex Gittemeier
0

Perl 6, 69 59 46 Bytes

{my \a=.chars;(a,2*a...$_).fmt("%0"~a~"s","")}
bb94
quelle
1
Sie können fmtin der Liste anstelle von map, sprintfund verwenden [~]. 42 Bytes
Jo King