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


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, 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 Не могли б ви мене просвітити? Я не впевнений, на що ви звертаєтесь.
Conor O'Brien

@ ConorO'Brien In Sphere (і роман, і фільм) інопланетянин спілкується з людьми за допомогою двозначного цифрового коду, де кожне число відповідає букві на клавіатурі за дуже схожим малюнком .
Інженер Тост

Відповіді:


14

Japt , 304 264 162 бали

Збережено 40 балів завдяки @ ConorO'Brien

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

Перевірте це в Інтернеті!

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


11

C, оцінка: 544

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

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


... чому ти називаєш функцію тим самим, що і аргумент?
Фонд позову Моніки

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 *s ми збільшуємо значення в регістрі до 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

2
Іронічно, що у мовної мови під назвою "Спіраль" є така висока оцінка проблеми спіральної виведення.
Ширкам

6

Хаскелл , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

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

Це трохи орієнтир, я відчуваю, що повинен бути кращий шлях, але це найкраще, що я знайшов поки що.

Пояснення

Я думаю, я повинен пояснити це тим, хто занадто добре не знайомий з Haskell. Функція 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? Ось, що все-таки дає мені фрагмент у питанні ...
Просто студент



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

1є 0x31, значить 1, так 10

Ansдорівнює 0x72 r, тобто 11

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


Завдяки такій інтерпретації правил підрахунку балів ви можете зберегти ще 31 байт, шукаючи букви в творчих місцях. Замініть S, A, Z, P на змінні stat 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.

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

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




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))



1

Лушпиння , 293 байт

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

Це найкоротший, який я міг знайти, наступний ближче ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨на оцінку 293 ..

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

Пояснення

Звертий пошук, виявляється, всі нижчі регістри дали найкращу оцінку. Це в основному те саме, що рішення @Wheat Wizard, take( ) для стислого рядка ( ¨).



1

Excel, 490 балів

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Конвенція для анерів Excel має брати участь у роботі A1. Змінивши це, G1скорочується 22 бали (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Іржа, оцінка 443

Нечасто Руст добре кодує гольф, але тут він перемагає багато мов

|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>



1

PHP, оцінка 584

трохи познайомився зі словником; той факт, що забивання рядка відрізає його, substrзастаріло.

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

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





0

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

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

Використовує -v прапор, щоб натиснути вхід на стек.

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

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


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