Une centaine de carrés!

10

Retour aux sources...

En tant que professeur à l'école primaire (primaire?) Locale, vous avez besoin d'un moyen d'enseigner à votre classe leurs horaires. A votre disposition, vous avez cent carrés et une charge de stylos rouges. Vous devez également pouvoir montrer rapidement à votre classe les bonnes réponses.

Maintenant, vous êtes assez intelligent pour écrire un programme qui peut faire des tables de multiplication, mais pouvez-vous les dessiner sur cent carrés?

Le défi

Sortez cent carrés vers stdout ou équivalent en utilisant des codes ansi-escape pour ombrer les nombres qui sont des multiples de l'entrée.

  • Sortez une grille 10x10 contenant les nombres 1-100.
    • Peu importe l'alignement des nombres à 2 chiffres dans chaque case tant qu'il est cohérent
    • Pour les nombres à 1 chiffre, vous pouvez remplir à 2 chiffres et utiliser le même formatage que les nombres à 2 chiffres ou centré au milieu de la boîte.
  • Si le nombre dans la case est un multiple de l'entrée, coloriez la case entière en rouge.
    • Cela signifie que la boîte entière, pas seulement la partie numérique

Par exemple, étant donné l'entrée 3, imprimez les cent carrés donnés

cent carré 3

C'est le golf de code, donc la réponse la plus courte en octets l'emporte!

Bleu
la source
2
Pouvons-nous imprimer 01 au lieu de 1. 02 pour 2, etc etc
Keatinge
1
Je ne peux donc pas utiliser <table>, par exemple?
nicael
1
La couleur des chiffres est-elle importante? Peut-il être whiteou grey?
Bassdrop Cumberwubwubwub
1
@Keatinge Je n'ai pas encore décidé - je vire vers oui @nicael non, il doit utiliser des échappées ansi ou les réponses ne seraient pas sur le même terrain de jeu, @BassdropCumberwubwubwub vous pouvez utiliser des couleurs différentes mais à moins que vous '' le réutiliser cursesne devrait pas avoir d'importance - le rouge est de toute façon court.
Blue
@Keatinge oui, vous pouvez utiliser le rembourrage - mais uniquement avec des zéros et un seul chiffre
Blue

Réponses:

8

Python 2, 166 octets

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

Remplacez par octal 033(le caractère d'échappement ANSI).

entrez la description de l'image ici

Explication

Nous traitons la sortie comme une 41×21grille et calculons directement le caractère et la couleur à chaque point.

Autrement dit, la structure du code est la suivante:

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

pour une certaine fonction F.

Le résultat de Fest toujours de la forme suivante:

Nous utilisons la chaîne de formatage '\33[%dm%s\33[m', où la première %dest 0 ou 41, et %sle caractère que nous souhaitons imprimer.


Pour la couleur , nous avons la formule suivante:

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

Je ne vais pas l'expliquer complètement, mais il passe en boucle sur tous les rectangles qui devraient être colorés en rouge et vérifie s'il se (x, y)trouve à l'intérieur de l'un d'eux.

Notez l'utilisation du chaînage opérateur: j'ai réécrit -1<A<5 and -1<B<3en 5>A>-1<B<3.


Pour le personnage , nous avons la formule suivante:

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

Si y % 2 == 0alors pour x = 0, 1, …cela va générer+---+---+---…

Si y % 2 == 1alors pour x = 0, 1, …cela va générer| p |p+1|p+2…

Lynn
la source
2
Un de ces jours, il y aura un défi où vous devrez réellement utiliser un littéral ♥ dans le code, et tout le monde sera confus;)
FryAmTheEggman
J'adorerais voir une explication.
shaunakde
@shaunakde J'ai écrit quelque chose (mais j'ai économisé quelques octets dans le processus, alors peut-être que c'est aussi devenu un peu plus difficile à suivre… ^^)
Lynn
1
@Lynn Merci beaucoup d'avoir pris le temps et l'énergie d'expliquer ce code. Je suis très reconnaissant de cette explication. Cela m'a beaucoup aidé!
shaunakde
1
Vous êtes les bienvenus! :)
Lynn
4

Julia, 219 182 169 167 167 octets

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

Utilisé comme ceci: !7

Non 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

Notez que ce n'est pas du tout golfé, pour une lisibilité maximale.

Glen O
la source
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
la source