Сто квадратов!

10

Вернуться к основам...

Как учитель в местной начальной (начальной?) Школе, вам нужен способ учить свой класс своим временным таблицам. В вашем распоряжении 100 квадратов и множество красных ручек. Вы также должны быть в состоянии быстро показать классу правильные ответы.

Теперь вы достаточно умны, чтобы написать программу, которая умеет делать временные таблицы, но можете ли вы нарисовать их на сотне квадратов?

Соревнование

Выведите сто квадратов в стандартный вывод или эквивалент, используя коды ANSI-Escape, чтобы заштриховать числа, кратные вводу.

  • Выведите сетку 10x10, содержащую числа 1-100.
    • Это не имеет значения выравнивания 2-значных чисел в каждом поле, если оно является последовательным
    • Для однозначных чисел вы можете заполнить до двухзначного числа и использовать то же форматирование, что и для двухзначных чисел или по центру в середине поля.
  • Если число в блоке кратно вводу, закрасьте весь блок красным.
    • Это означает, что вся коробка, а не только часть номера

Например, с учетом ввода 3выведите заданную сотню

сто квадрат 3

Это код гольф, поэтому выигрывает самый короткий ответ в байтах!

синий
источник
2
Можем ли мы напечатать 01 вместо 1,0 для 2 и т. Д. И т. Д.
Keatinge
1
Так я не могу использовать <table>, например?
Никель
1
Цвет чисел имеет значение? Это может быть whiteили grey?
Bassdrop Cumberwubwubwub
1
@Keatinge Я еще не решил - я поворачиваюсь к да @nicael нет, он должен использовать ANSI-Escape, иначе ответы не должны быть на одном игровом поле, @BassdropCumberwubwubwub вы можете использовать разные цвета, но если вы не ' cursesего использование не должно иметь значения - красный в любом случае короткий.
Blue
@Keatinge да, вы можете использовать отступы - но только с нулями и только одним однозначным числом
Blue

Ответы:

8

Python 2, 166 байт

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

Заменить на восьмеричное 033(экранирующий символ ANSI).

введите описание изображения здесь

объяснение

Мы рассматриваем вывод как 41×21сетку и непосредственно вычисляем символ и цвет в каждой точке.

То есть структура кода:

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

для какой-то функции F.

Результат Fвсегда имеет следующую форму:

Мы используем строку формата '\33[%dm%s\33[m', где первым %dявляется либо 0, либо 41, и %sэто символ, который мы хотим напечатать.


Для цвета у нас есть следующая формула:

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

Я не собираюсь полностью объяснять это, но он в основном перебирает все прямоугольники, которые должны быть окрашены в красный цвет, и проверяет, (x, y)находится ли внутри какой-либо из них.

Обратите внимание на использование цепочки операторов: я переписал -1<A<5 and -1<B<3в 5>A>-1<B<3.


Для персонажа у нас есть следующая формула:

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

Если y % 2 == 0тогда для x = 0, 1, …этого будет генерировать+---+---+---…

Если y % 2 == 1тогда для x = 0, 1, …этого будет генерировать| p |p+1|p+2…

Линн
источник
2
На днях возникнет проблема, когда вам действительно потребуется использовать литерал ♥ в коде, и все будут в замешательстве;)
FryAmTheEggman
Хотелось бы увидеть объяснение.
Shaunakde
@shaunakde Я что-то написал (но сохранил несколько байтов в процессе, так что, может быть, ему стало немного сложнее следить… ^^)
Линн
1
@Lynn Большое спасибо, что нашли время и силы, чтобы объяснить этот код. Я очень благодарен за это объяснение. Это помогло мне многому научиться!
shaunakde
1
Всегда пожалуйста! :)
Линн
4

Юлия, 219 182 169 167 байт

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

Используется так: !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

Обратите внимание, что это очень просто, для максимальной читабельности.

Глен О
источник
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.

Вашингтон Гуэдес
источник