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

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.

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.


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``

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

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


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

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 .


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>


4

R, 66 64 62 Bytes

bearbeiten:

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

erster Golfversuch ...


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.


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!


3

Bash, 31 22 Bytes

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

Teste es auf Ideone .

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


3

Ruby, 52 48 + nFlag = 49 Bytes

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

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


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

2

Haskell, 51 Bytes

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

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

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)

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


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]


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


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.


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

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

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.


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","")}

1
Sie können fmtin der Liste anstelle von map, sprintfund verwenden [~]. 42 Bytes
Jo King
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.