Hacer una cadena (algo) autorreferencial


27

¿Quieres hacer una cadena donde el ( 1-indexada caracteres) en el índice nes n. Cuando nes menor de 10, esto es fácil: "123456789". Cuando nes 12, por ejemplo, se vuelve imposible, ya que los números mayores que 9 (en la base 10) ocupan más de un carácter. Podemos poner en peligro al dividir la cadena en subcadenas de dos caracteres: "020406081012". Ahora el índice del final de cada subcadena n es n.

Esto se puede generalizar para cualquier dnúmero de dígitos. Aquí hay una explicación para la parte "0991021" de la cadena para un número de tres dígitos:

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

Si aún no lo ha descubierto, debe escribir un programa / función que tome una cadena o un entero y genere su cadena autorreferencial como se especificó anteriormente. También puede generar una matriz de números de un solo dígito, caracteres o cadenas de un solo carácter.

El entero dado siempre será positivo y divisible por su longitud (por ejemplo, 126 es divisible por 3; 4928 es divisible por 4). Teóricamente, su programa debería funcionar para una entrada arbitrariamente grande, pero puede suponer que es más pequeña que el entero máximo y / o la longitud de cadena de su idioma.

Algunas observaciones si aún no lo entiende: la longitud de la salida siempre será la entrada en sí, y los números que aparecen en la salida serán divisibles por el número de dígitos en la entrada.

Este es el , por lo que la respuesta más corta en bytes gana.

Casos de prueba

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

Respuestas:


8

Jalea , 12 bytes

VRUmLDUz0ZFU

La E / S está en forma de matrices de dígitos. Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

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.

77
¡Mira, ma, no Unicode!
Dennis

8
Sin embargo, parece un conductor enojado.
Jonathan Allan

12

C, 64 bytes

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

Toma un solo entero como entrada en stdin.


9

JavaScript (ES6), 83 bytes

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

Sí, esa es una cadena de plantilla anidada. 79 bytes en ES7:

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

7

MATL , 15 14 bytes

VntG3$:10YA!1e

Pruébalo en línea!

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

Código:

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

Explicación:

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 fusión se realiza así:

A partir de estos:

000
 12

Resulta en esto:

012

Utiliza la codificación CP-1252 . Pruébalo en línea! .


¡Guay! No sabía que ñfuncionaba así.
Emigna

1
@Emigna Sí, pero parece un poco largo. Probablemente debería hacer una construcción para esa construcción: P.
Adnan

Una construcción para relleno también sería realmente útil.
Emigna

6

Python 2, 78 70 68 64 63 bytes

En realidad, basarse en la idea de Sandía Destructible lo hace aún más pequeño (usar inputes aún mejor) (llenar la cadena hacia atrás ahorra 4 bytes) (no ()en while):

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

Aquí está el viejo enfoque de 70 bytes (Ahorro de 8 bytes usando comillas inversas en lugar de stry soltando los corchetes alrededor del generador gracias a Dennis):

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

Me olvidé de zfill ... maldición.
Destructible Lemon

Puedes usar en ​`x`​lugar de str(x). Además, no necesita []alrededor del generador.
Dennis

Me superaste otra vez ... los tiempos serios requieren medidas serias: voy a tener que cambiarme a python 2
Destructible Lemon el

¡Maldita sea, lo hiciste de nuevo!
Destructible Lemon

1
No necesitas a los padres while(n).
Dennis


4

JavaScript (ES6), 66

Recursivo, ingrese ncomo una cadena (no un número) y limite el tamaño de la cadena de salida a 2 GB (que está por encima del límite de la cadena de la mayoría de los motores javascript)

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

Prueba

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

editar:

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

primer intento de golf ...


2
Hola y bienvenidos a PPCG! Bonito primer post!
Rɪᴋᴇʀ

3

2sable , 13 bytes

Código:

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

Utiliza la codificación CP-1252 .


¿Por qué no llamaste a este 05AB1F? : 3
Conor O'Brien

1
@ ConorO'Brien Realmente pensé en eso, pero luego los nombres se verían muy similares y confusos: p.
Adnan

quieres decir15AB1E
solo ASCII

3

Brachylog , 53 45 42 37 28 bytes

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 \

Pruébalo en línea!



3

