Diseñemos un mosaico de dígitos

25

Reto

Dado un número entero positivo , repetir cada uno de sus dígitos un número de veces correspondiente a su posición en . En otras palabras, cada dígito debe repetirse veces (para cada , 1-indexado), creando así el nuevo número:Nd1,d2,d3,,dnNdkk1kn

d1d2d2d3d3d3dndndndnn times¯

Luego, escríbalo horizontal y verticalmente y complete los espacios en blanco con copias del dígito que corresponde al índice mayor entre el índice de columna y el índice de fila del espacio en blanco. El resultado final debería verse así:

[re1re2re2re3re3re3re2re2re2re3re3re3re2re2re2re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3re3]

Especificaciones

Puede tomar norte como un entero, una cadena, una lista de dígitos o una lista de caracteres que representan los dígitos. El resultado puede ser una cadena separada por una nueva línea, una lista de cadenas / enteros o una lista de listas de caracteres / dígitos, pero si es posible, incluya una versión impresa bonita. Si la salida es una cadena separada por una nueva línea, también es aceptable:

  • tener espacios en blanco iniciales / finales, siempre que la apariencia visual de la salida no cambie
  • separe las columnas usando una cantidad consistente de espacios o las filas con una cantidad consistente (no cero) de líneas nuevas

Puede tomar entradas y proporcionar salidas a través de cualquier método estándar , mientras toma nota de que estas lagunas están prohibidas de manera predeterminada. Este es el , así que intente completar la tarea en la menor cantidad de bytes que pueda administrar en el idioma que elija.

Casos de prueba

65:

655
555
555

---------------

203:

200333
000333
000333
333333
333333
333333

--------------

233:

233333
333333
333333
333333
333333
333333

---------------

5202:

5220002222
2220002222
2220002222
0000002222
0000002222
0000002222
2222222222
2222222222
2222222222
2222222222

---------------

12345:

122333444455555
222333444455555
222333444455555
333333444455555
333333444455555
333333444455555
444444444455555
444444444455555
444444444455555
444444444455555
555555555555555
555555555555555
555555555555555
555555555555555
555555555555555
Sr. Xcoder
fuente
¿Tenemos el mango dos del mismo dígito uno al lado del otro?
Dom Hastings
@DomHastings Sí, tienes que manejarlos. Se agregó un caso de prueba que ilustra esto.
Sr. Xcoder
Relacionado
Urna de pulpo mágico

Respuestas:

9

JavaScript (ES7), 70 bytes

Toma la entrada como una cadena. Devuelve una cadena con un salto de línea final.

s=>(g=x=>(c=s[(x>y?x:y)**.5-1>>1])?c+g(x+8):x>y?`
`+g(1,y+=8):'')(y=1)

Pruébalo en línea!

¿Cómo?

Método

Construimos la salida carácter por carácter caminando a través de una matriz cuadrada y convirtiendo cada celda en un índice en la cadena de entrada.ix,y

Coordenadas para indexar cadenas

El límite superior del área de dígitos n t h (indexado a 0) a lo largo de cada eje está dado por A000096 :unnth

u0=0,u1=2,u2=5,u3=9,u4=14,u5=20,...

un=n(n+3)2
u0=0,u1=2,u2=5,u3=9,u4=14,u5=20,

Dado un entero , podemos encontrar en qué área n = x+ 1 se encuentra resolviendo:kn=x+1

x²+3x2k=0

Llevando a:

n=

x=1+8k32
n=1+8k32+1=1+8k12

Para cada celda , definimos:(x,y)

vx,y=max(1+8x,1+8y)

Estos valores se convierten en índices i x , y en la cadena de entrada haciendo:vX,yyoX,y

yoX,y=vX,y-12
 v(x,y) |  0  1  2  3  4  5  6  7  8  9        i(x,y) |  0  1  2  3  4  5  6  7  8  9
--------+-------------------------------      --------+-------------------------------
    0   |  1  9 17 25 33 41 49 57 65 73           0   |  0  1  1  2  2  2  3  3  3  3
    1   |  9  9 17 25 33 41 49 57 65 73           1   |  1  1  1  2  2  2  3  3  3  3
    2   | 17 17 17 25 33 41 49 57 65 73           2   |  1  1  1  2  2  2  3  3  3  3
    3   | 25 25 25 25 33 41 49 57 65 73           3   |  2  2  2  2  2  2  3  3  3  3
    4   | 33 33 33 33 33 41 49 57 65 73   -->     4   |  2  2  2  2  2  2  3  3  3  3
    5   | 41 41 41 41 41 41 49 57 65 73           5   |  2  2  2  2  2  2  3  3  3  3
    6   | 49 49 49 49 49 49 49 57 65 73           6   |  3  3  3  3  3  3  3  3  3  3
    7   | 57 57 57 57 57 57 57 57 65 73           7   |  3  3  3  3  3  3  3  3  3  3
    8   | 65 65 65 65 65 65 65 65 65 73           8   |  3  3  3  3  3  3  3  3  3  3
    9   | 73 73 73 73 73 73 73 73 73 73           9   |  3  3  3  3  3  3  3  3  3  3

