Намалюйте порожню дошку для скрабу


28

Стандартна дошка Scrabble - це сітка розміром 15 × 15 для розміщення літерних плиток. Більшість пробілів є порожніми, але деякі - подвійні оцінки слів (рожевий), потрійні оцінки балів (червоний), подвійні літери (світло-синій) та потрійні літери (синій). Зазвичай в самому центрі є зірка (яка рахується як подвійна оцінка слів).

Дошка для скрабу

Напишіть програму або функцію, яка видає стандартну порожню дошку Scrabble у формі ASCII, де:

  • . представляє порожній простір

  • D являє собою подвійну оцінку слів

  • T являє собою потрійну оцінку слів

  • d представляє подвійну літерну оцінку

  • t представляє потрійну літерну оцінку

  • X являє собою центральну зірку

Тобто ваш точний вихід повинен бути

T..d...T...d..T
.D...t...t...D.
..D...d.d...D..
d..D...d...D..d
....D.....D....
.t...t...t...t.
..d...d.d...d..
T..d...X...d..T
..d...d.d...d..
.t...t...t...t.
....D.....D....
d..D...d...D..d
..D...d.d...D..
.D...t...t...D.
T..d...T...d..T

необов'язково супроводжуватиметься новим рядком.

Виграє найкоротший код у байтах.


Чому Xі не *представляти зірку? : o
Фаталізувати

6
*занадто високий і могутній.
Захоплення Кальвіна

Чому ні ? : D
mbomb007

5
@ mbomb007 Не-ASCII char в ASCII-мистецтві викликом? Єресь !
Луїс Мендо

Відповіді:


16

MATL , 59 54 52 байти

4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)

Спробуйте в Інтернеті!

Пояснення

Код має три основні етапи:

  1. Створіть матрицю 8х8

    4 0 0 3 0 0 0 4
    0 1 0 0 0 2 0 0
    0 0 1 0 0 0 3 0
    3 0 0 1 0 0 0 3
    0 0 0 0 1 0 0 0
    0 2 0 0 0 2 0 0
    0 0 3 0 0 0 3 0
    4 0 0 3 0 0 0 5
    
  2. Розкладіть його до матриці розміром 15х15

    4 0 0 3 0 0 0 4 0 0 0 3 0 0 4
    0 1 0 0 0 2 0 0 0 2 0 0 0 1 0
    0 0 1 0 0 0 3 0 3 0 0 0 1 0 0
    3 0 0 1 0 0 0 3 0 0 0 1 0 0 3
    0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
    0 2 0 0 0 2 0 0 0 2 0 0 0 2 0
    0 0 3 0 0 0 3 0 3 0 0 0 3 0 0
    4 0 0 3 0 0 0 5 0 0 0 3 0 0 4
    0 0 3 0 0 0 3 0 3 0 0 0 3 0 0
    0 2 0 0 0 2 0 0 0 2 0 0 0 2 0
    0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
    3 0 0 1 0 0 0 3 0 0 0 1 0 0 3
    0 0 1 0 0 0 3 0 3 0 0 0 1 0 0
    0 1 0 0 0 2 0 0 0 2 0 0 0 1 0
    4 0 0 3 0 0 0 4 0 0 0 3 0 0 4
    
  3. Індексуйте рядок за 'DtdTX.'допомогою цієї матриці, щоб отримати бажаний результат.

Крок 1

4        % Push 4
t:       % Duplicate, range: pushes [1 2 3 4]
g        % Logical: convert to [1 1 1 1]
2I5      % Push 2, then 3, then 5
v        % Concatenate all stack vertically into vector [4 1 1 1 1 2 3 5]
Xd       % Generate diagonal matrix from that vector

Тепер нам потрібно заповнити ненульові позадіагональні записи. Ми заповнимо лише ті, що знаходяться нижче діагоналі, а потім використаємо симетричність для заповнення інших.

Для заповнення кожного значення використовуємо лінійну індексацію (див. Цю відповідь , фрагмент довжини-12). Це означає отримати доступ до матриці так, ніби вона має лише один вимір. Для матриці 8 × 8 кожне значення лінійного індексу посилається на запис таким чином:

