¡Cien cuadrados!

10

Volver a lo básico...

Como profesor en la escuela primaria local (¿primaria?), Necesita una forma de enseñar a su clase sus horarios. A su disposición, tiene cientos de cuadrados y una carga de bolígrafos rojos. También debe poder mostrar a su clase las respuestas correctas rápidamente.

Ahora, eres lo suficientemente inteligente como para escribir un programa que pueda hacer tablas de multiplicar, pero ¿puedes dibujarlas en cien cuadrados?

El reto

Emite cien cuadrados a stdout o equivalentes usando códigos de escape ansi para sombrear números que son múltiplos de la entrada.

  • Salida de una cuadrícula de 10x10 que contiene los números 1-100.
    • No importa la alineación de números de 2 dígitos en cada cuadro siempre que sea consistente
    • Para números de 1 dígito, puede rellenar hasta 2 dígitos y usar el mismo formato que los números de 2 dígitos o centrados en el centro del cuadro.
  • Si el número en el cuadro es un múltiplo de la entrada, colorea todo el cuadro de rojo.
    • Esto significa la caja completa, no solo la parte numérica

Por ejemplo, dada la entrada 3, imprima los cien cuadrados dados

cien cuadrados 3

Este es el código de golf, por lo que gana la respuesta más corta en bytes.

Azul
fuente
2
¿Podemos imprimir 01 en lugar de 1. 02 para 2, etc., etc.
Keatinge
1
Entonces, ¿no puedo usar <table>, por ejemplo?
nicael
1
¿Importa el color de los números? ¿Puede ser whiteo grey?
Bassdrop Cumberwubwubwub
1
@Keatinge No lo he decidido todavía: me estoy desviando hacia sí @nicael no, tiene que estar usando ansi-escape o las respuestas no estarían en el mismo campo de juego, @BassdropCumberwubwubwub puedes usar diferentes colores pero a menos que ' usarlo cursesno debería importar: el rojo es corto de todos modos.
Azul
@Keatinge, sí, puede usar relleno, pero solo con ceros y solo un número de un dígito
Azul

Respuestas:

8

Python 2, 166 bytes

R=range;n=input()
for y in R(21):print''.join('♥[%dm%s♥[m'%(any(5>x-k%10*4>-1<y-k/10*2<3for k in R(n-1,100,n))*41,('+---|%2d '%(x/4+y*5-4))[y%2*4+x%4])for x in R(41))

Reemplazar por octal 033(el carácter de escape ANSI).

ingrese la descripción de la imagen aquí

Explicación

Tratamos la salida como una 41×21cuadrícula y calculamos directamente el carácter y el color en cada punto.

Es decir, la estructura del código es:

n = input()
for y in range(21):
    print ''.join(F(x, y) for x in range(41))

para alguna función F.

El resultado de Fsiempre es de la siguiente forma:

Usamos la cadena de formato '\33[%dm%s\33[m', donde el primero %des 0 o 41, y %ses el carácter que deseamos imprimir.


Para el color , tenemos la siguiente fórmula:

any(5>x-k%10*4>-1<y-k/10*2<3for k in R(n-1,100,n))*41

No voy a explicar completamente esto, pero básicamente recorre todos los rectángulos que deberían ser de color rojo, y verifica si (x, y)está dentro de alguno de ellos.

Tenga en cuenta el uso de encadenamiento de operador: reescribí -1<A<5 and -1<B<3en 5>A>-1<B<3.


Para el personaje , tenemos la siguiente fórmula:

('+---|%2d '%(x/4+y*5-4))[y%2*4+x%4]

Si y % 2 == 0entonces para x = 0, 1, …esto generará+---+---+---…

Si y % 2 == 1entonces para x = 0, 1, …esto generará| p |p+1|p+2…

Lynn
fuente
2
Uno de estos días, habrá un desafío en el que realmente necesitarás usar un ♥ literal en el código, y todos estarán confundidos;)
FryAmTheEggman
Me encantaría ver una explicación.
shaunakde
@shaunakde Escribí algo (pero guardé algunos bytes en el proceso, así que tal vez también fue un poco más difícil de seguir ... ^^)
Lynn
1
@ Lynn Muchas gracias por tomarse el tiempo y la energía para explicar este código. Estoy muy agradecido por esta explicación. ¡Me ayudó a aprender mucho!
shaunakde
1
¡Eres muy bienvenido! :)
Lynn
4

Julia, 219 182 169 169 167 bytes

!n=(~j=j%n<1;k(v=j->"---",c=+,s="$c\e[m";l=~)=println([(l(j)?"\e[;;41m$c":s)v(j)for j=10i+(1:10)]...,s);i=0;k();for i=0:9 k(j->lpad(j,3),|);k(l=j->~j|~(j+10(i<9)))end)

Usado así: !7

Sin golf:

function !(n::Integer)
     for j=(1:10)     #This loop generates the top of the box
       if (j%n==0)
         print("\e[;;41m+---") #"\e[;;41m" is the ANSI escape code
                               #for red background colour in Julia
       else
         print("+\e[m---")     #"\e[m" resets to original colours
       end
     end
     println("+\e[m")
     for i=0:9
       for j=10i+(1:10)  #This loop generates the rows with the numbers
         if (j%n==0)
           print("\e[;;41m|",lpad(j,3))
         else
           print("|\e[m",lpad(j,3))
         end
       end
       println("|\e[m")
       for j=10i+(1:10)  #This loop generates the other rows
         if (j%n==0)||((j+10)%n==0&&i<9)
           print("\e[;;41m+---")
         else
           print("+\e[m---")
         end
       end
       println("+\e[m")
     end
   end

Tenga en cuenta que esto es muy poco estricto, para una máxima legibilidad.

Glen O
fuente
0

HTML + Javascript, 379

HTML:

<input id=a value=3><pre id=z>

Javascript:

for(i=0,s=`\n|`,o='+';i++<109;x=i<10?` ${i} `:i-100?' '+i:i,s+=x+'|',o+=x='---+',i%10||(o+=s+'\n+',s=`\n|`));z.innerHTML=[...o+x].map((x,i)=>`<span id=i${i}>${x}</span>`).join``;f=m=>window['i'+m].style.background='red';for(j=k=+a.value;j<=100;j+=k){p=(j/10|0)*84+((m=j%10)?(m-1)*4:-48);'000102030442434445468485868788'.match(/../g).map(x=>f(+x+p))}

jsfiddle.

Washington Guedes
fuente