Ruby, 52 48 + nbandera = 49 bytes

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

¿Tal vez no sea necesario chopsi asume que la entrada se pasa sin una nueva línea final? No estoy seguro de si eso funcionaría. ¿O qué tal asumir que siempre hay uno y escribir l=~-size?
Lynn el

@Lynn llamando sizeasí no funciona para mí. Oh, bueno, recordé un truco que había usado en una respuesta anterior que de todos modos es más corto
Value Ink el

2

Python 3 2, 79 74 69 65 68 67 bytes

Gracias Dennis!

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

aumento del recuento de bytes del método de salida incorrecto


1
¿No debería ser en len(x)lugar de fy luego guardar bytes asignándolos a una variable?
Karl Napf

No lo creo ... ¿qué quieres decir? Además, te hubiera superado con Python 2, pero algunas cosas estúpidas están sucediendo en este momento ._.
Destructible Lemon

Parece que ha cambiado a Python 2. Además, por consenso sobre meta , el uso de retroceso para sobrescribir parte de la salida solo está permitido en desafíos de arte ASCII.
Dennis

En Python 2, /realiza la división de enteros foe.integer argumentos.
Dennis

2

zsh, 28 bytes

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

zsh + seq, 21 20 bytes

Esta es la misma respuesta que Dennis pero en 20 bytes porque 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

Código de 39 bytes + 1 para -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}

Realmente no se juega golf, solo una implementación directa de la especificación.

                        $ / 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 si permite argumentos de cadena:

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

Gracias a @ user81655!

Sin golf:

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

mucho lugar para mejorar, pero ahora estoy cansado


¡Agradable! He encontrado algunas mejoras que se podrían hacer (76 bytes): n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Los bits principales están usando un forbucle y el 1e${b}truco de Neil .
user81655

@ user81655: me da Uncaught SyntaxError: Invalid or unexpected token. Todavía no he depurado ya que estoy despierto: D
eit

Hmmm Pueden ser caracteres ocultos que a veces se agregan a los comentarios SO. Intenta escribirlo.
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="")

Dejarlo ncharen el código le da a un programa el mismo número de bytes que reemplazarlo b, pero tener letras aleatorias deambulando por el código lo hace más ... misterioso

Sin golf:
cada uno nchar(strtoi(something))permite calcular el número de números en un número dado.

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 strsplitfunción genera una lista de vectores que contienen los elementos divididos. Es por eso que tienes que llegar al 1elemento st de la lista, y luego al ielemento th del vector, escribiendostrsplit[[1]][i]


intente usar str_pad ()
hedgedandlevered

@hedgedandlevered: bueno, esta función necesita un paquete (es decir, no se puede ejecutar con Vanilla R), y no quiero usarlo mientras PPCG-ing
Frédéric

1

SQF - 164

Usando el formato de función como archivo:

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

Llamar como INTEGER call NAME_OF_COMPILED_FUNCTION


1

PowerShell, 77 bytes

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

Utiliza la interpolación de cadenas para acortar la conversión de cadenas. Las partes antes del segundo punto y coma acortan los nombres de las cosas reutilizadas. Luego, cada número entero hasta la entrada, y solo aquellos que son múltiplos de la longitud de la entrada, se rellenan para ser tan largos como la cadena de entrada y finalmente se unen en uno.


1

En realidad, 30 bytes

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

Pruébalo en línea!

No estoy satisfecho con la longitud de este código, pero no estoy seguro de que se pueda acortar mucho (si es que lo hay).

Explicación:

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

Pruébalo en línea . Nadie ha publicado en CJam todavía, así que este es el script que utilicé para los casos de prueba.

Explicación

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

Las propinas son más que bienvenidas. Me las arreglé para jugar al golf por un byte cambiándolo de un ciclo for a un ciclo while.

Este código supone que esto se está ejecutando desde la línea de comando y que $ argv [1] es el int.

Gracias a:

@AlexGittemeier Su sugerencia (ver comentarios) fue de 5 bytes a 78 bytes.


Puede cambiar echo sprintf(...)->printf(...)
Alex Gittemeier

0

Perl 6, 69 59 46 bytes

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

1
Puede usar fmten la lista en lugar de map, sprintfy [~]. 42 bytes
Jo King
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.