Круговая клавиатура спираль

24

Это QWERTY клавиатура.

Q W E R T Y U I O P
 A S D F G H J K L
  Z X C V B N M

Мы можем «свернуть» на этой клавиатуре, начиная с G. Спираль начнется с G, перейдите к H, затем к Y, затем к T, затем к F, затем к V, затем к B, затем к N, затем к J, затем к U , затем R, затем D, затем C, ... и т. д. Ваша задача состоит в том, чтобы, учитывая число 1 ≤ N ≤ 26, вывести первые N символов в этой спирали. (Если вы не уверены, обратитесь к изображениям в конце поста.)

Подвох? Оценка вашей программы пропорциональна индексам символов, найденных внутри спирали!

счет

  1. Для каждой буквы (без учета регистра) в вашем коде добавьте индекс этого символа в спирали к вашему счету (начиная с 1).
  2. За каждого персонажа, не входящего в спираль, добавьте 10 к вашему счету.
  3. Самый низкий балл побеждает.

Например, программа print("Hello, World!")имеет оценку 300.

Для вашего удобства я написал автоматический грейдер программы.

Другие правила

  • Ваше представление может быть программой или функцией.
  • Вы можете взять N, начиная с 0 или 1 и заканчивая 25 или 26 соответственно, но выходные данные все равно должны начинаться с "G" и заканчиваться "GHYTFVBNJURDCMKIESXLOWAZPQ".
  • Вы должны вывести символы по спирали по порядку .
  • Если это функция, вы можете вернуть список символов вместо строки.
  • У вас может быть один завершающий символ новой строки после вывода.
  • Вы можете использовать строчные буквы вместо прописных или их комбинацию.

Контрольные примеры

number -> output
1 -> G
2 -> GH
5 -> GHYTF
12 -> GHYTFVBNJURD
15 -> GHYTFVBNJURDCMK
24 -> GHYTFVBNJURDCMKIESXLOWAZ
26 -> GHYTFVBNJURDCMKIESXLOWAZPQ

Картинки

обычная клавиатура

Спираль накладывается:

спиральная клавиатура

Конор О'Брайен
источник
3
Кто-то недавно смотрел Сферу ...
Pureferret
@Pureferret Не могли бы вы просветить меня? Я не уверен, что вы имеете в виду.
Конор О'Брайен
@ ConorO'Brien В « Сфере» (как в романе, так и в фильме) инопланетянин общается с людьми с помощью двузначного числового кода, где каждое число соответствует букве на клавиатуре в очень похожей последовательности .
Инженер Тост

Ответы:

14

Джапт , 304 264 162 балла

Экономия 40 баллов благодаря @ ConorO'Brien

;î"历锋㫿鮹㿬崴ꨜꎋΞ"csG

Проверьте это онлайн!

Чтобы сохранить как можно больше точек, вся строка сгущается в 9 символов Юникода, интерпретируя каждый цикл из 3 букв как число base-36, а затем преобразуя его в кодовую точку. Сама программа берет эту сжатую строку (которая стоит 110 баллов, включая кавычки) и отображает каждый cхард-код, преобразовывая его в sстроку в base-36 ( Gпосле ;в начале). îпринимает первые {входные} символы этого, который неявно печатается.

ETHproductions
источник
11

С, оценка: 544

g(g){write(1,"GHYTFVBNJURDCMKIESXLOWAZPQ",g);}

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

Steadybox
источник
... почему вы называете функцию так же, как аргумент?
Фонд Моника иск
6
@QPaysTaxes Потому что gэто самая дешевая буква за выигрыш, используемый в задании .
Steadybox
Ах, я пропустил пользовательские оценки.
Фонд Моника иск
11

Спираль , оценка:  61921   5127   4715   4655  4191

4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X *   X X X X X X X X X X X X X X X X X X X X X X X X X
   ! >   h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T

Переводчик можно найти здесь .

Объяснение:

P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
   X       X X X X X X X X X X X X X X X X X X X X X X X X X
   !       h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
    X X X X X X X X X X X X X X X X X X X X X X X X X X
    v v v v v v v v v v v v v v v v v v v v v v v v v v
    z y x w V u t s r q p o n m l k j i h g f e d c b a

Программа начинается с 0символа на четвертой строке. Первый кусок кода для запуска 0;vg. ;принимает число в качестве входных данных и помещает его в стек. vпомещает то, что находится в регистре (ноль) в стек. Это будет использоваться в качестве счетчика. gявляется меткой, при достижении которой элемент управления переходит к другому вхождению буквы gв коде.

Так вот где контроль теперь:

X
v
g

Поскольку во всех других направлениях есть пробелы, указатель инструкции начинает двигаться вверх. vпомещает ноль в стек и Xнемедленно выталкивает его из стека. Поскольку значение вытеснения равно нулю, указатель инструкции перемещается в X(в противном случае он будет рассматриваться как пробел).

