Cento quadrati!


10

Ritorno alle basi...

Come insegnante nella scuola elementare locale (elementare?), Hai bisogno di un modo per insegnare alla tua classe i loro orari. A tua disposizione, hai centinaia di quadrati e un carico di penne rosse. Devi anche essere in grado di mostrare rapidamente alla tua classe le risposte corrette.

Ora, sei abbastanza intelligente da scrivere un programma in grado di fare tabelline, ma puoi disegnarli su cento quadrati?

La sfida

Invia un centinaio di quadrati a stdout o equivalente usando i codici ansi-escape per ombreggiare i numeri che sono multipli dell'input.

  • Emette una griglia 10x10 contenente i numeri 1-100.
    • Non importa l'allineamento di numeri a 2 cifre in ogni casella purché sia ​​coerente
    • Per i numeri a 1 cifra, puoi inserire fino a 2 cifre e utilizzare la stessa formattazione dei numeri a 2 cifre o centrati al centro della casella.
  • Se il numero nella casella è un multiplo dell'input, colora di rosso l'intera casella.
    • Ciò significa che l'intera casella, non solo la parte numerica

Ad esempio, dato l'input 3, stampare il centinaio dato

cento quadrati 3

Questo è il codice golf, quindi vince la risposta più breve in byte!


2
Possiamo stampare 01 invece di 1. 02 per 2, ecc
Ecc.

1
Quindi non posso usare <table>, per esempio?
nicael,

1
Il colore dei numeri è importante? Può essere whiteo grey?
Bassdrop Cumberwubwubwub,

1
@Keatinge Non ho ancora deciso - Sto andando verso sì @nicael no, deve usare ansi-escape o le risposte non sarebbero sullo stesso campo di gioco, @BassdropCumberwubwubwub potresti usare colori diversi ma a meno che tu ' riutilizzarlo cursesnon dovrebbe importare - il rosso è comunque corto.
Blue

@Keatinge sì, puoi usare il riempimento - ma solo con zeri e numeri di una sola cifra
Blu

Risposte:


8

Python 2, 166 byte

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

Sostituisci con ottale 033(il carattere di escape ANSI).

inserisci qui la descrizione dell'immagine

Spiegazione

Trattiamo l'output come una 41×21griglia e calcoliamo direttamente il carattere e il colore in ogni punto.

Cioè, la struttura del codice è:

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

per qualche funzione F.

Il risultato di Fè sempre della seguente forma:

Usiamo la stringa di formato '\33[%dm%s\33[m', in cui la prima %dè 0 o 41 e %sil carattere che vogliamo stampare.


Per il colore , abbiamo la seguente formula:

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

Non lo spiegherò completamente, ma fondamentalmente circola su tutti i rettangoli che dovrebbero essere colorati di rosso e controlla se (x, y)è all'interno di uno di essi.

Si noti l'uso dell'operatore concatenamento: ho riscritto -1<A<5 and -1<B<3in 5>A>-1<B<3.


Per il personaggio , abbiamo la seguente formula:

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

Se y % 2 == 0quindi per x = 0, 1, …questo genererà+---+---+---…

Se y % 2 == 1quindi per x = 0, 1, …questo genererà| p |p+1|p+2…


2
Uno di questi giorni, ci sarà una sfida in cui devi effettivamente usare un ♥ letterale nel codice e tutti saranno confusi;)
FryAmTheEggman

Mi piacerebbe vedere una spiegazione.
Shaunakde,

@shaunakde Ho scritto qualcosa (ma ho salvato alcuni byte nel processo, quindi forse è anche diventato leggermente più difficile da seguire ... ^^)
Lynn

1
@Lynn Grazie mille per aver dedicato il tempo e l'energia per spiegare questo codice. Sono molto grato per questa spiegazione. Mi ha aiutato a imparare molto!
Shaunakde,

1
Di niente! :)
Lynn,

4

Julia, 219 182 169 167 byte

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

Usato così: !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

Si noti che questo è molto non golfato, per la massima leggibilità.


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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.