Планета Торус

Планета Торус имеет тороидальную поверхность. Если эту поверхность развернуть (спроецировать) на плоскость в координатах Меркадота, то страны на этой карте будут выглядеть как ячейки “таблицы” с числом столбцов равным 7. Согласно 28-ричной системе исчисления, принятой на планете, страны именуются следующим образом:

T00T01T06
T10T11T16
TA0TA1TA6
TR0TR1TR6

Меркадот – знаменитый путешественник и картограф, живший в стране T00 и разработавший карты планеты, наименее искажающие углы и расстояния. Все страны на Торусе примерно равноправны с точки зрения топологии, поэтому Меркадот разработал единую систему карт для планеты Торус. В этой системе схема карты для страны TR6, например, выглядит следующим образом:

TR6TR0TR5
T06T00T05
TQ6TQ0TQ5

В силу особенностей тороидальной поверхности оказывается, что страна T00, как и всякая другая страна на планете, граничит с 8-ю другими странами, а вовсе не с тремя.

На Торусе для обозначения соседних стран используются единообразные аббревиатуры. Так, например, в стране T00 о стране TR0 всегда говорили как о северном (NN) соседе, о TR6 как о северо-западном (NW) соседе и так далее (следуя против хода часовой стрелки). Подобным образом (NN, NW, WW, SW, SS, SE, EE, NE) обозначают своих соседей и другие страны. Возможно, это связано с направлением магнитных полей планеты.

В результате развития цивилизации в торусианской галактике было обнаружено немало тороидальных планет, названия которых имеют следующие обозначения в астрономическом каталоге: Torus MxN, M - число областей по вертикали (широте), а N - число областей по горизонтали (долготе), т.е. общее число областей на такой планете равно MxN. При этом области не всегда представляют собой страны, как это имеет место на планете Торус, которая в данной классификации обозначается как Torus 28x7.

До последнего времени самой большой (по числу областей) из обнаруженных планет являлся Torus 36x36. Для описания ее топологии торусианцы придумали 36-ричную математическую систему исчисления BASE 36. Согласно этой системе, области на Торус 36x36 имеют аббревиатуры от T00 до TZZ.

С тех пор как среди участников соревнований на сайте sql-ex.ru появились торусианцы, стала доступной новая информация об их галактике Лорус (Lorus). Например, оказалось, что Torus 36x36 - не самая большая планета этой системы. В целях культурного обмена, немало фактологических данных из исторических хроник Torus было занесено в основные и проверочные базы сайта (Painting, Ships и прочих).

Из условий задач на sql-ex становится известным, что единицей длины на Торусе является торометр, а единой валютой – торобакс. Основой жизни там является вода и ее разновидность – лед. В условиях задач приводятся основные сведения о физико-химических характеристиках, экономических и политических системах планет Torus MxN.

Рассмотрим задачу про Торус, в которой мы вообще не будем привязываться ни к одной из “обычных” баз, и предложим следующее “универсальное” условие.

Соседние страны на Торусе 3x7

Для каждой из стран планеты Торус 3x7:
T00    T01    …    T06
T10    T11    …    T16
T20    T21    …    T26
найти список всех соседних стран, с которыми она имеет границу ненулевой длины. Решение привести в виде таблицы из пяти колонок: [State] [NN] [WW] [SS] [EE].

Подсказка. Вот как выглядит ответ для обычного (нетороидального) случая.

StateNNWWSSEE
T00NULLNULLT10T01
T01NULLT00T11T02
T02NULLT01T12T03
T03NULLT02T13T04
T04NULLT03T14T05
T05NULLT04T15T06
T06NULLT05T16NULL
T10T00NULLT20T11
T11T01T10T21T12
T12T02T11T22T13
T13T03T12T23T14
T14T04T13T24T15
T15T05T14T25T16
T16T06T15T26NULL
T20T10NULLNULLT21
T21T11T20NULLT22
T22T12T21NULLT23
T23T13T22NULLT24
T24T14T23NULLT25
T25T15T24NULLT26
T26T16T25NULLNULL

Решение для тороидального случая.

select  
 'T'+cast(i  as varchar)+cast(j  as varchar) [State]  
,'T'+cast(k1 as varchar)+cast(j1 as varchar) [NN]  
,'T'+cast(i2 as varchar)+cast(k2 as varchar) [WW]  
,'T'+cast(k4 as varchar)+cast(j4 as varchar) [SS]  
,'T'+cast(i3 as varchar)+cast(k3 as varchar) [EE]  
from (select j=0 union all select 1 union all select 2 union all select 3 union all   
         select 4 union all select 5 union all select 6)J  
cross join (select i=0 union all select 1 union all select 2)I  
cross apply(select i1=i-1,j1=j,i2=i,j2=j-1,i3=i,j3=j+1,i4=i+1,j4=j)D  
cross apply(select  
 k1=case when i1<0 then 2 else i1 end  
,k2=case when j2<0 then 6 else j2 end  
,k3=case when j3>6 then 0 else j3 end  
,k4=case when i4>2 then 0 else i4 end  
)E;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Правильный ответ:

StateNNWWSSEE
T00T20T06T10T01
T01T21T00T11T02
T02T22T01T12T03
T03T23T02T13T04
T04T24T03T14T05
T05T25T04T15T06
T06T26T05T16T00
T10T00T16T20T11
T11T01T10T21T12
T12T02T11T22T13
T13T03T12T23T14
T14T04T13T24T15
T15T05T14T25T16
T16T06T15T26T10
T20T10T26T00T21
T21T11T20T01T22
T22T12T21T02T23
T23T13T22T03T24
T24T14T23T04T25
T25T15T24T05T26
T26T16T25T06T20