1   9         57
2  10         58
3  11
4  
5  ...       ...
6  
7             63
8  16 ... ... 64

Отже, наступне присвоює значення 4 нижньому лівому запису:

K        % Push 4
8        % Push 8
(        % Assign 4 to the entry with linear index 8

Код для значення 3 аналогічний. У цьому випадку індекс є вектором, тому що нам потрібно заповнити кілька записів:

3        % Push 3
K        % Push 4
23h      % Push 23 and concatenate horizontally: [4 23]
32h      % Push 32 and concatenate horizontally: [4 23 32]
(        % Assign 4 to the entries specified by that vector

І для 2:

H        % Push 2
14       % Push 14
(        % Assign 2 to that entry

Тепер у нас є матриця

4 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
3 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 2 0 0 0 2 0 0
0 0 3 0 0 0 3 0
4 0 0 3 0 0 0 5

Для заповнення верхньої половини ми використовуємо симетрію:

t!       % Duplicate and transpose
XR       % Keep the upper triangular part without the diagonal
+        % Add element-wise

Крок 2

Тепер стек містить матрицю 8 × 8, отриману в результаті кроку 1. Для розширення цієї матриці ми використовуємо індексацію, на цей раз у двох вимірах.

8:       % Push vector [1 2 ... 7 8]
7:P      % Push vector [7 6 ... 1]
h        % Concatenate horizontally: [1 2 ... 7 8 7 ... 2 1]. This will be the row index
t        % Duplicate. This will be the column index
3$       % Specify that the next function will take 3 inputs
)        % Index the 8×8 matrix with the two vectors. Gives a 15×15 matrix

Крок 3

Тепер стек містить матрицю 15 × 15, отриману в результаті кроку 2.

'DtdTX.' % Push this string
w        % Swap the two elements in the stack. This brings the matrix to the top
)        % Index the string with the matrix

Це справді, справді, круто.
AdmBorkBork

Мені ця відповідь взагалі подобається, хоча вона трохи «свербить», коли ви використовуєте 8 символів для створення вектора довжиною 8. Чи розглядали ви отримання чисел математичною послідовністю? Не знайшли нічого солодкого, але особливо останні 7 показують такий приємний малюнок. Наприклад, ceil ((1: 7) ^
4/500

@DennisJ Дякую! Так, це занадто багато. Я спробую це пізніше, по телефону зараз
Луїс Мендо

8

Рубі, 103 97 байт

Дякую Мітчу Шварцу за 6-байтне покращення ітерацій.

a=(-7..7).map &:abs
a.map{|i|puts a.map{|j|(d=i%7-j%7)%4<1?'X d t DTDdDdDtT d'[i+j+d*d/3]:?.}*''}

Аналогічний, але суттєво інший підхід до моєї початкової відповіді нижче. Як і раніше, ми використовуємо той факт, що літера повинна бути надрукована, якщо i%7-j%7вона дорівнює 0 або 4. Але тут ми зберігаємо цю різницю dі використовуємо формулу, i+j+d*d/3щоб дати ціле число, яке є унікальним (до симетрії), до цього конкретного кольорового квадрата. Тоді ми просто дивимося це в чарівну струну.

Просто для розваги: C версія цього підходу, 120 байт

z,i,j,d;f(){for(z=240;z--;)i=abs(z%16-8),j=abs(z/16-7),putchar(i-8?(d=i%7-j%7)%4?46:"X d t DTDdDdDtT d"[i+j+d*d/3]:10);}

Рубі, 115 113 байт

2 байти збережено завдяки Value Ink.

(k=-7..7).map{|y|k.map{|x|i=x.abs;j=y.abs
$><<=(i%7-j%7)%4<1?"#{'XdTdT'[(i+j)/3]}dtDDDD"[[i%7,j%7].min]:?.}
puts}

Пояснення

Походження вважається центром дошки.

Буква повинна бути надрукована, якщо координати x і y мають величину, однакові або відрізняються на 4. Єдині винятки є на зовнішньому краю дошки, але вони відповідають тому ж шаблону, що і центральний рядок / стовпець борту, тому ми можемо використовувати ту саму умову, якщо взяти координати x і y по модулю 7.

Вибір відображеної літери базується на координаті мінімальної величини. Таким чином, парні та трійні точки (1,5) та (2,6) виконують те саме правило, що й у (1,1) та (2,2), і отримуються із рядка 7 символів. "#{formula}dtDDDD"Це не охоплює всіх варіацій для квадратів ребра та середньої лінії, тому перший символ рядка обчислюється за формулою 'XdTdT'[(i+j)/3].

(k=-7..7).map{|y|
  k.map{|x|
    i=x.abs;j=y.abs
    print (i%7-j%7)%4<1?      #IF this expression is true print a letter 
    "#{'XdTdT'[(i+j)/3]       #select 1st character of magic string where [i%7,j%7].min==0 
     }dtDDDD"[[i%7,j%7].min]: #remaining 6 characters of magic string for diagonal
    ?.                        #ELSE print .
  }
  puts                        #at the end of the row print a newline
}

(k=-7..7).map{|y|k.map{...на 2 байти коротше, ніж ваша подвійна -7.upto(7)техніка.
Значення чорнила

Кілька модифікацій, щоб зберегти 6 байт:a=(-7..7).map &:abs;a.map{|i|puts a.map{|j|(d=i%7-j%7)%4<1?'X d t DTDdDdDtT d'[i+j+d*d/3]:?.}*''}
Мітч Шварц

7

мозковий ебать , 598 596 590 байт

Поради щодо гольфу вітаються.

>-[++++[<]>->+]<[>++++>+++++>+++>++<<<<-]>[>>>>+>+>+<<<<<<-]<++++++++++[>+>>>>+>-<<<<<<-]>>+>->>-->++.<<..>.<...>>.<<...>.<..>>.<<<<<.>>>.<.>...<<.>>...<<.>>...<.>.<<<.>>>..<.>...>.<.>.<...<.>..<<<.>>>>.<..<.>...>.<...<.>..>.<<<<.>>>....<.>.....<.>....<<<.>>>.<<.>>...<<.>>...<<.>>...<<.>>.<<<.>>>..>.<...>.<.>.<...>.<..<<<.>>>>>.<<..>.<...>>>----.<<<...>.<..>>.<<<<<.>>>..>.<...>.<.>.<...>.<..<<<.>>>.<<.>>...<<.>>...<<.>>...<<.>>.<<<.>>>....<.>.....<.>....<<<.>>>>.<..<.>...>.<...<.>..>.<<<<.>>>..<.>...>.<.>.<...<.>..<<<.>>>.<.>...<<.>>...<<.>>...<.>.<<<.>>>>>.<<..>.<...>>.<<...>.<..>>.

Пояснення

Ініціалізуйте стрічку до [10 116 68 46 100 84 92], тобто [nl t D. d T \]

>-[++++[<]>->+]<[>++++>+++++>+++>++<<<<-]>[>>>>+>+>+<<<<<<-]<++++++++++[>+>>>>+>-<<<<<<-]>>+>->>-->++

Кожен рядок тут друкує один рядок дошки.
Середня лінія також зменшується92 to 88 i.e. \ to X

.<<..>.<...>>.<<...>.<..>>.<<<<<.
>>>.<.>...<<.>>...<<.>>...<.>.<<<.
>>>..<.>...>.<.>.<...<.>..<<<.
>>>>.<..<.>...>.<...<.>..>.<<<<.
>>>....<.>.....<.>....<<<.
>>>.<<.>>...<<.>>...<<.>>...<<.>>.<<<.
>>>..>.<...>.<.>.<...>.<..<<<.
>>>>>.<<..>.<...>>>----.<<<...>.<..>>.<<<<<.
>>>..>.<...>.<.>.<...>.<..<<<.
>>>.<<.>>...<<.>>...<<.>>...<<.>>.<<<.
>>>....<.>.....<.>....<<<.
>>>>.<..<.>...>.<...<.>..>.<<<<.
>>>..<.>...>.<.>.<...<.>..<<<.
>>>.<.>...<<.>>...<<.>>...<.>.<<<.
>>>>>.<<..>.<...>>.<<...>.<..>>.

Спробуйте в Інтернеті!


1
Поради для BF: не асциі гольфу в BF; приємна стратегія, хоча.
Чарівний восьминога Урна

5

PowerShell v2 +, 147 байт

($x='T..d...T...d..T')
($y='.D...t..','..D...d.','d..D...d','....D...','.t...t..','..d...d.'|%{$_+-join$_[6..0]})
$x-replace'.T.','.X.'
$y[5..0]
$x

Користується тим, як за замовчуванням Write-Outputв кінці виконання програми обробляє масиви (тобто, вона вставляє новий рядок між елементами). Можливо, це буде кращим способом генерувати середину дошки - я все ще працюю над цим.

Перший рядок виводить верхню лінію плати, також зберігаючи її $xдля використання пізніше.

Наступний рядок генерує всі рядки Double-Word, беручи ліву "половину" кожного, відображаючи їх ( -join$_[6..0]оператор) та зберігаючи їх як елементи в масиві $y.

Наступний рядок - середній ряд, з Xсерединою, завдяки -replace.

Наступний рядок виводиться $yу зворотному порядку, даючи нам нижні рядки Double-Word.

Фінальний рядок лише $xзнову.

PS C:\Tools\Scripts\golfing> .\draw-empty-scrabble-board.ps1
T..d...T...d..T
.D...t...t...D.
..D...d.d...D..
d..D...d...D..d
....D.....D....
.t...t...t...t.
..d...d.d...d..
T..d...X...d..T
..d...d.d...d..
.t...t...t...t.
....D.....D....
d..D...d...D..d
..D...d.d...D..
.D...t...t...D.
T..d...T...d..T

5

> <> (Риба), 153 байт

\!o;!?l
\'T..d...T...d..T'a'.D...t...t...D.'a'..D...d.d...D..'a'd..D...d...D..d'a'....D.....D....'a'.t...t...t...t.'a'..d...d.d...d..'a'T..d...'
\'X/'02p

Жахливий, жахливо, неефективний спосіб робити речі. В даний час розглядаються способи вкорочення його, відображаючи як горизонтально, так і вертикально правильно.

Спробуйте в Інтернеті! (Якщо ви не хочете бути там цілий день, переконайтеся, що ви або встановили швидкість виконання максимум, або запустили без анімації.)


4

С, 146 145 142 138 байт

i,r,c;main(){for(;i<240;)r=abs(i/16-7),c="T..12..0..12..0"[r+7-abs(i%16-7)],putchar(++i%16?c&4?c:"Xd.dd.tt.D..D.dD.dD.tTd."[c%4+r*3]:10);}

Спробуйте в Інтернеті!

1 байт збережено 5 байтів завдяки Level River St

Це використовує діагональну схему плати для кодування. Зокрема, якщо ми візьмемо лівий верхній квадрант дошки і вирівняємо діагональ, отримаємо:

       T..d...T
      .D...t..
     ..D...d.
    d..D...d
   ....D...
  .t...t..
 ..d...d.
T..d...X

... багато колонок зараз вишиковується. Якщо ми кодуємо стовпці в рядку таким чином:

       0..12..0 y/012/Td./
      .0..12..  y/012/D.t/
     ..0..12.   y/012/D.d/
    2..0..12    y/012/D.d/
   12..0..1     y/012/D../
  .12..0..      y/012/tt./
 ..12..0.       y/012/dd./
T..12..0        y/012/Xd./

... то плата шаблон може бути згорнутий в рядок в 15 символів: T..12..0..12..0; і нам просто потрібні правильні відображення для кожного ряду.

Зважаючи на це, ось розширена версія з коментарями:

i,r,c;
main() {
   for(;i<240;)  // one char per output including new line
   r=abs(i/16-7) // row; goes from 7 to 0 and back to 7.
   , c="T..12..0..12..0"[r+7-abs(i%16-7)] // pattern char
   , putchar(++i%16 // if this is 0 we need a new line
   ? c&4 // hash to distinguish 'T' and '.' from '0', '1', '2'
     ? c // print 'T' and '.' literally
     : "Xd.dd.tt.D..D.dD.dD.tTd."[c%4+r*3] // otherwise look up replacement char
   : 10 // print the new line
   );
}

Дуже хороша. 1. ви можете подати функцію замість програми, i,r,c;f()це добре. 2. (i%16-7)%8-> i%16-7&73. Я думаю c-48-> c%4працює, чи не так?
Рівень річки Св.

На жаль, функції повинні бути багаторазовими, тому f()потрібна додаткова i=0функція всередині функції, щоб нічого не економити.
Рівень Рівер Сент

Дякуємо за коментарі! 2 також не працюватиме ( %8використовує негативні модулі реалізації для відображення значень% 16 значень 0..15 до -7..7; &7буде відображати це до 0..7,0..7). Але, так, 3 абсолютно спрацюють ... оновляться, коли я отримаю можливість.
H Walters

@LevelRiverSt Mea culpa; 2 все ще не працюватиме суворо, але мені це все одно не потрібно.
H Walters

3

05AB1E , 57 53 байти

Код

•jd]31‚ŽÔc¦Ïïì¹Ep.Üì8Ìa;“•6B4ÝJ".TdDt"‡5'.3×:Â'Xý15ô»

Використовує кодування CP-1252 . Спробуйте в Інтернеті!


Пояснення (застаріле)

•4ç“–šã&$W§ñçvßÖŠ_æá_VFÛÞýi~7¾¬ÏXôc•5BРозпаковує на цей номер:

1002000100020010400030003000400040002020004002004000200040020000400000400000300030003000300020002020002001002000

З 4ÝJ".TdtD"‡, ми транслітеруємо наступне у великій кількості:

0 -> .
1 -> T
2 -> d
3 -> t
4 -> D

Ми роздвоюємо всю нитку, залишаючи рядок і рядок перетвореними на стеку і з'єднуємо їх за "X"допомогою ý. Ми розділимо весь рядок на шматки 15 за допомогою th-го 15ôкоду і з'єднаємо весь масив за допомогою нових рядків, використовуючи ».


û€ûмає бути вбудованим;).
Magic Octopus Urn

2

Пітон 3, 138 байт

d=lambda s:s+s[-2::-1]
print(*d(list(map(d,'T..d...T .D...t.. ..D...d. d..D...d ....D... .t...t.. ..d...d. T..d...X '.split()))),sep='\n')

Змінити list(map(A))на [*map(A)], економить 3 байти (потрібен Python 3.5+).
shooqie

2

05AB1E , 49 44 байт

•1nÑ=}íge/Þ9,ÑT‰yo¬iNˆå•6B8ôû€û»5ÝJ".TtdDX"‡

