Crea una stringa (in qualche modo) autoreferenziale


27

Si vuole fare in una stringa in cui la ( 1-indicizzato carattere) in corrispondenza dell'indice nè n. Quando nè inferiore a 10, questo è facile: "123456789". Quando nè 12, ad esempio, diventa impossibile, poiché i numeri maggiori di 9 (nella base 10) occupano più di un personaggio. Siamo in grado di compromettere dividendo la stringa in sottostringhe due caratteri: "020406081012". Ora l'indice della fine di ogni sottostringa n è n.

Questo può essere generalizzato per qualsiasi dnumero di cifra. Ecco una spiegazione per la parte "0991021" della stringa per un numero di tre cifre:

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

Se non l'hai ancora capito, devi scrivere un programma / funzione che accetta una stringa o un numero intero e genera la sua stringa autoreferenziale come specificato sopra. È inoltre possibile generare una matrice di numeri a una sola cifra, caratteri o stringhe di un carattere.

L'intero dato sarà sempre positivo e divisibile per la sua lunghezza (ad esempio 126 è divisibile per 3; 4928 è divisibile per 4). Il tuo programma dovrebbe teoricamente funzionare per un input arbitrariamente grande, ma puoi presumere che sia più piccolo dell'intero massimo e / o della lunghezza della stringa della tua lingua.

Alcune osservazioni se ancora non lo capisci: la lunghezza dell'output sarà sempre l'input stesso e i numeri che compaiono nell'output saranno divisibili per il numero di cifre nell'input.

Questo è , quindi vince la risposta più breve in byte.

Casi test

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

Risposte:


8

Gelatina , 12 byte

VRUmLDUz0ZFU

L'I / O è in forma di array di cifre. Provalo online! o verifica tutti i casi di test .

Come funziona

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
Guarda, no, nessun Unicode!
Dennis,

8
Eppure sembra un guidatore arrabbiato.
Jonathan Allan,

12

C, 64 byte

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

Accetta un singolo numero intero come input su stdin.


9

JavaScript (ES6), 83 byte

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

Sì, questa è una stringa di modello nidificata. 79 byte in ES7:

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

7

MATL , 15 14 byte

VntG3$:10YA!1e

Provalo 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 byte

Codice:

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

Spiegazione:

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.

La fusione avviene in questo modo:

Da questi:

000
 12

Ne risulta:

012

Utilizza la codifica CP-1252 . Provalo online! .


Freddo! Non sapevo che ñfunzionasse così.
Emigna,

1
@Emigna Sì, ma sembra piuttosto lungo. Probabilmente dovrei creare un builtin per quel builtin: P.
Adnan,

Anche un built-in per l'imbottitura sarebbe davvero utile.
Emigna,

6

Python 2, 78 70 68 64 63 byte

Basandosi effettivamente sull'idea dell'anguria distruttibile, la rende ancora più piccola (l'utilizzo inputè ancora migliore) (riempire la stringa all'indietro consente di risparmiare 4 byte) (no ()a while):

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

Ecco il vecchio approccio a 70 byte (Salvataggio di 8 byte usando backquotes invece di stre rilasciando le parentesi quadre attorno al generatore grazie a Dennis):

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

Mi sono dimenticato di Zfill ... dannazione.
Limone distruttibile

Puoi usare ​`x`​invece di str(x). Inoltre, non è necessario il []intorno al generatore.
Dennis,

Mi hai sconfitto di nuovo ... i tempi sierosi richiedono misure serie: dovrò passare a Python 2
Limone distruttibile

dannazione l'hai fatto di nuovo!
Limone distruttibile

1
Non hai bisogno dei genitori while(n).
Dennis,


4

JavaScript (ES6), 66

Ricorsivo, input ncome stringa (non un numero) e limitazione della dimensione della stringa di output a 2 GB (che è al di sopra del limite di stringa della maggior parte dei motori javascript)

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

Test

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

modificare:

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

primo tentativo di golf ...


2
Ciao e benvenuto in PPCG! Bel primo post!
Rɪᴋᴇʀ

3

2 file , 13 byte

Codice:

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

Utilizza la codifica CP-1252 .


perché non hai chiamato questo 05AB1F? : 3
Conor O'Brien,

1
@ ConorO'Brien In realtà ci ho pensato, ma i nomi sarebbero stati davvero simili e confusi: p.
Adnan,

vuoi dire15AB1E
solo ASCII il

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 \

Provalo online!



3