По умолчанию поток управления находится в режиме поворота вправо, поэтому теперь, когда он достигает перекрестка, указатель команды поворачивается вправо. vеще раз вставляет ноль в стек, *увеличивает регистр на единицу.

v*v*v
  X
  v
  g

Следующее vпомещает то, что находится в регистре (номер 1) в стек, указатель инструкции пытается повернуть вправо, нажимая следующий X. Значение, только что добавленное в стек, выталкивается и помещается в регистр. Поскольку он не равен нулю, Xон не вводится, и *вместо этого IP переходит к следующему справа, снова увеличивая значение в регистре.

v*v*v*v*v
X X X X X
v v v v v
i h g f e

Это происходит снова и снова, пока мы не достигнем конца этой части и не *начнется линия s. К настоящему времени значение в регистре равно 6, что является буквой gASCII минус буква ASCII a. Таким образом, со строкой 97 *с мы увеличиваем значение в регистре до 103, что соответствует букве, которую gмы хотим напечатать. vтолкает его в стек, и Pеще один ярлык при попадании, который мы переходим к другомуP в первой строке кода.

Здесь .выскакивает значение из стека и печатает его как символ. После этого Xизвлекает посторонний ноль из стека, затем ~сравнивает два оставшихся значения в стеке (значения являются счетчиком и входным значением). Если значения совпадают, оператор помещает ноль в стек (иначе -1 или 1). Опять же, контроль пытается повернуть направо. Xвыскакивает значение сравнения из стека, если оно равно нулю X, и после его !ввода завершает программу.

P.X~ZZ*v+^
   X
   !

В противном случае IP-адрес продолжается до Zметки, которая в этом случае переходит только на один шаг вправо. Причиной этого является то, что при прыжке значение в регистре возвращается к нулю. *увеличивает регистр и vпомещает полученный 1 в стек. +извлекает два верхних элемента стека (1 и счетчик), добавляет их и помещает результат в стек (в действительности это увеличивает счетчик на единицу). ^копирует результат из стека в регистр, не удаляя его из стека.

#уменьшает значение в регистре на единицу, vпомещает уменьшенное значение в стек, IP-адрес пытается повернуть вправо и Xизвлекает значение из стека. Если значение ненулевое, IP продолжает двигаться на восток, уменьшая значение в регистре, пока не достигнет нуля, и IP не войдет в Xветвь.

#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
 X X X X X X X X X X X X X X X X X X X X X X X X X
 h y t f V b n j u r d c m k i e s x l o w a z p q

Ветвь приводит к метке, соответствующей значению счетчика. После нажатия на метку элемент управления переходит к другому вхождению метки в раздел, где мы начали с метки g, начиная еще одну итерацию. Как и в случае g, значение в регистре увеличивается до значения ASCII буквы, которую мы должны напечатать. Затем символ печатается и счетчик увеличивается, выбирается другая метка. Это происходит до тех пор, пока после последней итерации счетчик не станет равным входу, и программа не завершится.

Редактировать:

P.X~Zv+^
   X *
   ! Z

Достигает того же, что и

P.X~ZZ*v+^
   X
   !

но с меньшими пробелами.

Изменить 2:

vv****v+^v+^v+^v+^*v++P

Может использоваться вместо:

*****************************************************************vP
Steadybox
источник
2
Иронично, что у языка, который называется «Спираль», такой высокий показатель в проблеме спирального выхода.
Ширкам
6

Хаскелл , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

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

Это что-то вроде эталона, я чувствую, что должен быть лучший способ, но это лучшее, что я нашел до сих пор.

объяснение

Полагаю, я должен объяснить это тем, кто не слишком хорошо знаком с Хаскеллом. Функция takeзанимает первые n элементов списка. Это называется так:

take n list

Мы хотим взять первые n элементов укуса "GHYTFVBNJURDCMKIESXLOWAZPQ", поэтому мы хотим что-то вроде

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Мы можем сделать лучше, хотя, мы можем инфиксировать takeс помощью обратных кавычек

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

И теперь это можно сделать бессмысленно

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")
Мастер пшеницы
источник
Обидно, частичное применение требует использования partialв Clojure. Это то, что я собирался, но partialбыло слишком дорого.
Carcigenicate
3
Разве ваш счет не 470? Это то, что фрагмент из вопроса дает мне в любом случае ...
Просто студент
5

Vim , 461 418

