Yüz Kareler!


10

Temellere dönüş...

Yerel ilkokulda (sınıf?) Bir öğretmen olarak, sınıfınıza zaman çizelgelerini öğretmenin bir yoluna ihtiyacınız vardır. Emrinizde, yüz kareniz ve bir sürü kırmızı kaleminiz var. Ayrıca sınıfınıza doğru cevapları hızlı bir şekilde gösterebilmeniz gerekir.

Şimdi, zaman çizelgeleri yapabilen bir program yazmak için yeterince akıllısınız, ancak bunları yüz kareye çizebilirsiniz?

Meydan okuma

Girişin katları olan sayılarla gölgelemek için ansi-escape kodlarını kullanarak stdout veya eşdeğerine yüz karesi çıktılayın .

  • 1-100 sayılarını içeren bir 10x10 ızgara çıktı.
    • Tutarlı olduğu sürece her kutuda 2 basamaklı sayının hizalanması önemli değildir
    • 1 basamaklı sayılar için 2 basamağa dolgu yapabilir ve 2 basamaklı sayılarla aynı biçimlendirmeyi kullanabilir veya kutunun ortasında ortalayabilirsiniz.
  • Kutudaki sayı girişin katlarıysa, kutunun tamamını kırmızı renklendirin.
    • Bu, sadece sayı kısmı değil, tüm kutu anlamına gelir

Örneğin, girdi 3verildiğinde, verilen yüz karesini yazdırın

yüz kare 3

Bu kod golf yani bayt en kısa cevap kazanır!


2
01 yerine 01 yerine 01 yazdırabilir miyiz? Vb. İçin
02.

1
<table>Mesela kullanamıyorum ?
nicael

1
Sayıların rengi önemli mi? O olabilir whiteveya grey?
Bassdrop Cumberwubwubwub

1
@Keatinge Henüz karar vermedim - evet @nicael'e doğru yöneldim hayır, ansi-kaçışları kullanmalı veya cevaplar aynı oyun alanında olmayacaktı, @BassdropCumberwubwubwub farklı renkler kullanabilirsiniz, ancak ' cursesonu kullanmak önemli değil - kırmızı zaten kısa.
Mavi

@Keatinge evet dolgu kullanabilirsiniz - ancak sadece sıfırlar ve yalnızca bir rakamlı sayılarla
Blue

Yanıtlar:


8

Python 2, 166 bayt

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

Sekizli ile değiştirin 033(ANSI kaçış karakteri).

resim açıklamasını buraya girin

açıklama

Çıktıya 41×21ızgara olarak davranır ve her noktada karakteri ve rengi doğrudan hesaplarız.

Yani, kodun yapısı:

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

bazı işlevler için F.

Sonucu Fher zaman aşağıdaki biçimdedir:

  • Bir ANSI Kontrol Dizisi Tanıtıcısı ( \33[).
  • Bir SGR kodu : 0msıfırlama veya 41mkırmızı arka plan için.
  • Tek bir karakter. ( +, -, |, Boşluk veya basamak)
  • Bir SGR sıfırlama dizisi ( \33[m).

'\33[%dm%s\33[m'Birincisi %d0 veya 41 olan ve %syazdırmak istediğimiz karakter olan biçim dizesini kullanırız .


İçin renk , aşağıdaki formüle sahiptir:

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

Bunu tam olarak açıklamayacağım, ancak temelde kırmızı renkte olması gereken tüm dikdörtgenlerin üzerinden geçiyor ve (x, y)bunların içinde olup olmadığını kontrol ediyor .

Operatör zincirleme kullanımına dikkat: Ben yazdım -1<A<5 and -1<B<3içine 5>A>-1<B<3.


İçin karakteri , aşağıdaki formüle sahiptir:

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

Eğer y % 2 == 0daha sonra x = 0, 1, …bu üretecektir+---+---+---…

Eğer y % 2 == 1daha sonra x = 0, 1, …bu üretecektir| p |p+1|p+2…


2
Bu günlerden birinde, kodda gerçek bir ♥ kullanmanız gereken bir zorluk olacak ve herkes
karışacak

Bir açıklama görmek isterim.
shaunakde

@shaunakde Bir şey yazdım (ancak süreçte bazı baytlar kurtardım, bu yüzden belki de takip etmek biraz zorlaştı… ^^)
Lynn

1
@Lynn Bu kodu açıklamak için zaman ve enerji harcadığınız için çok teşekkür ederim. Bu açıklama için çok minnettarım. Çok şey öğrenmeme yardımcı oldu!
shaunakde

1
Çok rica ederim! :)
Lynn

4

Julia 219 182 169 167 bayt

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

Bunun gibi kullanılır: !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

Maksimum okunabilirlik için bunun çok rahat olmadığını unutmayın .


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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.