Rubino, 52 48 + nbandiera = 49 byte

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

Forse non è necessario chopse si presume che l'input sia passato senza una nuova riga finale? Non sono sicuro che funzionerebbe. O che ne pensi se ce n'è sempre uno e scrivere l=~-size?
Lynn,

@Lynn chiama sizecosì non funziona per me. Oh bene, mi sono ricordato di un trucco che avevo usato in una risposta precedente che era comunque più breve
Value Ink

2

Python 3 2, 79 74 69 65 68 67 byte

Grazie Dennis!

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

aumento del conteggio dei byte dal metodo di output errato


1
Non dovrebbe essere len(x)invece di fe quindi salvare byte assegnandolo a una variabile?
Karl Napf,

Non penso proprio .. cosa intendi. Inoltre, ti avrei superato con Python 2, ma alcune cose stupide stanno accadendo proprio ora ._.
Limone distruttibile

Sembra che tu sia passato a Python 2. Inoltre, per consenso su meta , l'uso del backspace per sovrascrivere parte dell'output è consentito solo nelle sfide dell'arte ASCII.
Dennis,

In Python 2, /esegue gli argomenti foe.integer della divisione di numeri interi.
Dennis,

2

zsh, 28 byte

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

zsh + seq, 21 20 byte

Questa è praticamente la stessa risposta di Dennis ma in 20 byte perché 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

39 byte codice + 1 per -n.

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

uso

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}

Non ho mai giocato a golf, ma solo un'implementazione diretta delle specifiche.

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

o 71 se si accettano argomenti stringa:

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

Grazie a @ 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;
}

molto da migliorare, ma sono stanco in questo momento


Bello! Ho trovato alcuni miglioramenti che potrebbero essere fatte (76 byte): n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). I bit principali stanno usando un forloop e il 1e${b}trucco di Neil .
user81655

@ user81655 - mi dà Uncaught SyntaxError: Invalid or unexpected token. Non ho ancora eseguito il debug poiché sono appena sveglio: D
abbandonato il

Hmmm. Potrebbero essere caratteri nascosti che a volte vengono aggiunti ai commenti SO. Prova a scriverlo.
user81655

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

Lasciare ncharil codice dà un programma con lo stesso numero di byte rispetto a sostituirlo con b, ma avere lettere casuali che vagano nel codice lo rende più ... misterioso

Ungolfed:
Ciascuno nchar(strtoi(something))consente di calcolare il numero di numeri in un dato numero.

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

La strsplitfunzione genera un elenco di vettori contenenti gli elementi divisi. Ecco perché devi raggiungere l' 1elemento st dell'elenco, quindi l' ielemento th del vettore, scrivendostrsplit[[1]][i]


prova a usare str_pad ()
hedgedandlevered il

@hedgedandlevered: beh, questa funzione ha bisogno di un pacchetto (cioè non può essere eseguita con Vanilla R), e non voglio usarla mentre PPCG-ing
Frédéric

1

MQ - 164

Utilizzando il formato funzione-come-un-file:

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

Chiama come INTEGER call NAME_OF_COMPILED_FUNCTION


1

PowerShell, 77 byte

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

Utilizza l'interpolazione di stringhe per abbreviare i cast di stringhe. Le parti prima del secondo punto e virgola accorciano i nomi delle cose riutilizzate. Quindi, tutti i numeri interi fino all'input - e solo quelli multipli della lunghezza dell'input - vengono riempiti per essere lunghi quanto la stringa di input e infine uniti in uno.


1

In realtà, 30 byte

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

Provalo online!

Non sono contento della lunghezza di questo codice, ma non sono sicuro che possa essere reso molto più breve (se non del tutto).

Spiegazione:

;╝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[}/

Provalo online . Nessuno ha ancora pubblicato in CJam, quindi questo è lo script che ho usato per i casi di test.

Spiegazione

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

I consigli sono più che benvenuti. Gestisci il golf da solo di un byte modificandolo da un ciclo for a un ciclo while.

Questo codice presuppone che ciò venga eseguito dalla riga di comando e che $ argv [1] sia l'int.

Grazie a:

@AlexGittemeier Il suo suggerimento (vedi commenti) ha risolto questo problema da 5 byte a 78 byte.


Puoi cambiare echo sprintf(...)->printf(...)
Alex Gittemeier il

0

Perl 6, 69 59 46 byte

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

1
È possibile utilizzare fmtnell'elenco anziché map, sprintfe [~]. 42 byte
Jo King
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.