CGHYTFVBNJURDCMKIESXLOWAZPQg^[G@" D

Спасибо @pacholik за -43 балла!

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

ВИМ-анимация

ბიმო
источник
1
Сделать это 418 с CGHYTFVBNJURDCMKIESXLOWAZPQg©G@" D(© является побег)
pacholik
4

Befunge, Счет: 531

QPZAWOLXSEIKMCDRUJNBVFTYHG"&\>,# 1#\-# :# _@

Я чувствую, что этот вызов был бы более интересным, если бы результат был также по спирали.

Джо Кинг
источник
4

TI-Basic (TI-84 Plus CE), 454 432 балла

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 очков от Конор О'Брайен

Беги с 5:prgmNAME.

Возвращает / печатает subстроку из 1в Ans(ввод числа).

TI-Basic является языком токенов , поэтому я оцениваю его по байтовым значениям токенов.

sub( 0xbb 0x0c, так что 20

"0x2a, так *что 10 * 2 = 20

Прописные буквы не меняются, поэтому строка 351

,0x2b, так +что 10 * 2 = 20

10x31 1, итак 10

Ans0x72, то есть r11

20 + 20 + 351 + 20 + 10 + 11 = 432

pizzapants184
источник
С этой интерпретацией правил подсчета вы можете сэкономить еще 31 байт, ища буквы в творческих местах. Замените S, A, Z, P переменными статами s, a, z, p (в меню STAT + 5), каждый из которых набирает 17 баллов: это 2-байтовые токены, первый байт которых соответствует b. Замените O, W, Q обычными строчными буквами, каждый из которых набирает по 20 баллов: это 2-байтовые токены 0xBBBF, 0xBBC7, 0xBBC1.
Миша Лавров
3

Python 3, оценка = 762 753

1 на основе ввода. Это хуже, чем тривиальный подход, поскольку он использует 37 не букв. Это несколько интересно, хотя.

-9 спасибо Лео .

h=lambda g:g and h(g-1)+chr(65+int('GYGGYHGYYGYTGTYHGYGGHGGTGHGYGYGFGHGGYGGHHGGHHYYGHGHGGYFGGYHGGTHGHTGGGGGFGGVHGT'[g*3-3:g*3],35)%26)or''

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

Колера Су
источник
1
Мне нравится такой подход :) Кстати, [:g*3][-3:]может стать [g*3-3:g*3]снижение общего балла на 9 баллов
Лев
2

Brainf ** k, оценка = 2690

Введите один байт в диапазоне от 0x1до 0x1a.

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

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

Колера Су
источник
2

APL (Дьялог) , оценка: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

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

Единственное использование латинских букв в Dyalog - в именах переменных и некоторых системных функциях. Кроме того, используются только глифы и некоторые греческие буквы.

Уриэль
источник
1

Питон 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

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

Анонимная лямбда, использующая нарезку строк в Python ( "asdf"[:i]получает первые iсимволы "asdf")

pizzapants184
источник
1

Clojure, 484 474 баллов

-10 баллов, потому что, видимо, %может существовать после числа без пробела, разделяющего их !? Возможно, мне придется вернуться и улучшить некоторые представления.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Анонимная функция. В основном порт Clojure из того, что уже было опубликовано. Баллы приятно! Я думаю, что это первая программа Clojure, которую я когда-либо написал, которая не содержит ни одного пробела.

(defn spiral [n]
  ; Substring the hardcoded list, going from index 0 to n
  (subs "ghytfvbnjurdcmkiesxlowazpq" 0 n))
Carcigenicate
источник
1

Шелуха , 293 байта

↑¨ghytfvb⌋ȷÜdcmkÏexl⁰Λzpq

Это самый короткий, который я смог найти, следующий ближе ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨к результату 293 ..

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

объяснение

Брутфорс-поиск, оказывается, все строчные дали лучший результат. По сути, это то же самое, что и решение @Wheat Wizard, take( ) для сжатой строки ( ¨).

ბიმო
источник
1

Excel, 490 баллов

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Соглашение для Excel ansers - принимать данные от A1. Изменяя это, чтобы G1сократить 22 балла (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)
Wernisch
источник
1

C # , оценка 546

g=>"GHYTFVBNJURDCMKIESXLOWAZPQ".Substring(0,g);
auhmaan
источник
1

Руст, оценка 443

Нечасто Rust хорош в код-гольфе, но здесь он превосходит многие языки

|g|&"GHYTFVBNJURDCMKIESXLOWAZPQ"[..g]
зазубренный
источник
1

Javascript ES6, 527 баллов

g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

Попытайся !

f=g=>`GHYTFVBNJURDCMKIESXLOWAZPQ`.slice(0,g)

input.oninput = function() {
    output.value = f(input.value);
}
textarea { width: 500px; height: 6em; font-style: monospace; }
<textarea id="input"></textarea>
<textarea disabled id="output"></textarea>

Weedoze
источник
1

PHP, оценка 584

немного поиграл со словарем; тот факт, что ксоринг строки обрезает ее, становится substrустаревшим.

<?=">1 -?/;73,+=:420<*!56.8#)("^str_repeat(y,$argv[1]);

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

Titus
источник
0

> <> , 558 + 16 = 574 балла

<;v? : <{"GHYTFVBNJURDCMKIESXLOWAZPQ"
  >$o1-^

Использует -vфлаг для ввода ввода в стек.

Вставляет спираль в стопку в обратном порядке, а затем поворачивает вход вверх. Затем, пока вершина стека не равна нулю, печатает следующую букву и уменьшает вершину стека.

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

KSmarts
источник