Это 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).
- За каждого персонажа, не входящего в спираль, добавьте 10 к вашему счету.
- Самый низкий балл побеждает.
Например, программа 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
Картинки
Спираль накладывается:
ascii-art
code-challenge
keyboard
Конор О'Брайен
источник
источник
Ответы:
Джапт ,
304264162 баллаЭкономия 40 баллов благодаря @ ConorO'Brien
Проверьте это онлайн!
Чтобы сохранить как можно больше точек, вся строка сгущается в 9 символов Юникода, интерпретируя каждый цикл из 3 букв как число base-36, а затем преобразуя его в кодовую точку. Сама программа берет эту сжатую строку (которая стоит 110 баллов, включая кавычки) и отображает каждый
c
хард-код, преобразовывая его вs
строку в base-36 (G
после;
в начале).î
принимает первые {входные} символы этого, который неявно печатается.источник
С, оценка: 544
Попробуйте онлайн!
источник
g
это самая дешевая буква за выигрыш, используемый в задании .Спираль , оценка:
619215127471546554191Переводчик можно найти здесь .
Объяснение:
Программа начинается с
0
символа на четвертой строке. Первый кусок кода для запуска0;vg
.;
принимает число в качестве входных данных и помещает его в стек.v
помещает то, что находится в регистре (ноль) в стек. Это будет использоваться в качестве счетчика.g
является меткой, при достижении которой элемент управления переходит к другому вхождению буквыg
в коде.Так вот где контроль теперь:
Поскольку во всех других направлениях есть пробелы, указатель инструкции начинает двигаться вверх.
v
помещает ноль в стек иX
немедленно выталкивает его из стека. Поскольку значение вытеснения равно нулю, указатель инструкции перемещается вX
(в противном случае он будет рассматриваться как пробел).По умолчанию поток управления находится в режиме поворота вправо, поэтому теперь, когда он достигает перекрестка, указатель команды поворачивается вправо.
v
еще раз вставляет ноль в стек,*
увеличивает регистр на единицу.Следующее
v
помещает то, что находится в регистре (номер 1) в стек, указатель инструкции пытается повернуть вправо, нажимая следующийX
. Значение, только что добавленное в стек, выталкивается и помещается в регистр. Поскольку он не равен нулю,X
он не вводится, и*
вместо этого IP переходит к следующему справа, снова увеличивая значение в регистре.Это происходит снова и снова, пока мы не достигнем конца этой части и не
*
начнется линия s. К настоящему времени значение в регистре равно 6, что является буквойg
ASCII минус буква ASCIIa
. Таким образом, со строкой 97*
с мы увеличиваем значение в регистре до 103, что соответствует букве, которуюg
мы хотим напечатать.v
толкает его в стек, иP
еще один ярлык при попадании, который мы переходим к другомуP
в первой строке кода.Здесь
.
выскакивает значение из стека и печатает его как символ. После этогоX
извлекает посторонний ноль из стека, затем~
сравнивает два оставшихся значения в стеке (значения являются счетчиком и входным значением). Если значения совпадают, оператор помещает ноль в стек (иначе -1 или 1). Опять же, контроль пытается повернуть направо.X
выскакивает значение сравнения из стека, если оно равно нулюX
, и после его!
ввода завершает программу.В противном случае IP-адрес продолжается до
Z
метки, которая в этом случае переходит только на один шаг вправо. Причиной этого является то, что при прыжке значение в регистре возвращается к нулю.*
увеличивает регистр иv
помещает полученный 1 в стек.+
извлекает два верхних элемента стека (1 и счетчик), добавляет их и помещает результат в стек (в действительности это увеличивает счетчик на единицу).^
копирует результат из стека в регистр, не удаляя его из стека.#
уменьшает значение в регистре на единицу,v
помещает уменьшенное значение в стек, IP-адрес пытается повернуть вправо иX
извлекает значение из стека. Если значение ненулевое, IP продолжает двигаться на восток, уменьшая значение в регистре, пока не достигнет нуля, и IP не войдет вX
ветвь.Ветвь приводит к метке, соответствующей значению счетчика. После нажатия на метку элемент управления переходит к другому вхождению метки в раздел, где мы начали с метки
g
, начиная еще одну итерацию. Как и в случаеg
, значение в регистре увеличивается до значения ASCII буквы, которую мы должны напечатать. Затем символ печатается и счетчик увеличивается, выбирается другая метка. Это происходит до тех пор, пока после последней итерации счетчик не станет равным входу, и программа не завершится.Редактировать:
Достигает того же, что и
но с меньшими пробелами.
Изменить 2:
Может использоваться вместо:
источник
Хаскелл , 471
Попробуйте онлайн!
Это что-то вроде эталона, я чувствую, что должен быть лучший способ, но это лучшее, что я нашел до сих пор.
объяснение
Полагаю, я должен объяснить это тем, кто не слишком хорошо знаком с Хаскеллом. Функция
take
занимает первые n элементов списка. Это называется так:Мы хотим взять первые n элементов укуса
"GHYTFVBNJURDCMKIESXLOWAZPQ"
, поэтому мы хотим что-то вродеМы можем сделать лучше, хотя, мы можем инфиксировать
take
с помощью обратных кавычекИ теперь это можно сделать бессмысленно
источник
partial
в Clojure. Это то, что я собирался, ноpartial
было слишком дорого.Желе , 211 баллов
19 байт
Попробуйте онлайн!
сэкономил кучу очков благодаря предложению Эминьи использовать
œ?
: Dисточник
Vim ,
461418Спасибо @pacholik за -43 балла!
Попробуйте онлайн!
источник
CGHYTFVBNJURDCMKIESXLOWAZPQg©G@" D
(© является побег)Befunge, Счет: 531
Я чувствую, что этот вызов был бы более интересным, если бы результат был также по спирали.
источник
TI-Basic (TI-84 Plus CE),
454432 балла-22 очков от Конор О'Брайен
Беги с
5:prgmNAME
.Возвращает / печатает
sub
строку из1
вAns
(ввод числа).TI-Basic является языком токенов , поэтому я оцениваю его по байтовым значениям токенов.
sub(
0xbb 0x0c, так что 20"
0x2a, так*
что 10 * 2 = 20Прописные буквы не меняются, поэтому строка 351
,
0x2b, так+
что 10 * 2 = 201
0x311
, итак 10Ans
0x72, то естьr
1120 + 20 + 351 + 20 + 10 + 11 = 432
источник
Python 3, оценка =
7627531 на основе ввода. Это хуже, чем тривиальный подход, поскольку он использует 37 не букв. Это несколько интересно, хотя.
-9 спасибо Лео .
Попробуйте онлайн!
источник
[:g*3][-3:]
может стать[g*3-3:g*3]
снижение общего балла на 9 баллов05AB1E , оценка: 204
Попробуйте онлайн!
источник
Brainf ** k, оценка = 2690
Введите один байт в диапазоне от
0x1
до0x1a
.Попробуйте онлайн!
источник
APL (Дьялог) , оценка: 391
Попробуйте онлайн!
Единственное использование латинских букв в Dyalog - в именах переменных и некоторых системных функциях. Кроме того, используются только глифы и некоторые греческие буквы.
источник
Питон 3, 522
Попробуйте онлайн!
Анонимная лямбда, использующая нарезку строк в Python (
"asdf"[:i]
получает первыеi
символы"asdf"
)источник
Clojure,
484474 баллов-10 баллов, потому что, видимо,
%
может существовать после числа без пробела, разделяющего их !? Возможно, мне придется вернуться и улучшить некоторые представления.Анонимная функция. В основном порт Clojure из того, что уже было опубликовано. Баллы приятно! Я думаю, что это первая программа Clojure, которую я когда-либо написал, которая не содержит ни одного пробела.
источник
Ли , 521 балл
Попробуйте онлайн!
Я не чувствую, что это можно оптимизировать.
источник
Баш , оценка: 465
Попробуйте онлайн!
источник
Шелуха , 293 байта
Это самый короткий, который я смог найти, следующий ближе
¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨
к результату 293 ..Попробуйте онлайн!
объяснение
Брутфорс-поиск, оказывается, все строчные дали лучший результат. По сути, это то же самое, что и решение @Wheat Wizard,
take
(↑
) для сжатой строки (¨
).источник
Common Lisp, оценка: 580
Попробуйте онлайн!
источник
Excel, 490 баллов
Соглашение для Excel ansers - принимать данные от
A1
. Изменяя это, чтобыG1
сократить 22 балла (468).источник
C # , оценка 546
источник
Руст, оценка 443
Нечасто Rust хорош в код-гольфе, но здесь он превосходит многие языки
источник
Голанг, оценка 861
Играй онлайн!
источник
Javascript ES6, 527 баллов
Попытайся !
источник
PHP, 590 баллов
Попробуйте онлайн!
источник
PHP, оценка 584
немного поиграл со словарем; тот факт, что ксоринг строки обрезает ее, становится
substr
устаревшим.Попробуйте онлайн .
источник
Математика, 528
Попробуйте онлайн!
источник
Пиф , оценка: 371
Попробуй это здесь.
Как?
источник
Рубин , 453 балла
Попробуйте онлайн!
источник
> <> , 558 + 16 = 574 балла
Использует
-v
флаг для ввода ввода в стек.Вставляет спираль в стопку в обратном порядке, а затем поворачивает вход вверх. Затем, пока вершина стека не равна нулю, печатает следующую букву и уменьшает вершину стека.
Попробуйте онлайн!
источник
Пиф , 261 очко
Попробуй это здесь!
Это выводит заглавную букву. Для строчных букв вы можете попробовать альтернативный 261 байт .
источник