Буквенно-цифровая спираль

24

Задача очень проста, когда дан вход, выведите одну из следующих спиралей:

Input = 1дает спираль с буквой, Aначинающейся в верхнем левом углу:

A B C D E F
T U V W X G
S 5 6 7 Y H
R 4 9 8 Z I
Q 3 2 1 0 J
P O N M L K

Input = 2дает спираль с буквой, Aначинающейся в верхнем правом углу:

P Q R S T A
O 3 4 5 U B
N 2 9 6 V C
M 1 8 7 W D
L 0 Z Y X E
K J I H G F

Input = 3дает спираль с буквой, Aначинающейся в нижнем правом углу:

K L M N O P
J 0 1 2 3 Q
I Z 8 9 4 R
H Y 7 6 5 S
G X W V U T
F E D C B A

Input = 4дает спираль с буквой, Aначинающейся в нижнем левом углу:

F G H I J K
E X Y Z 0 L
D W 7 8 1 M
C V 6 9 2 N
B U 5 4 3 O
A T S R Q P

Как вы можете видеть, спираль всегда идет по часовой стрелке и движется от внешней стороны к внутренней .

Правила просты:

  • Вам необходимо предоставить полную программу с использованием STDIN и STDOUT или ближайшего аналога, если это невозможно.
  • Учитывая input ( 1, 2, 3, 4), выведите связанную спираль.
  • Конечные пробелы разрешены
  • Ведущие пробелы допускаются при последовательном использовании
  • Вам нужно использовать заглавные буквы для вывода, строчные буквы не допускаются.
  • Это , поэтому выигрывает программа с наименьшим количеством байтов!
Аднан
источник
3
Относящиеся . Это похоже на обман, но я не могу найти его: P
FryAmTheEggman
2
Более тесно связаны .
Питер Тейлор
2
места необходимы?
Maltysen
@ Maltysen Да, они необходимы.
Аднан

Ответы:

5

CJam, 45 43 42 байта

'[,65>A,+W%(s{W%z_,@s/(@.+}A*ri{W%z}*Sf*N*

Проверьте это здесь.

объяснение

'[,65>  e# Push the upper-case alphabet.
A,+     e# Append the digits.
W%      e# Reverse everything.
(s      e# Pull off the 9 and turn it into a string.
{       e# Repeat this 10 times to roll the string up in a spiral...
  W%z   e#   Rotate the existing grid clockwise.
  _,    e#   Duplicate grid so far and get the number of rows.
  @s    e#   Pull up the list of characters and flatten it into one string.
  /     e#   Split the string into chunks of the size of the number of rows.
  (     e#   Pull off the first chunk.
  @.+   e#   Pull up the grid so far and prepend the chunk as a new column.
}A*     e# We now have the spiral as desired, with the A in the bottom left corner.
ri      e# Read input and convert to integer.
{       e# Repeat this code that often..
  W%z   e#   Rotate the spiral clockwise.
}*
Sf*     e# Join each line with spaces.
N*      e# Join the lines with linefeeds.
Мартин Эндер
источник
10

Japt , 53 байта 58 59 60

Сохранено 5 байтов благодаря @ETHproductions

"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·

Это использует команду поворота, которая я никогда не думал, что будет настолько полезным

Объяснение && Ungolfed

"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"qS zU m_q qS} qR

             // Implicit: U = input
"FGH...SRQP" // String, " " represent newlines
qS           // Split   " "
zU           // Rotate
m_           // Loop the lines
  q qS}      // Insert spaces
qR           // Join by newlines

Попробуйте онлайн

Злые овцы
источник
Странно, но когда я пытаюсь запустить программу в сети, она не работает и жалуется, что не может найти переменную f.
DavidC
@DavidCarraher Я рекомендую попробовать Firefox, это браузер, в котором интерпретатор работает лучше всего
Downgoat 12.12.15
Да, это работает на Firefox. Ницца.
DavidC
О, здорово! Используя несколько ярлыков Unicode, вы можете сократить количество байтов на пять:"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·
ETHproductions
@ETHproductions не видел их раньше, спасибо!
Злая Овца
3

Mathematica 156 байт

Преобразует исходную строку букв "ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"в массив. Nestприменяется fк этому массиву n-1раз, где n - номер ввода. fработает путем Transpose-ing массива с последующим Reverseприменением к каждой строке. gпреобразует окончательный массив в строку.