Спробуйте в Інтернеті!

Пояснили:

Натисніть: 1003000104000200004000303004000300004000020002000030003010030005

Розділіть на шматки по 8, паліндромізуйте кожен.

Знову паліндромізуйте.

Замініть числа символами.


Інша ідея (хтось спробує це в MATL)

Бачачи, що ВСЕ є гарнутом, щоб між ним був період ...

Порахуйте кількість нулів між кожним твором:

1003000104000200004000303004000300004000020002000030003010030005
^  ^   ^ ^   ^    ^   ^ ^  ^   ^    ^    ^   ^    ^   ^ ^  ^   ^

131424334342233135 => w\F6ß¿

Беручи підрахунок нулів:

23134312344343123 => ì:¼˜¾

Тоді ви б розшифрували та перенесли їх разом.

Використання їх у 05AB1E (призводить до збільшення на +5 байт):

05AB1E , 27 байт

•w\F6ß¿•6BS•ì:¼˜¾•5BS0ׂøJJ

Спробуй це...


Мета-гольф вхід:

05AB1E , 104 байти

•G¨J´JÏÍ?»"”Ö3úoÙƒ¢y”vf%¯‚6À°IÕNO’Å2Õ=ÙŠxn®žÑŸ¶¼t¨š,Ä]ÓŽÉéȺÂ/ø‡ŸÖ|e³J—Ë'~!hj«igċ΂wî’©•7BžLR"
.DTXdt"‡

