Okrągła klawiatura spiralna


24

To jest klawiatura 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

Możemy „wyskoczyć” na tej klawiaturze, zaczynając od G. Spirala rozpocznie się od G, przejdź do H, następnie do Y, następnie do T, następnie F, następnie V, następnie B, następnie N, następnie J, a następnie U , następnie R, następnie D, a następnie C, ... itd. Twoim zadaniem jest, aby, biorąc pod uwagę liczbę 1 ≤ N ≤ 26, wypisać pierwsze N znaków w tej spirali. (Jeśli jesteś zdezorientowany, zapoznaj się ze zdjęciami na końcu postu).

Haczyk? Wynik twojego programu jest proporcjonalny do wskaźników postaci znajdujących się wewnątrz spirali!

Punktacja

  1. Do każdej litery (bez rozróżniania wielkich i małych liter) w kodzie dodaj indeks tego znaku na spirali do swojego wyniku (od 1).
  2. Dla każdej postaci spoza spirali dodaj 10 do swojego wyniku.
  3. Najniższy wynik wygrywa.

Na przykład program print("Hello, World!")ma wynik 300.

Dla Twojej wygody napisałem automatyczną równiarkę programów.

Inne zasady

  • Twoje zgłoszenie może być programem lub funkcją.
  • Możesz wziąć N zaczynając odpowiednio od 0 lub 1, a kończąc na 25 lub 26, ale wyjścia powinny nadal zaczynać się od „G” i kończyć na „GHYTFVBNJURDCMKIESXLOWAZPQ”.
  • Musisz wypisywać znaki w spirali w kolejności .
  • Jeśli funkcja, możesz zwrócić listę znaków zamiast ciągu.
  • Możesz mieć jeden końcowy znak nowej linii po wyjściu.
  • Możesz używać małych liter zamiast wielkich liter lub ich kombinacji.

Przypadki testowe

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

Kino

zwykła klawiatura

Spirala nałożyła się:

klawiatura spiralna


3
Ktoś ostatnio oglądał Sferę ...
Pureferret

@Pureferret Czy możesz mnie oświecić? Nie jestem pewien, o czym mówisz.
Conor O'Brien

@ ConorO'Brien W kuli (zarówno powieści, jak i filmu) kosmita komunikuje się z ludźmi za pomocą dwucyfrowego kodu numerycznego, przy czym każdy numer odpowiada literze na klawiaturze w bardzo podobny wzór .
Engineer Toast

Odpowiedzi:


14

Japt , 304 264 162 punkty

Zaoszczędź 40 punktów dzięki @ ConorO'Brien

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

Przetestuj online!

Aby zaoszczędzić jak najwięcej punktów, cały ciąg jest zagęszczany do 9 znaków Unicode, interpretując każdy ciąg 3 liter jako liczbę podstawową 36, a następnie konwertując do punktu kodowego. Sam program pobiera ten skompresowany ciąg (który kosztuje 110 punktów, w tym cudzysłowy) i mapuje każdy ckod har, konwertując go na string w bazie-36 ( Gpo ;początku). îpobiera pierwsze {input} znaki tego, które są domyślnie drukowane.



11

Spirala , wynik:  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

Tłumacz można znaleźć tutaj .

Wyjaśnienie:

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

Program rozpoczyna się od 0znaku w czwartej linii. Pierwszy fragment kodu do uruchomienia to 0;vg. ;pobiera liczbę jako dane wejściowe i umieszcza ją na stosie. vumieszcza to, co jest w rejestrze (zero) na stosie. Będzie używany jako licznik. gjest etykietą, gdy zostanie osiągnięta, formant przeskakuje do innego wystąpienia litery gw kodzie.

Oto, gdzie jest teraz kontrola:

X
v
g

Ponieważ we wszystkich innych kierunkach jest spacja, wskaźnik instrukcji zaczyna się przesuwać w górę. vumieszcza zero na stosie i Xnatychmiast wyskakuje ze stosu. Ponieważ wyświetlana wartość wynosi zero, wskaźnik instrukcji przesuwa się na X(w przeciwnym razie traktowałby to jako spację).

Domyślnie przepływ sterowania jest w trybie skrętu w prawo, więc teraz, gdy dotrze do skrzyżowania, wskaźnik instrukcji skręca w prawo. vjeszcze raz wypycha zero do stosu, *zwiększa rejestr o jeden.

v*v*v
  X
  v
  g

