Seratus Kotak!

10

Kembali ke dasar...

Sebagai seorang guru di sekolah dasar (kelas?) Setempat, Anda perlu cara untuk mengajar kelas Anda tabel waktu mereka. Yang Anda inginkan, Anda memiliki seratus kotak dan banyak pena merah. Anda juga harus dapat menunjukkan kepada kelas Anda jawaban yang benar dengan cepat.

Sekarang, Anda cukup pintar untuk menulis sebuah program yang dapat membuat tabel waktu, tetapi dapatkah Anda menggambarnya di atas seratus kotak?

Tantangan

Keluarkan seratus kuadrat ke stdout atau setara dengan menggunakan kode ansi-escape ke naungan dalam angka yang merupakan kelipatan dari input.

  • Keluarkan kisi 10x10 yang berisi angka 1-100.
    • Tidak masalah penyelarasan 2 digit angka di setiap kotak asalkan konsisten
    • Untuk 1 angka angka, Anda dapat membuat 2 digit dan menggunakan format yang sama dengan angka 2 digit atau berada di tengah kotak.
  • Jika nomor dalam kotak adalah kelipatan dari input, warnai seluruh kotak merah.
    • Ini berarti seluruh kotak, bukan hanya bagian nomor

Misalnya, diberi input 3, cetak seratus persegi yang diberikan

ratus persegi 3

Ini adalah kode golf sehingga jawaban tersingkat dalam byte menang!

Biru
sumber
2
Bisakah kita mencetak 01 bukannya 1. 02 untuk 2, dll.
Keatinge
1
Jadi saya tidak bisa menggunakan <table>, misalnya?
nicael
1
Apakah warna angka itu penting? Apakah bisa whiteatau tidak grey?
Bassdrop Cumberwubwubwub
1
@Keatinge saya belum memutuskan - Saya membelok ke arah ya @nicael tidak, itu harus menggunakan ansi-escapes atau jawaban tidak akan berada di lapangan bermain yang sama, @BassdropCumberwubwubwub Anda dapat menggunakan warna yang berbeda tetapi kecuali jika Anda ' kembali menggunakannya cursesseharusnya tidak masalah - merah itu pendek.
Biru
@Keatinge ya Anda dapat menggunakan padding - tetapi hanya dengan nol dan satu digit angka saja
Biru

Jawaban:

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

Ganti dengan oktal 033(karakter pelarian ANSI).

masukkan deskripsi gambar di sini

Penjelasan

Kami memperlakukan output sebagai 41×21kisi, dan langsung menghitung karakter dan warna di setiap titik.

Artinya, struktur kodenya adalah:

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

untuk beberapa fungsi F.

Hasil Fselalu dari bentuk berikut:

  • Pengenal Sequence Control ANSI ( \33[).
  • Sebuah kode SGR : 0muntuk reset, atau 41muntuk latar belakang merah.
  • Satu karakter. ( +, -, |, Ruang, atau digit)
  • Urutan reset SGR ( \33[m).

Kami menggunakan string format '\33[%dm%s\33[m', di mana yang pertama %dadalah 0 atau 41, dan %sadalah karakter yang ingin kita cetak.


Untuk warna , kami memiliki rumus berikut:

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

Saya tidak akan sepenuhnya menjelaskan hal ini, tetapi pada dasarnya loop atas semua persegi panjang yang harus diwarnai merah, dan memeriksa apakah (x, y)ada di dalamnya.

Perhatikan penggunaan chaining Operator: Saya menulis ulang -1<A<5 and -1<B<3ke 5>A>-1<B<3.


Untuk karakter , kami memiliki rumus berikut:

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

Jika y % 2 == 0kemudian untuk x = 0, 1, …ini akan menghasilkan+---+---+---…

Jika y % 2 == 1kemudian untuk x = 0, 1, …ini akan menghasilkan| p |p+1|p+2…

Lynn
sumber
2
Suatu hari, akan ada tantangan di mana Anda benar-benar perlu menggunakan ♥ literal dalam kode, dan semua orang akan bingung;)
FryAmTheEggman
Senang melihat penjelasan.
shaunakde
@shaunakde Saya menulis sesuatu (tetapi menyelamatkan beberapa byte dalam proses, jadi mungkin itu juga menjadi sedikit lebih sulit untuk diikuti ... ^^)
Lynn
1
@ Lynn Terima kasih banyak telah meluangkan waktu dan energi untuk menjelaskan kode ini. Saya sangat berterima kasih atas penjelasan ini. Itu membantu saya belajar banyak!
shaunakde
1
Sama-sama! :)
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)

Digunakan seperti ini: !7

Tidak Disatukan:

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

Perhatikan bahwa ini sangat ungolfed, untuk keterbacaan maksimal.

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