Спробуй це!

Мета-golfed з допомогою мого мета-гольфіст для ASCII мистецтва: https://tio.run/nexus/05ab1e#JY9NSgNBEIWvUo4/qAQxyfi30yAioiAiuBM6M9U9DT3doao7ccBFrhI3ooss3QguJniRXCR2x01RfK9479Xqtf2@XHy2H78/tw/L6aydq8VXr5sPsuX0LeP1jCwbJD3r54v3dp5mFGbZzWp1wXBPyLpE6@GRQj0C1spiCQJ4gjjSVgG@YBG8HiM4KpHAWbgiXYqmA1wF79ONrxCGa5nBOyCUQSEyCFuCi2LEklwNjGO0YAQpNA3cBTa6hsIF60kjd9Y@jAWhF9SAk1C5Gk1yiTSQ9g1MBKcKAp4q7RGuXWCMFlYioS3iKowBhf@9Kh2DNbEHGSIexhSZeDRIUcq4oTDxDS09aAsjZ3TRHGycb25tP@/s7@51e/386Pjk9OzwDw


1

Javascript (ES6), 150 байт

_=>(r='',"T2d3T3d2T.D3t3t3D3D3d.d3D2d2D3d3D2d4D5D5t3t3t3t3d3d.d3d2T2d3".replace(/./g,c=>(c=+c?'.'.repeat(c):c,r=c+r,c))+'X'+r).match(/.{15}/g).join`
`