Condiciones de detención

Sabemos que hemos alcanzado:

  • el límite derecho de la matriz cuando el carácter en no existe y tenemos x > yyoX,yX>y

  • el límite inferior de la matriz cuando el carácter no existe y tenemos Xy

Arnauld
fuente
7

J , 16 15 bytes

-1 byte gracias a FrownyFrog!

{~#\<:@>./~@##\

Pruébalo en línea!

Toma Ncomo una cuerda.

Explicación de la solución inicial:

              #\   finds the length of the successive prefixes of the input (1 2 3...)
            #~     copies each digit as many times (1 2 2 3 3 3...)  
       >./~@       and creates a table of the max of the row/col numbers
  [:<:@            then subtract 1 from each element (for indexing)
{~                 select the corresponding digit from the input

Sesión de prueba con entrada 203:

   #\ '203'
1 2 3

   #~#\ '203'
1 2 2 3 3 3

   >./~@#~#\ '203'
1 2 2 3 3 3
2 2 2 3 3 3
2 2 2 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3
3 3 3 3 3 3

   <:@>./~@#~#\ '203'
0 1 1 2 2 2
1 1 1 2 2 2
1 1 1 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2
2 2 2 2 2 2

   ({~[:<:@>./~@#~#\) '203'
200333
000333
000333
333333
333333
333333
Galen Ivanov
fuente
1
Hah, aparte de la ubicación de la ), su respuesta APL es la misma que la que habría sido mía.
Erik the Outgolfer
Realmente no conozco a J en absoluto, pero [:<:@parece bastante costoso. ¿Podría anteponer algo a la lista en la que está indexando para tener en cuenta la indexación 1 (por ejemplo, anteponer un 0 para mover cada elemento necesario 1 posición hacia la derecha)?
Sr. Xcoder
@ Mr.Xcoder Estaba pensando en eso. Lo intentaré para ver si ahorraría algunos bytes.
Galen Ivanov el
@EriktheOutgolfer {⍵[∘.⌈⍨(/⍨)⍳⍴⍵]} ?
Galen Ivanov el
@GalenIvanov Sí, eso.
Erik the Outgolfer
6

Python 2 , 71 bytes

i=j=0;r=''
for x in input():i+=1;r+=x*i
for c in r:print j*c+r[j:];j+=1

Pruébalo en línea!

Primero genera la primera fila r, luego itera rpara imprimir cada línea.

xnor
fuente
6

R , 59 bytes

function(a){m=outer(x<-rep(g<-seq(a),g),x,pmax);m[]=a[m];m}

Pruébalo en línea!

  • Noté que tomar un vector de dígitos es aceptable, y esto me permitió guardar 21 bytes :)
  • -2 bytes gracias a la sugerencia de @Giuseppe de aceptar solo el vector de caracteres
  • -2 bytes asignados en la definición de argumentos
digEmAll
fuente
1
Puede tomar acomo un vector de caracteres, lo que le permite establecer g=seq(a)directamente.
Giuseppe
@Giuseppe: eso es correcto!
digEmAll
5

05AB1E , 14 11 10 bytes

Guardado 1 byte gracias a Magic Octopus Urn / Adnan

ƶJDv¬N×?=¦

Pruébalo en línea!

Explicación

ƶ            # repeat each element its index (1-based) times 
 J           # join to string
  Dv         # for N in [0 ... len(string)-1] do
    ¬N×      # push the head repeated N times
       ?     # print without newline
        =    # print the rest of the string without popping
         ¦   # remove the head
Emigna
fuente
1
Pruébalo en línea! = 10
Urna de pulpo mágico
1
Sin embargo, no tengo crédito, el crédito es Adnans: codegolf.stackexchange.com/a/87074/59376
Urna de pulpo mágico el
@MagicOctopusUrn: ¡Ah, eso es genial! Gracias a los dos;)
Emigna
3

Excel VBA, 95 bytes

Una función de ventana inmediata anónima de VBE que toma entradas [A1]y salidas de la consola

n=[len(A1)]:For y=1To n:For l=1To y:?:For x=1To n:?String(x,Mid([A1],IIf(x>y,x,y)));:Next x,l,y

Ungolfed y comentó

n=[len(A1)]                         ''  Get Length
For y=1To n                         ''  Iterate down input
For l=1To y                         ''  Iterate down repeat lines
?                                   ''  Print Newline
For x=1To n                         ''  Iterate accross input
?String(x,Mid([A1],IIf(x>y,x,y)));  ''  Print x of the `max(x,y)`th digit in input
Next x,r,y                          ''  Loop, Loop, Loop
Taylor Scott
fuente
2

MATL , 15 12 bytes

tftY"t!2$X>)

Pruébalo en línea!

Sospecho que esto se puede acortar, pero no es tan malo ...

          % implicit input, '230'
t         % duplicate input. Stack: ['230','230']
f         % indices of nonzero values. Stack: ['230',[1,2,3]]
t         % duplicate. Stack: ['230',[1,2,3],[1,2,3]]
Y"        % run-length decoding. Stack: ['230',[1,2,2,3,3,3]]
t         % duplicate. Stack: ['230',[1,2,2,3,3,3],[1,2,2,3,3,3]]
!         % transpose. Stack: ['230',[1,2,2,3,3,3],[1;2;2;3;3;3]]
2$X>      % elementwise maximum of 2 inputs, with broadcast.
          % Stack:
          % ['230',
          % [1, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  2, 2, 2, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3;
          %  3, 3, 3, 3, 3, 3]]
 )        % index into G
          % implicit end, display stack contents
Giuseppe
fuente
2

Agregar ++ , 35 bytes

L,bLRdBcB]£X¦Ω+d‽b>1€Ω_A€Ω:AbLR¦+$T

Pruébalo en línea!

Cómo funciona

Tomamos la entrada como una lista de dígitos, mientras que nos impide a) tener que convertir a dígitos con BD , y también tener que guardar los dígitos, lo que tomaría dos bytes.

Primero, generamos un rango desde [1 ... len (input)] con bLR, luego repetimos cada elementonorte en el rango norteveces. Como la vectorización automática no existe en Add ++, la comprimimos consigo misma dBcB]para crear una lista de pares[[1,1],[2,2]...[norte,norte]]. Luego aplicamos el mapa estelar , junto con la repetición sobre los pares: £Xantes de concatenarlos en una matriz plana ( ¦Ω+).