s=StringJoin;r=Riffle;f=Nest[Reverse/@Transpose@#&,Partition[Characters@"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK",6],#-1]&;
g@n_:=s@r[s/@(r[#," "]&/@f[n]),"\n"]

пример

g[4]

выход


Если бы вывод мог быть представлен как массив, функция gбыла бы ненужной.

f[4]

{{"F", "G", "H", "I", "J", "K"}, {"E", "X", "Y", "Z", "0", "L "}, {" D "," W "," 7 "," 8 "," 1 "," M "}, {" C "," V "," 6 "," 9 "," 2 ", "N"}, {"B", "U", "5", "4", "3", "O"}, {"A", "T", "S", "R", "Q ", "П"}}

DavidC
источник
Инфиксная форма может использоваться в некоторых областях.
LegionMammal978
3

MATLAB, 61 89 байт

b=[65:90 48:57];n=zeros(12,6);n(2:2:end)=rot90(b(37-spiral(6)),input('')-2);disp([n' ''])

Я посмотрю, смогу ли я получить это немного. Не уверен, хотя.

Это создает массив всех букв от A до Z, за которыми следуют от 0 до 9, затем берет спираль и использует ее для упорядочения данных в правильном порядке. Затем массив поворачивается на величину, указанную пользователем, и затем распечатывается.

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

 F G H I J K
 E X Y Z 0 L
 D W 7 8 1 M
 C V 6 9 2 N
 B U 5 4 3 O
 A T S R Q P

Как я видел, пробелы требуются, этот оригинальный код (для 61) недействителен, потому что он не добавляет пробел между каждым символом. Но я добавлю это здесь для справки.

b=['A':'Z' '0':'9'];disp(rot90(b(37-spiral(6)'),6-input('')))

и производит:

ABCDEF
TUVWXG
S567YH
R498ZI
Q3210J
PONMLK
Том Карпентер
источник
2

JavaScript ES6, 165 172

Простое вращение, начиная с жестко закодированной строки

Примечание 1 сохраненный байт thx @ user81655

p=prompt();alert("ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK".split` `.map((r,y,a)=>[...r].map((c,x)=>p<2?c:a[p<3?5-x:p<4?5-y:x][p<3?y:p<4?5-x:5-y]).join` `).join`
`)

Тестовый фрагмент:

// Test: redefine alert to write inside the snippet
alert=x=>P.innerHTML=x

p=prompt();
alert(
  "ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK"
  .split` `
  .map(
    (r,y,a)=>
    [...r].map(
      (c,x)=>p<2?c:
      a
       [p<3?5-x:p<4?5-y:x]
       [p<3?y:p<4?5-x:5-y]
    ).join` `
  ).join`\n`
)
<pre id=P></pre>

edc65
источник
Вы можете поместить символы новой строки в строки шаблона на `<newline>`один байт короче, чем `\n`.
user81655 14.12.15
@ user81655 спасибо, даже 1 байт на счету, но в любом случае это так ужасно долго
edc65 14.12.15
1

Pyth - 60 байт

Жестко кодирует строку и использует матричные операции, чтобы получить все параметры.

jjL\ @[_CKc6"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"KC_K__MK)Q

Тестовый пакет .

Maltysen
источник
2
+<G6"вместо "ABCDEFсохранения 2 байта.
PurkkaKoodari
1

Рубин, 173 байта

->i{_,r,o=->s{s.map{|i|i*' '}},->s{s.transpose.map{|i|i.reverse}},%W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars);puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]}

Ungolfed:

-> i {
  _ = -> s { s.map{|i| i*' ' } }
  r = -> s { s.transpose.map{|i| i.reverse } }
  o = %W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars)
  puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]
}

Использование:

->i{_,r,o=->s{s.map{|i|i*' '}},->s{s.transpose.map{|i|i.reverse}},%W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars);puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]}[4]
F G H I J K
E X Y Z 0 L
D W 7 8 1 M
C V 6 9 2 N
B U 5 4 3 O
A T S R Q P
Васу Адари
источник
1

Python, 152 байта

s=[r for r in "ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK".split(" ")]
for i in range(1,int(input())):s=zip(*list(s)[::-1])
for x in s:print(" ".join(x))
Габриэле д'Антона
источник