Як це працює

Рядок "T2d3T3d2T.D3t3t3D3D3d.d3D2d2D3d3D2d4D5D5t3t3t3t3d3d.d3d2T2d3"описує дошку від її верхнього лівого кута до квадрата безпосередньо перед «X», а послідовні порожні квадрати закодовані як цифри. replace()Функція і розпаковує порожні квадрати і будує дзеркальну рядок rдля нижньої частини дошки. Потім обидві частини збираються разом, а повернення каретки вставляється кожні 15 символів.

Демо

let f =
_=>(r='',"T2d3T3d2T.D3t3t3D3D3d.d3D2d2D3d3D2d4D5D5t3t3t3t3d3d.d3d2T2d3".replace(/./g,c=>(c=+c?'.'.repeat(c):c,r=c+r,c))+'X'+r).match(/.{15}/g).join`
`
console.log(f())


1

JavaScript (ES6), 221 байт

f=
_=>(a=[...Array(15)].map(_=>Array(15).fill`.`),r=([c,i,j])=>[a[i][j]=a[k=14-i][j]=a[i][j=14-j]=a[k][j]=c,j,i],[..."TDDDDtdX"].map((c,i)=>r([c,i,i])),"d30t51d62d73T70".replace(/.../g,s=>r(r(s))),a.map(a=>a.join``).join`
`)
;o.textContent=f()
<pre id=o>

