Hundert Quadrate!


10

Zurück zum Wesentlichen...

Als Lehrer an der örtlichen Grundschule (Grundschule?) Müssen Sie Ihrer Klasse die Stundenpläne beibringen. Zu Ihrer Verfügung stehen hundert Quadrate und eine Ladung roter Stifte. Sie müssen auch in der Lage sein, Ihrer Klasse schnell die richtigen Antworten zu zeigen.

Jetzt sind Sie klug genug, um ein Programm zu schreiben, das Stundenpläne erstellen kann, aber können Sie sie auf hundert Quadrat zeichnen?

Die Herausforderung

Geben Sie ein Hundert Quadrat nach Standard oder gleichwertig aus, indem Sie Ansi-Escape-Codes verwenden, um Zahlen zu schattieren, die ein Vielfaches der Eingabe sind.

  • Geben Sie ein 10x10-Raster mit den Zahlen 1-100 aus.
    • Die Ausrichtung von 2-stelligen Zahlen in jedem Feld spielt keine Rolle, solange es konsistent ist
    • Bei 1-stelligen Zahlen können Sie auf 2 Stellen auffüllen und dieselbe Formatierung wie bei 2-stelligen Zahlen verwenden oder in der Mitte des Felds zentrieren.
  • Wenn die Zahl in der Box ein Vielfaches der Eingabe ist, färben Sie die gesamte Box rot.
    • Dies bedeutet die ganze Box, nicht nur den Zahlenteil

3Drucken Sie beispielsweise bei gegebener Eingabe das angegebene Hundertquadrat

hundert Quadratmeter 3

Dies ist Code Golf, also gewinnt die kürzeste Antwort in Bytes!


2
Können wir 01 anstelle von 1. 02 für 2 usw. usw. drucken
Keatinge

1
Also kann ich <table>zum Beispiel nicht verwenden ?
Nicael

1
Ist die Farbe der Zahlen wichtig? Kann es sein whiteoder grey?
Bassdrop Cumberwubwubwub

1
@Keatinge Ich habe mich noch nicht entschieden - ich drehe mich in Richtung Ja @nicael Nein, es muss Ansi-Escape verwenden oder Antworten würden nicht auf dem gleichen Spielfeld sein, @BassdropCumberwubwubwub Sie können verschiedene Farben verwenden, aber es sei denn, Sie ' Die Wiederverwendung cursessollte keine Rolle spielen - Rot ist sowieso kurz.
Blue

@Keatinge ja, Sie können Padding verwenden - aber nur mit Nullen und nur einstelligen Zahlen
Blue

Antworten:


8

Python 2, 166 Bytes

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

Durch Oktal ersetzen 033(das ANSI-Escape-Zeichen).

Geben Sie hier die Bildbeschreibung ein

Erläuterung

Wir behandeln die Ausgabe als 41×21Raster und berechnen direkt das Zeichen und die Farbe an jedem Punkt.

Das heißt, die Struktur des Codes ist:

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

für eine Funktion F.

Das Ergebnis von Fhat immer die folgende Form:

  • Ein ANSI Control Sequence Introducer ( \33[).
  • Ein SGR-Code : 0mzum Zurücksetzen oder 41mfür roten Hintergrund.
  • Ein einzelnes Zeichen. ( +, -, |, Raum oder Zahl)
  • Eine SGR-Rücksetzsequenz ( \33[m).

Wir verwenden die Formatzeichenfolge '\33[%dm%s\33[m', wobei die erste %dentweder 0 oder 41 ist und %sdas Zeichen ist, das wir drucken möchten.


Für die Farbe haben wir folgende Formel:

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

Ich werde dies nicht vollständig erklären, aber es durchläuft im Grunde alle Rechtecke, die rot gefärbt sein sollten, und prüft, ob sie (x, y)sich in einem von ihnen befinden.

Beachten Sie die Verwendung von Operator Verkettungs: Ich schrieb -1<A<5 and -1<B<3in 5>A>-1<B<3.


Für den Charakter haben wir die folgende Formel:

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

Wenn y % 2 == 0dann x = 0, 1, …dafür generiert wird+---+---+---…

Wenn y % 2 == 1dann x = 0, 1, …dafür generiert wird| p |p+1|p+2…


2
Eines Tages wird es eine Herausforderung geben, bei der Sie tatsächlich ein wörtliches ♥ im Code verwenden müssen, und jeder wird verwirrt sein;)
FryAmTheEggman

Würde gerne eine Erklärung sehen.
Shaunakde

@shaunakde Ich habe etwas aufgeschrieben (aber dabei einige Bytes gespeichert, so dass es vielleicht auch etwas schwieriger wurde zu folgen ... ^^)
Lynn

1
@Lynn Vielen Dank, dass Sie sich die Zeit und Energie genommen haben, diesen Code zu erklären. Ich bin sehr dankbar für diese Erklärung. Es hat mir geholfen, viel zu lernen!
Shaunakde

1
Gern geschehen! :)
Lynn

4

Julia, 219 182 169 167 Bytes

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

So verwendet: !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

Beachten Sie, dass dies für maximale Lesbarkeit sehr ungolfed ist.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.