A continuación, duplicar esta matriz y mesa por el máximo, d‽b>. Es decir, cada elemento de la matriz se empareja entre sí desde la segunda matriz y el comando máximo diádico se ejecuta sobre el par. Para una entrada de ejemplo de [6 5] , esto crea la matriz [1 2 2 2 2 2 2 2 2] , que es una versión aplanada del mosaico, como los índices para la matriz. Por desgracia, Añadir ++ utiliza matrices 0-indexados, por lo que necesitamos para disminuir cada elemento: 1€Ω_.

Luego, indexamos en la lista de entrada, presionando la entrada nuevamente ( A), lo que nuevamente ahorra bytes al tomar la entrada como una lista. Indice en la lista con €Ω:antes de cortar la matriz en las piezas alargadas adecuadamente. Si el número de dígitos en la entrada se denota porX, entonces el tamaño de la pieza es

X(X-1)2

o el Xth número triangular . Generamos eso empujando la longitud de la entrada, calculando el rango de 1 a ese valor, luego tomando la suma con AbLR¦+. Ahora, la pila, para una entrada de [6 5] , se ve como [[6 5 5 5 5 5 5 5 5] 3] . Tcorta la matriz en trozos de tamañonorte, pero los argumentos están actualmente en el orden incorrecto, por lo que los intercambiamos $antes de cortarlos y volver con ellos T.


fuente
1

Carbón de leña , 17 bytes

F⮌…LθUO⊕⊘×ι⁺³ι§θι

Pruébalo en línea! Explicación:

F⮌…Lθ

Recorre los índices de los personajes en orden inverso.

⊕⊘×ι⁺³ι

Calcule el tamaño del cuadrado.

UO...§θι

Dibuja el cuadrado usando el personaje actual.

Neil
fuente
1

Carbón , 14 bytes

E⭆θ×⊕κι×⊕κι‖O↗

Pruébalo en línea!

¿Cómo?