Оскільки я пішов на проблему створення цього, я подумав, що все-таки опублікую його, хоча є явно чудове рішення.


1

C 234 байт

#define g(t) while(i++<8)putchar(*b++);b-=2;--i;while(--i>0)putchar(*b--);putchar('\n');b+=t;
char*r="T..d...T.D...t....D...d.d..D...d....D....t...t....d...d.T..d...X";i;f(){char*b=r;do{g(9);}while(*b);b-=16;do{g(-7);}while(b>=r);}

Ось результат:

T..d...T...d..T
.D...t...t...D.
..D...d.d...D..
d..D...d...D..d
....D.....D....
.t...t...t...t.
..d...d.d...d..
T..d...X...d..T
..d...d.d...d..
.t...t...t...t.
....D.....D....
d..D...d...D..d
..D...d.d...D..
.D...t...t...D.
T..d...T...d..T

1

Вугілля деревне , 33 байти (неконкурентоспроможне)

Вся заслуга за цю відповідь належить @DLosc .

T↑↑↘tdd↗→→↖XdtDDDD↓T..d‖O⟦↗→↓⟧UB.

Спробуйте в Інтернеті!

Багатослівний

Print("T")
Move(:Up)
Move(:Up)
Print(:DownRight, "tdd")
Move(:UpRight)
Move(:Right)
Move(:Right)
Print(:UpLeft, "XdtDDDD")
Print(:Down, "T..d")
ReflectOverlap([:UpRight, :Right, :Down])
SetBackground(".")

Спробуйте в Інтернеті!