Następnie vumieszcza w stosie zawartość rejestru (numer 1), wskaźnik instrukcji próbuje obrócić się w prawo, uderzając w następny X. Wartość właśnie dodana do stosu jest usuwana i umieszczana w rejestrze. Ponieważ jest niezerowy, Xnie jest wprowadzany, a adres IP przechodzi do następnego *po prawej stronie, ponownie zwiększając wartość w rejestrze.

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

Dzieje się to raz za razem, dopóki nie dojdziemy do końca tej części i nie *rozpocznie się linia s. Do tej pory wartość w rejestrze wynosi 6, czyli litera gASCII minus litera ASCII a. Zatem za pomocą linii 97 *s zwiększamy wartość rejestru do 103, która odpowiada literze, gktórą chcemy wydrukować. vwpycha go do stosu i Pjest kolejną etykietą po uderzeniu, którą przeskakujemy do drugiej Pw pierwszym wierszu kodu.

Tutaj .wyskakuje wartość ze stosu i drukuje ją jako znak. Następnie Xwyskakuje zewnętrzne zero ze stosu, a następnie ~porównuje dwie pozostałe wartości na stosie (wartości to licznik i wartość wejściowa). Jeśli wartości są takie same, operator umieszcza zero na stosie (w przeciwnym razie -1 lub 1). Znów kontrola próbuje skręcić w prawo. Xwyświetla wartość porównania ze stosu, jeśli wynosi zero X, a po jej !wprowadzeniu kończy działanie programu.

P.X~ZZ*v+^
   X
   !

W przeciwnym razie adres IP przechodzi do Z, który jest etykietą, która w tym przypadku przeskakuje tylko jeden krok w prawo. Powodem tego jest to, że przeskakiwanie ustawia wartość w rejestrze z powrotem na zero. *inkrementuje rejestr i vumieszcza wynikowy 1 w stosie. +wysuwa dwa górne elementy stosu (1 i licznik), dodaje je i umieszcza wynik na stosie (w efekcie licznik zwiększa się o jeden). ^kopiuje wynik ze stosu do rejestru bez usuwania go ze stosu.

#zmniejsza wartość w rejestrze o jeden, vwypycha zmniejszoną wartość na stos, adres IP próbuje skręcić w prawo, a Xwyskakuje wartość ze stosu. Jeśli wartość jest niezerowa, IP przesuwa się na wschód, zmniejszając wartość w rejestrze, aż osiągnie zero, a IP wejdzie do Xgałęzi.

#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

Gałąź prowadzi do etykiety odpowiadającej wartości licznika. Po uderzeniu w etykietę kontrolka przeskakuje do innego wystąpienia etykiety w sekcji, w której zaczynaliśmy od etykiety g, rozpoczynając kolejną iterację. Podobnie jak w przypadku g, wartość w rejestrze jest zwiększana do wartości ASCII litery, którą musimy wydrukować. Następnie znak jest drukowany, a licznik zwiększany, wybierana jest kolejna etykieta. Dzieje się tak, dopóki po ostatniej iteracji licznik nie zrówna się z wejściem, a program się kończy.

Edytować:

P.X~Zv+^
   X *
   ! Z

Osiąga to samo, co

P.X~ZZ*v+^
   X
   !

ale z mniejszą ilością białych znaków.

Edycja 2:

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

Może być używany zamiast:

*****************************************************************vP

2
Jak na ironię, languaje zwane „Spiral” ma tak wysoki wynik w problemie z wyjściem spiralnym.
Shirkam

6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Wypróbuj online!

Jest to trochę punkt odniesienia, wydaje mi się, że musi istnieć lepszy sposób, ale jest to najlepszy, jaki do tej pory znalazłem.

Wyjaśnienie

Przypuszczam, że powinienem to wyjaśnić osobom niezbyt dobrze znającym Haskella. Funkcja takeprzyjmuje pierwsze n elementów listy. Nazywa się to tak:

take n list

Chcemy wziąć pierwsze n elementów żądła "GHYTFVBNJURDCMKIESXLOWAZPQ", więc chcemy coś takiego

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Możemy jednak zrobić lepiej, możemy naprawić iniekcje takeza pomocą backticksa

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

A teraz można to uczynić bezcelowym

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Szkoda, że ​​częściowa aplikacja wymaga użycia partialw Clojure. Po to właśnie chciałem, ale partialbyło za drogie.
Carcigenicate

3
Czy twój wynik nie wynosi 470? To właśnie daje mi ten fragment pytania ...
Tylko student



4

Befunge, wynik: 531

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

Wydaje mi się, że to wyzwanie byłoby bardziej interesujące, gdyby produkcja również musiała przebiegać spiralnie.


4

TI-Basic (TI-84 Plus CE), 454 432 punkty

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 punktów od Conora O'Briena