E⭆θ×⊕κι×⊕κι‖O↗ - implicitly print the result of...
E                - map:
  ⭆              -   over: string map:       
    θ             -     over: first input
     ×            -     using: repeat
        ι         -       what: ι (loop value)
      ⊕κ          -       by: incremented κ (loop counter)
         ×        -   using: repeat
            ι     -     what: ι (loop value)
          ⊕κ      -     by: incremented κ (loop counter)
             ‖O  - Reflect with overlap:
                ↗ -   direction: up-right

... ¿Se puede jugar a este método?

Jonathan Allan
fuente
"... ¿Se puede jugar a este método?" Incluso la solución de Neil es más larga, así que no veo ninguna esperanza aquí. :PAGS
Erik the Outgolfer
×⊕κιaunque dos veces.
Jonathan Allan
La cuestión es que no es fácil asignar eso a una variable, ya que los valores de ιy κcambian en cada iteración del ciclo Each.
Erik the Outgolfer
Tiene que ser una función, pero no sé si es posible.
Jonathan Allan
La pregunta que debe hacerse es si es posible en 3 (o 5, dependiendo de cómo se defina la función) bytes o menos. ;) (La respuesta obvia es, por supuesto, no).
Erik the Outgolfer
1

Stax , 12 bytes

ü°√¿«│⌠º₧@\τ

Ejecutar y depurarlo

Usando este algoritmo .

Explicación:

c%R:BXm]i*xit+ Full program, implicit input
c%             Length of input
  R            1-based range
   :B          Repeat each element according to the range ("123" -> "122333")
     X         Save to X register
      m        Map:
       ]         Character -> string
        i*       Repeat by iteration index
          xit    Trim first <iteration index> elements from X
             +   Concatenate
                 Implicit output with newline

Stax , 20 19 18 16 bytes

ù↔‼i,ÑΓæ☺=╘‼æ↕4╝

Ejecutar y depurarlo

Explicación:

c%R:BX%mYx%{y|Mvx@m Full program, implicit input
c%                  Length of input
  R                 1-based range
   :B               Repeat each element according to the range ("123" -> "122333")
     X              Save to X register
      %             Length
       m            Map over 1-based range:
        Y             Save index to Y register
         x%           Push length of X register
           {      m   Map over 1-based range:
            y|M         Maximum of both indices
               v        1-based -> 0-based (decrement)
                x@      Index into X register
                      Implicit output with newline
wastl
fuente
1

Adjunto , 34 bytes

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}

Pruébalo en línea!

Explicación

Funciona de manera similar a la respuesta J de Galen Ivanov .

{_[Table[Max,Flat!{_&_}=>1:#_]-1]}
{                                }   anonymous function: _ is input, array of digits
                                     example: _ := [2, 0, 3]
                         1:#_        the range 1 to Size[_]
                                     > e.g.: [1, 2, 3]
                  {   }=>            over each number N:
                   _&_                   map to N repeated N times
                                     > e.g.: [[1], [2, 2], [3, 3, 3]]
             Flat!                   flatten it
                                     > e.g.: [1, 2, 2, 3, 3, 3]
   Table[Max,                ]       create a "max" table with it
                                     > e.g.:
                                       1 2 2 3 3 3
                                       2 2 2 3 3 3
                                       2 2 2 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                              -1     subtract 1 from each
                                     > e.g.:
                                       0 1 1 2 2 2
                                       1 1 1 2 2 2
                                       1 1 1 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
                                       2 2 2 2 2 2
 _[                             ]    index the original array with this matrix
                                     > e.g.:
                                       2 0 0 3 3 3
                                       0 0 0 3 3 3
                                       0 0 0 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
                                       3 3 3 3 3 3
Conor O'Brien
fuente
1

C (gcc) , 130 bytes

¿Quién necesita matemáticas sofisticadas cuando puedes usar la fuerza bruta?

n,l;R(n,c){for(;n--;)putchar(c);}f(s){for(char*p=s,*q;*p++;)for(n=l=p-s;l--;R(1,10))for(R(n*n+n>>1,p[-1]),q=p;*q;q++)R(q-s+1,*q);}

Pruébalo en línea!

gastropner
fuente
1

QBasic 1.1 , 127 bytes

INPUT S$
FOR X=1TO LEN(S$)
K=K+X
R$=R$+STRING$(X,MID$(S$,X,1))
NEXT
FOR C=1TO K
?STRING$(C-1,MID$(R$,C,1))RIGHT$(R$,K-C+1)
NEXT

-4 gracias a DLosc .

Utiliza una versión modificada del algoritmo Python 2 de xnor .

La entrada es una cadena sin comillas. La salida está \nseparada sin espacios adicionales o \ns.

Erik el Outgolfer
fuente
1

QBasic , 111 bytes

Una función anónima que solicita entradas y salidas a la consola.

INPUT s$
n=LEN(s$)
FOR y=1TO n
FOR l=1TO y
?
FOR x=1TO n
z=x
IF y>x THEN z=y
?STRING$(x,MID$(s$,z));
NEXT x,l,y
Taylor Scott
fuente
Se ve bien, pero ¿no quieres decir "programa completo"? No creo que QBasic tenga "funciones anónimas".
DLosc
0

Php 7.1 , 163 bytes

Vía CLI proporcionando el número como argumento:

<?foreach(str_split($argv[1])as$k=>$d)$a[]=array_fill(0,$s+=$k+1,array_fill(0,$s,$d));foreach(array_replace_recursive(...array_reverse($a))as$v)echo join($v)."\n";

No tan golfizado:

$n = 123;

foreach(str_split($n) as $k => $d) {
    $s += $k + 1;
    $a[] = array_fill(0, $s, array_fill(0, $s, $d));
}

foreach(array_replace_recursive(...array_reverse($a)) as $v)
    echo implode('', $v) . "\n";

Salida:

122333
222333
222333
333333
333333
333333

Método:

Básicamente construya cuadrados de matriz multidimensionales que consisten en el dígito, y luego superponga todos ellos (array_replace_recursive).

(Sí, sé que esto es vergonzosamente largo).

Progrock
fuente
Si la entrada es una matriz de dígitos predefinida, y el eco implode / join se elimina / reemplaza con una asignación a una lista de la lista de dígitos, esto puede reducirse a aproximadamente 119 bytes, sí aún es largo.
Progrock
0

Japt, 12 bytes

Toma la entrada como una cadena, emite una matriz de cadenas.

Ë+pE
¬£h°YçX

Intentalo


Explicación

            :Implicit input of string U
Ë           :Map each character D at 0-based index E
  pE        :  Repeat D E times
 +          :  Append to D
\n          :Reassign to U
¬           :Split to character array
 £          :Map each element X at 0-based index Y
   °Y       :  Increment Y
     çX     :  Repeat X Y times
  h         :  Replace the first Y characters in U with that
Shaggy
fuente
0

uBASIC , 120 bytes

Una función anónima que toma la entrada desde STDIN y sale a STDOUT

0Input"",S$:N=Len(S$):ForY=1ToN:ForL=1ToY:ForX=1ToN:ForC=1ToX:Z=X:IfY>XThenZ=Y
1?Mid$(s$,z,1);:NextC:NextX:?:NextL:NextY

Pruébalo en línea!

Taylor Scott
fuente
0

Visual Basic .NET (VBC) , 198 bytes

Una Subrutina que toma entradas de STDIN y salidas a STDOUT.

Parece que no puede hacer que StrDup funcione: /

Module M
Sub Main
Dim c,s,n,l,x,y
s=Console.readLine()
n=Len(s)
For y=1To n
For l=1To y
For x=1To n
For c=1To x
Console.Write(Mid(s,IIf(x>y,x,y),1)&IIf(c=n,vbLf,""))
Next c,x,l,y 
End Sub
End Module

Pruébalo en línea!

Taylor Scott
fuente
0

Lua, 149 140 bytes

Función que acepta una lista de cadenas de dígitos e imprime el resultado en stdout. Este es mi primer intento de golf de código (y la elección del idioma tampoco ayuda), así que tengan paciencia conmigo :)

Pruébalo en línea!

function(a)F,s=0,""for b=1,#a do s=s..a[b]:rep(b)end;for b=1,#a do io.write((s.."\n"):rep(b))F,z=F+b,a[b+1]or""s=z:rep(F)..s:sub(F+1)end end

Sin golf:

G = function(p)
    F,s = 0,""
    for i=1,#p do
        s=s..p[i]:rep(i)
    end
    for i=1, #p do
        io.write((s.."\n"):rep(i))
        F,z = F+i, p[i+1]or""
        s = z:rep(F)..s:sub(F+1)
    end
end
-- allows to pass the argument list from stdin
-- example: {"1", "2", "3", "4", "5"}
G(load("return " .. io.read())())
PhilipRoman
fuente
0

Yabasic , 108 bytes

Una función anónima que toma entradas de STDIN y salidas a STDOUT

Input""s$
n=len(s$)
For y=1To n
For r=1To y
For x=1To n
For c=1To x?Mid$(s$,max(x,y),1);Next
Next
?Next
Next

Pruébalo en línea!

Taylor Scott
fuente