Ідеальний інструмент для вирішення цього завдання, завдяки діагональним можливостям друку. +1 (а також здорово, щоб побачити такий фоновий метод, як у ASCII)
Кевін Круїссен

0

Haskell, 114 байт

g=(++)<*>reverse.init
unlines$g$g<$>words"T..d...T .D...t.. ..D...d. d..D...d ....D... .t...t.. ..d...d. T..d...X"

gу неточковому варіанті є g x = x ++ (reverse (init x)). Він застосовується один раз на (пів-) рядок і знову на результат.


0

sh + coreutils, 119 байт

Це двійковий файл. Показано як гексадум:

00000000  74 61 69 6c 20 2d 63 39  34 20 24 30 7c 67 75 6e  |tail -c94 $0|gun|
00000010  7a 69 70 0a 65 78 69 74  0a 1f 8b 08 00 2e ec ca  |zip.exit........|
00000020  57 00 03 65 4f c9 0d c0  30 08 fb 7b 18 4f 91 11  |W..eO...0..{.O..|
00000030  fc e8 00 1e a1 fb ab 08  68 a4 90 07 60 d9 98 43  |........h...`..C|
00000040  a4 49 8a 59 05 ae 40 6f  c7 22 98 84 b3 29 10 fc  |.I.Y..@o."...)..|
00000050  13 59 1d 7a 11 9d b1 bd  15 a8 56 77 26 54 c4 b3  |.Y.z......Vw&T..|
00000060  f7 0d fd f6 9f f3 ef fd  e7 7d f3 7e 8d ff 3e 05  |.........}.~..>.|
00000070  57 d9 a0 f0 00 00 00                              |W......|
00000077

Ось форма base64, щоб ви могли її скопіювати / вставити:

begin-base64 755 test.sh
dGFpbCAtYzk0ICQwfGd1bnppcApleGl0Ch+LCAAu7MpXAANlT8kNwDAI+3sY
T5ER/OgAHqH7qwhopJAHYNmYQ6RJilkFrkBvxyKYhLMpEPwTWR16EZ2xvRWo
VncmVMSz9w399p/z7/3nffN+jf8+BVfZoPAAAAA=
====

0

C 230 228 байт

char *s="T.D..Dd..D....D.t...t..d...dT..d...X";
int x,y,a,b;
#define X(N) {putchar(s[a]);N y<=x?1:y;}
#define P for(y=1;y<8;y++)X(a+=)for(y--;y+1;y--)X(a-=)puts("");
main(){for(;x<8;x++){a=b+=x;P}for(x=6;x+1;x--){a=b-=(x+1);P}}

спробуйте це на ideone

Це спроба вдосконалити початкову версію C, розміщену, що чверть плати зберігалася в масиві С. Не такий короткий, як я сподівався. У цій версії зберігається лише одна восьма частина плати.

Безголівки:

char *s="T.D..Dd..D....D.t...t..d...dT..d...X";
int x,y,a,b;
main(){
    for(x = 0; x < 8; x++){
        a=b+=x;
        for(y = 1; y < 8; y++){
            putchar(s[a]);
            a += y<=x ? 1 : y;
        }
        for(y--; y >= 0; y--){
            putchar(s[a]);
            a -= y<=x ? 1 : y;
        }
        puts("");
    }
    for(x=6; x >= 0; x--){
        a=b-=(x+1);
        for(y = 1; y < 8; y++){
            putchar(s[a]);
            a += y<=x ? 1 : y;
        }
        for(y--; y >= 0; y--){
            putchar(s[a]);
            a-= y<=x ? 1 : y;
        }
        puts("");
    }
}

0

GNU sed, 219 205 байт

s/$/T..d...T...d..T/p;h
s/.*/.D...t...t...D./p;G;h
s/.*/..D...d.d...D../p;G;h
s/.*/d..D...d...D..d/p;G;h
s/.*/....D.....D..../p;G;h
s/.*/.t...t...t...t./p;G;h
s/.*/..d...d.d...d../p;G;h
s/.*\n//;s/T/X/2p;g

Скориставшись дзеркальною симетрією дошки, друга половина - перша, яка зберігалася у зворотному порядку у просторі утримування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.