Uruchom z 5:prgmNAME.

Zwraca / drukuje subciąg od 1do Ans(wprowadzanie liczby).

TI-Basic jest tokenizowanym językiem , więc oceniam to według wartości bajtów tokenów.

sub( to 0xbb 0x0c, więc 20

"wynosi 0x2a, *więc 10 * 2 = 20

Wielkie litery nie zmieniają się, więc ciąg ma wartość 351

,wynosi 0x2b, +więc 10 * 2 = 20

1jest 0x31 1, więc 10

Ansto 0x72, czyli r11

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


Dzięki takiej interpretacji reguł oceniania możesz zaoszczędzić 31 bajtów więcej, szukając liter w kreatywnych miejscach. Zastąp S, A, Z, P zmiennymi statystycznymi s, a, z, p (w menu STAT + 5), które zdobywają po 17 punktów: są to 2-bajtowe tokeny, których pierwszy bajt odpowiada b. Zamień O, W, Q zwykłymi małymi literami, które zdobywają po 20 punktów: są to 2-bajtowe tokeny 0xBBBF, 0xBBC7, 0xBBC1.
Misza Ławrow

3

Python 3, wynik = 762 753

1 wejście. Jest to gorsze niż trywialne podejście, ponieważ wykorzystuje 37 nie-liter. Jest to jednak dość interesujące.

-9 dzięki Leo .

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

Wypróbuj online!


1
Podoba mi się to podejście :) Nawiasem mówiąc, [:g*3][-3:]może stać się [g*3-3:g*3]obniżenie całkowitego wyniku o 9 punktów
Leo


2

Brainf ** k, wynik = 2690

Wprowadź pojedynczy bajt od 0x1do 0x1a.

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

Wypróbuj online!


2

APL (Dyalog) , wynik: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Wypróbuj online!

Jedynym zastosowaniem liter łacińskich w Dyalogu są nazwy zmiennych i niektóre funkcje systemowe. Oprócz tego używane są tylko glify i niektóre greckie litery.


1

Python 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

Wypróbuj online!

Anonimowa lambda wykorzystująca krojenie ciągów znaków przez Pythona ( "asdf"[:i]pobiera pierwsze iznaki "asdf")


1

Clojure, 484 474 punkty

-10 punktów, ponieważ podobno %może istnieć po numerze bez spacji oddzielającej je !? Być może będę musiał wrócić i poprawić niektóre zgłoszenia.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Anonimowa funkcja. Zasadniczo port Clojure tego, co już zostało opublikowane. Ładnie wyniki! Myślę, że to pierwszy program Clojure, jaki kiedykolwiek napisałem, który nie zawiera ani jednej spacji.

(defn spiral [n]
  ; Substring the hardcoded list, going from index 0 to n
  (subs "ghytfvbnjurdcmkiesxlowazpq" 0 n))



1

Łuska , 293 bajtów

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

Jest to najkrótszy, jaki udało mi się znaleźć, a następnie bliżej, ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨aby uzyskać wynik 293 ..

Wypróbuj online!

Wyjaśnienie

Okazało się, że wyszukiwanie metodą „brute-force” wszystkie małe litery dały najlepszy wynik. Jest to w zasadzie to samo, co rozwiązanie @Wheat Wizard take( ) na skompresowanym łańcuchu ( ¨).



1

Excel, 490 punktów

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Konwencja dla anserów programu Excel ma pobierać dane wejściowe A1. Zmieniając to na G122 punktów (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Rdza, wynik 443

Rdza nie jest często dobra w golfie kodowym, ale tutaj bije wiele języków

|g|&"GHYTFVBNJURDCMKIESXLOWAZPQ"[..g]


1

JavaScript ES6, 527 punktów

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

Spróbuj !

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, wynik 584

bawił się trochę słownikiem; fakt, że xoring sznurka odcina go, staje się substrprzestarzały.

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

Wypróbuj online .



0

Pyth , wynik: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Wypróbuj tutaj.

W jaki sposób?

<"GHYTFVBNJURDCMKIESXLOWAZPQ"Q   implicit string end, implicit input
<                            Q   first Q(=input) elements ...
 "GHYTFVBNJURDCMKIESXLOWAZPQ"    ... of this string


0

> <> , 558 + 16 = 574 punkty

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

Używa -vflagi do wypchnięcia danych wejściowych na stos.

Wsuwa spiralę na stos w odwrotnej kolejności, a następnie obraca wejście do góry. Następnie, gdy górna część stosu jest różna od zera, drukuje następną literę i zmniejsza górną część stosu.

Wypróbuj online!


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.