Sto kwadratów!

10

Powrót do podstaw ...

Jako nauczyciel w lokalnej szkole podstawowej (klasie?) Potrzebujesz sposobu, aby nauczyć klasę ich harmonogramów. Do Twojej dyspozycji masz sto kwadratów i mnóstwo czerwonych długopisów. Musisz także być w stanie szybko pokazać swojej klasie prawidłowe odpowiedzi.

Teraz jesteś wystarczająco sprytny, aby napisać program, który potrafi tworzyć tabele czasów, ale czy możesz narysować je na sto kwadratach?

Wyzwanie

Wyjmij sto kwadratów na standardowe lub równoważne za pomocą kodów ucieczki ansi, aby przyciemnić liczby, które są wielokrotnościami danych wejściowych.

  • Wyjmij siatkę 10x10 zawierającą liczby 1-100.
    • Dopasowanie liczby 2 cyfr w każdym polu nie ma znaczenia, o ile jest ono spójne
    • W przypadku liczb 1-cyfrowych możesz wpisać 2 cyfry i zastosować to samo formatowanie, co liczby 2-cyfrowe lub wyśrodkowane na środku pola.
  • Jeśli liczba w polu jest wielokrotnością wartości wejściowej, pokoloruj całą ramkę na czerwono.
    • Oznacza to całe pole, a nie tylko część liczbową

Na przykład, biorąc pod uwagę dane wejściowe 3, wydrukuj podane sto kwadratów

sto kwadrat 3

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!

niebieski
źródło
2
Czy możemy wydrukować 01 zamiast 1. 02 za 2 itd. Itd.
Keatinge
1
Więc nie mogę <table>na przykład użyć ?
nicael
1
Czy kolor liczb ma znaczenie? Może to być whitealbo grey?
Bassdrop Cumberwubwubwub
1
@Keatinge Jeszcze nie zdecydowałem - skręcam w kierunku tak @nicael nie, to musi być użycie ucieczki ansi, inaczej odpowiedzi nie będą na tym samym polu gry, @BassdropCumberwubwubwub możesz użyć różnych kolorów, ale chyba że ponowne użycie cursesnie powinno mieć znaczenia - czerwony i tak jest krótki.
Blue
@Keatinge tak, możesz używać dopełnienia - ale tylko z zerami i tylko z jedną cyfrą
Blue

Odpowiedzi:

8

Python 2, 166 bajtów

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

Zamień na ósemkowy 033(znak zmiany znaczenia ANSI).

wprowadź opis zdjęcia tutaj

Wyjaśnienie

Dane wyjściowe traktujemy jak 41×21siatkę i bezpośrednio obliczamy charakter i kolor w każdym punkcie.

Oznacza to, że struktura kodu jest następująca:

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

dla niektórych funkcji F.

Wynik Fjest zawsze w następującej formie:

Używamy ciągu formatu '\33[%dm%s\33[m', gdzie pierwszy %dto 0 lub 41, a %sjest to znak, który chcemy wydrukować.


Dla koloru mamy następującą formułę:

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

Nie zamierzam tego w pełni wyjaśnić, ale w zasadzie zapętla się nad wszystkimi prostokątami, które powinny być zabarwione na czerwono, i sprawdza, czy (x, y)jest w którymkolwiek z nich.

Zwróć uwagę na użycie łańcucha operatora: przepisałem -1<A<5 and -1<B<3na 5>A>-1<B<3.


Dla postaci mamy następującą formułę:

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

Jeśli y % 2 == 0następnie na x = 0, 1, …ten wygeneruje+---+---+---…

Jeśli y % 2 == 1następnie na x = 0, 1, …ten wygeneruje| p |p+1|p+2…

Lynn
źródło
2
Któregoś dnia będzie wyzwanie, w którym musisz użyć dosłownie ♥ w kodzie, a wszyscy będą zdezorientowani;)
FryAmTheEggman
Chciałbym zobaczyć wyjaśnienie.
shaunakde
@shaunakde Napisałem coś (ale zapisałem trochę bajtów, więc może trochę trudniej było śledzić… ^^)
Lynn
1
@ Lynn Dziękuję bardzo za poświęcenie czasu i energii na wyjaśnienie tego kodu. Jestem bardzo wdzięczny za to wyjaśnienie. To pomogło mi wiele się nauczyć!
shaunakde
1
Nie ma za co! :)
Lynn
4

Julia, 219 182 169 167 bajtów

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

Używany w ten sposób: !7

Nie golfowany:

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

Zauważ, że jest to bardzo wolne pole golfowe, dla maksymalnej czytelności.

Glen O
źródło
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
źródło