Cem quadrados!

10

Voltar à rotina...

Como professor da escola primária local (série?), Você precisa de uma maneira de ensinar à turma as tabelas de horários. À sua disposição, você tem cem quadrados e uma carga de canetas vermelhas. Você também precisa mostrar à sua classe as respostas corretas rapidamente.

Agora, você é esperto o suficiente para escrever um programa que pode fazer tabelas de horários, mas você pode desenhá-las em cem quadrados?

O desafio

Crie cem quadrados para stdout ou equivalente usando códigos de escape para sombrear números que são múltiplos da entrada.

  • Saída uma grade 10x10 contendo os números 1-100.
    • Não importa o alinhamento de números de 2 dígitos em cada caixa, desde que seja consistente
    • Para números de 1 dígito, você pode preencher até 2 dígitos e usar a mesma formatação que os números de 2 dígitos ou centralizar no meio da caixa.
  • Se o número na caixa for múltiplo da entrada, colora a caixa inteira em vermelho.
    • Isso significa a caixa inteira, não apenas a parte numérica

Por exemplo, dada a entrada 3, imprima os cem quadrados dados

cem quadrados 3

Isso é código de golfe, então a resposta mais curta em bytes vence!

Azul
fonte
2
Nós podemos imprimir 01 em vez de 1. 02 para 2, etc etc
Keatinge
11
Então não posso usar <table>, por exemplo?
Nicael
11
A cor dos números importa? Pode ser whiteou grey?
Bassdrop Cumberwubwubwub
11
@Keatinge ainda não decidi - estou voltando para sim @nicael não, ele deve estar usando ansi-escapes ou as respostas não estarão no mesmo campo de jogo, @BassdropCumberwubwubwub você pode usar cores diferentes, mas a menos que você ' reutilizá- curseslo não deve importar - vermelho é curto de qualquer maneira.
Azul
@Keatinge sim, você pode usar o preenchimento - mas só com zeros e um um algarismos apenas
Azul

Respostas:

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

Substitua por octal 033(o caractere de escape ANSI).

insira a descrição da imagem aqui

Explicação

Tratamos a saída como uma 41×21grade e computamos diretamente o caractere e a cor em cada ponto.

Ou seja, a estrutura do código é:

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

para alguma função F.

O resultado de Fé sempre da seguinte forma:

Usamos a string de formato '\33[%dm%s\33[m', onde a primeira %dé 0 ou 41 e %sé o caractere que queremos imprimir.


Para a cor , temos a seguinte fórmula:

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

Não vou explicar completamente isso, mas basicamente passa por todos os retângulos que devem ter a cor vermelha e verifica se (x, y)está dentro de algum deles.

Observe o uso do encadeamento do operador: eu reescrevi -1<A<5 and -1<B<3para 5>A>-1<B<3.


Para o personagem , temos a seguinte fórmula:

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

Se y % 2 == 0então, para x = 0, 1, …isso irá gerar+---+---+---…

Se y % 2 == 1então, para x = 0, 1, …isso irá gerar| p |p+1|p+2…

Lynn
fonte
2
Um destes dias, não vai ser um desafio onde você realmente precisa usar um literal ♥ no código, e todo mundo vai ser confundida;)
FryAmTheEggman
Adoraria ver uma explicação.
shaunakde
@shaunakde eu escrevi alguma coisa (mas salvo alguns bytes no processo, talvez por isso, também tenho um pouco mais difícil de seguir ... ^^)
Lynn
11
@ Lynn Muito obrigado por dedicar tempo e energia para explicar este código. Sou muito grato por esta explicação. Isso me ajudou a aprender muito!
shaunakde
11
Você é muito bem-vindo! :)
Lynn
4

Julia, 219 182 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 assim: !7

Ungolfed:

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

Observe que isso é muito simples, para máxima legibilidade.

Glen O
fonte
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
fonte