Llenar el cubo

14

Su tarea es llenar el cubo con números hasta una entrada dada.

Reglas

Los números ocupan la posición más a la izquierda, luego a la derecha, luego a la izquierda, etc.

Después del desbordamiento, los números comienzan a reunirse alrededor del cubo de manera similar. Ocupan posición en diagonal.

Los ejemplos deben dejar en claro cuál es el resultado esperado (algunas reglas se mencionan en los ejemplos).

Para más de 10, use el dígito más a la derecha

Ejemplos:

The bucket: 
|      |  or |      | 
|      |     |      | 
|      |     |      |
|      |     |      |
|------|     |______|

input:1  (You can start from either 0 or 1)
output:
|      |  (There can be whitespace to the left even if there is no overflow
|      |  but the bucket must not be distorted.)
|      |
|1     |
|------|

input:6
output:
|      |
|      |
|      |
|135642|
|------|

input:8
output:
|      |
|      |
|7    8|
|135642|
|------|

input:23
output:
|913 20|
|357864|
|791208|
|135642|
|------|

input:27
output:
  |913420|
  |357864|
  |791208|
  |135642|
75|------|6

input:30
output:
  |913420|
  |357864|
  |791208|
 9|135642|0
75|------|68

input:40
output:
    |913420|
    |357864|
   5|791208|6
 939|135642|040
7175|------|6828

input:54   (Maximum input for start=1)
    3|913420|4
   13|357864|42
  915|791208|620
 7939|135642|0408
57175|------|68286

Este es el código de golf, por lo que gana el código más corto.

Vedant Kandoi
fuente
¿Qué quiere decir exactamente con "puede comenzar desde 0 o 1" ? ¿Puede la secuencia de dígitos estar indexada en 0 (es decir, |024531|para ) o solo la entrada? n=6
Arnauld
@Arnauld, sí, la secuencia puede comenzar desde 0
Vedant Kandoi
¡Este es uno de los mejores desafíos de codificación para golf de código que he visto aquí!
Michael Karas

Respuestas:

9

Javascript (Node.js) ,  145  143 bytes

Un patrón codificado (ver aquí para más matemáticas).

1 indexado.

n=>`    g|EGIJHF|h
   e]|?ACDB@|^f
  c[U|9;=><:|V\\d
 aYSO|357864|PTZb
_WQMK|------|LNRX\``.replace(/[3-h]/g,c=>(x=Buffer(c)[0])<n+51?x%10:' ')

Pruébalo en línea!

Guardado 2 bytes gracias a @tsh

Arnauld
fuente
1
/[^\s|-]/->/[0-z]/
tsh
@tsh D'oh! Extrañé totalmente esta simplificación. ¡Gracias!
Arnauld
7

JavaScript (ES6),  144 ... 139  137 bytes

Un enfoque matemático (ver aquí para menos matemáticas).

0 indexado.

n=>(y=4,g=x=>~y?(X=x>8?17-x:x,k=X<y?g:X<5?24-(z=4+y-X)*~z+y*2:y*6+X*2-18,~X?X^5?k<0?'-':(k+=x>8)<n?k%10:' ':'|':`
`)+g(~X?-~x:!y--):'')()

Pruébalo en línea!

¿Cómo?

La salida se construye carácter por carácter, con y decreciente desde 4 4 a 0 0 y X creciente desde 0 0 a 18 años en cada fila.

Definimos:

X={XSi X817-XSi X>8

Al escribir los valores completos en lugar de solo los dígitos de la unidad, obtenemos la siguiente tabla:

 x |  0  1  2  3  4  5  6  7  8 |  9 10 11 12 13 14 15 16 17 18
 X |  0  1  2  3  4  5  6  7  8 |  8  7  6  5  4  3  2  1  0 -1
---+----------------------------+-------------------------------
 4 | .. .. .. .. 52 || 18 20 22 | 23 21 19 || 53 .. .. .. .. \n
 3 | .. .. .. 50 42 || 12 14 16 | 17 15 13 || 43 51 .. .. .. \n
 2 | .. .. 48 40 34 || 6  8  10 | 11 9  7  || 35 41 49 .. .. \n
 1 | .. 46 38 32 28 || 0  2  4  | 5  3  1  || 29 33 39 47 .. \n
 0 | 44 36 30 26 24 || -- -- -- | -- -- -- || 25 27 31 37 45 \n

Esta tabla es esencialmente simétrica a través del eje y, excepto que los valores en el lado izquierdo son pares y los valores en el lado derecho son sus contrapartes impares.

Definimos:

k={24+(4 4+y-X)(5 5+y-X)+2ySi X<5 56 6y+2X-18 añosSi X>5 5

k={kSi X8k+1Si X>8

Y para cada celda, agregamos:

  • X=-1
  • X=5 5
  • k<0 0
  • X<yk>nortenorte
  • kmodificación10

Comentado

n => (                                // main function taking n
  y = 4,                              // start with y = 4
  g = x =>                            // g = recursive function taking x
    ~y ?                              // if y is not equal to -1:
      ( X = x > 8 ? 17 - x : x,       //   compute X
        k = X < y ?                   //   if X is less than y:
          g                           //     set k to a non-numeric value
        :                             //   else:
          X < 5 ?                     //     if X is less than 5:
            24 - (z = 4 + y - X) * ~z //       apply the 'side numbers' formula
             + y * 2                  //
          :                           //     else:
            y * 6 + X * 2 - 18,       //       apply the 'middle numbers' formula
        ~X ?                          //   if X is not equal to -1:
          X ^ 5 ?                     //     if X is not equal to 5:
            k < 0 ?                   //       if k is less than 0:
              '-'                     //         append a hyphen
            :                         //       else:
              (k += x > 8) < n ?      //         update k to k'; if it's less than n:
                k % 10                //           append the unit digit of k'
              :                       //         else:
                ' '                   //           append a space
          :                           //     else (X = 5):
            '|'                       //       append a pipe
        :                             //   else (X = -1):
          `\n`                        //     append a linefeed
      )                               //
      + g(~X ? -~x : !y--)            //   update x and y, and do a recursive call
    :                                 // else (y = -1):
      ''                              //   stop recursion
)()                                   // initial call to g with x undefined
Arnauld
fuente
3

Python 2 , 170 bytes

I=input()
s="    u|SUWXVT|v\n   sk|MOQRPN|lt\n  qic|GIKLJH|djr\n oga]|ACEFDB|^bhp\nme_[Y|------|Z\`fn"
i=1
exec"s=s.replace(chr(64+i),[`i%10`,' '][i>I]);i+=1;"*55
print s

Pruébalo en línea!

TFeld
fuente
3

Java 10, 168 bytes

n->"    g|EGIJHF|h\n   e]|?ACDB@|^f\n  c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`".chars().forEach(c->System.out.print(c<46|c==124?(char)c:c<n+51?c%10:" "))

Puerto de la respuesta de JavaScript de @Arnauld (por lo tanto, también 1 indexado y con salida -como inferior). Si te gusta esta respuesta, ¡asegúrate de votarlo también!

Pruébalo en línea.

Explicación:

n->                      // Method with integer parameter and no return-type
  "    g|EGIJHF|h\n   e]|?ACDB@|^f\n  c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`"
                         //  String containing the bucket and magic string
   .chars().forEach(c->  //  Loop over the characters (as integers)
     System.out.print(   //   Print:
       c<46|c==124?      //    If the character is "\n", " ", "-", or "|":
        (char)c          //     Output the character as is
       :c<n+51?          //    Else-if the character value is smaller than the input + 51:
        c%10             //     Output a digit: the character value modulo-9
       :                 //    Else:
        " "))            //     Output a space
Kevin Cruijssen
fuente
1

Código de máquina 6502 (C64), 130 bytes

00 C0 20 9B B7 A9 C0 65 65 85 FB A2 00 BD 2B C0 F0 1A 10 12 C5 FB 90 04 A9 20
D0 0A 69 70 C9 3A 90 04 E9 0A B0 F8 20 D2 FF E8 D0 E1 60 20 20 20 20 F5 7D D3
D5 D7 D8 D6 D4 7D F6 0D 20 20 20 F3 EB 7D CD CF D1 D2 D0 CE 7D EC F4 0D 20 20
F1 E9 E3 7D C7 C9 CB CC CA C8 7D E4 EA F2 0D 20 EF E7 E1 DD 7D C1 C3 C5 C6 C4
C2 7D DE E2 E8 F0 0D ED E5 DF DB D9 7D 2D 2D 2D 2D 2D 2D 7D DA DC E0 E6 EE 00

Utiliza una versión modificada del enfoque "preformateado" de algunas otras respuestas. Contiene una cadena completa del depósito, pero los dígitos se reemplazan por valores a partir de 0xC1, mientras que los caracteres para la impresión directa están en el rango 0x01- 0x7f.

El juego de caracteres C64 no incluye un carácter pipe ( |), por lo tanto, se reemplaza con el carácter PETSCII de aspecto similar 0x7d.

Demostración en línea

Uso: SYS49152,[n](1 indexado, por ejemplo, SYS49152,54para la salida completa)

Desmontaje comentado :

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; get unsigned byte from commandline
.C:c003  A9 C0       LDA #$C0           ; add #$C0 (+ carry = #$C1) ...
.C:c005  65 65       ADC $65            ; ... to parameter
.C:c007  85 FB       STA $FB            ; and store in $FB
.C:c009  A2 00       LDX #$00           ; loop index
.C:c00b   .loop:
.C:c00b  BD 2B C0    LDA .bucket,X      ; loop over encoded string
.C:c00e  F0 1A       BEQ .done          ; null-terminator -> done
.C:c010  10 12       BPL .out           ; positive (bit 7 clear) -> output
.C:c012  C5 FB       CMP $FB            ; compare with parameter+#$C1
.C:c014  90 04       BCC .digit         ; smaller -> convert to digit
.C:c016  A9 20       LDA #$20           ; otherwise load space character
.C:c018  D0 0A       BNE .out           ; and output
.C:c01a   .digit:
.C:c01a  69 70       ADC #$70           ; add offset to '0' (#$30)
.C:c01c   .check:
.C:c01c  C9 3A       CMP #$3A           ; greater than '9' (#$39) ?
.C:c01e  90 04       BCC .out           ; no -> to output
.C:c020  E9 0A       SBC #$0A           ; otherwise subtract 10 (#$a)
.C:c022  B0 F8       BCS .check         ; and check again
.C:c024   .out:
.C:c024  20 D2 FF    JSR $FFD2          ; output character
.C:c027  E8          INX                ; next index
.C:c028  D0 E1       BNE .loop          ; and repeat loop
.C:c02a   .done:
.C:c02a  60          RTS                ; exit ....
.C:c02b   .bucket:
.C:c02b  20 20 20    [...]              ; "encoded" string for bucket
Felix Palmen
fuente
0

Carbón , 64 bytes

Nθ³↑⁵‖M←F²«‖J⁻³ι±¹F⊘⁺θ¬ι«↖I﹪⁺⊗κ⊕ιχM§”)⊟E≡≦⌈▷⊖ü∕”꧔)⊟&hXτtD(λM”κ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

Nθ

Ingrese el número.

³↑⁵‖M←

Dibuje la mitad del cubo y luego duplíquelo para completar el cubo.

F²«

Bucle para cada lado del cubo.

‖J⁻³ι±¹

Refleje el cubo para que podamos dibujar en una dirección constante en ambos bucles, y saltar a la posición del primer dígito en ese lado del cubo.

F⊘⁺θ¬ι«

Pase el número de dígitos en ese lado del cubo.

↖I﹪⁺⊗κ⊕ιχ

Imprima el siguiente dígito y mueva el cursor hacia arriba y hacia la izquierda.

M§”)⊟E≡≦⌈▷⊖ü∕”꧔)⊟&hXτtD(λM”κ

Ajuste la posición del cursor leyendo los desplazamientos de dos cadenas comprimidas, 003003003005203004000500(desplazamientos horizontales) y 11011011011510200300040000(desplazamientos verticales). Estas compensaciones tienen en cuenta el movimiento del cursor anterior, lo que convenientemente significa que nunca tienen que ser negativas.

Neil
fuente