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
- 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).
- Dla każdej postaci spoza spirali dodaj 10 do swojego wyniku.
- 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
Spirala nałożyła się:
ascii-art
code-challenge
keyboard
Conor O'Brien
źródło
źródło
Odpowiedzi:
Japt ,
304264162 punktyZaoszczędź 40 punktów dzięki @ ConorO'Brien
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
c
kod har, konwertując go nas
tring w bazie-36 (G
po;
początku).î
pobiera pierwsze {input} znaki tego, które są domyślnie drukowane.źródło
C, wynik: 544
Wypróbuj online!
źródło
g
jest to najtańsza litera na punktację użytą w wyzwaniu.Spirala , wynik:
619215127471546554191Tłumacz można znaleźć tutaj .
Wyjaśnienie:
Program rozpoczyna się od
0
znaku w czwartej linii. Pierwszy fragment kodu do uruchomienia to0;vg
.;
pobiera liczbę jako dane wejściowe i umieszcza ją na stosie.v
umieszcza to, co jest w rejestrze (zero) na stosie. Będzie używany jako licznik.g
jest etykietą, gdy zostanie osiągnięta, formant przeskakuje do innego wystąpienia literyg
w kodzie.Oto, gdzie jest teraz kontrola:
Ponieważ we wszystkich innych kierunkach jest spacja, wskaźnik instrukcji zaczyna się przesuwać w górę.
v
umieszcza zero na stosie iX
natychmiast wyskakuje ze stosu. Ponieważ wyświetlana wartość wynosi zero, wskaźnik instrukcji przesuwa się naX
(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.
v
jeszcze raz wypycha zero do stosu,*
zwiększa rejestr o jeden.Następnie
v
umieszcza w stosie zawartość rejestru (numer 1), wskaźnik instrukcji próbuje obrócić się w prawo, uderzając w następnyX
. Wartość właśnie dodana do stosu jest usuwana i umieszczana w rejestrze. Ponieważ jest niezerowy,X
nie jest wprowadzany, a adres IP przechodzi do następnego*
po prawej stronie, ponownie zwiększając wartość w rejestrze.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 literag
ASCII minus litera ASCIIa
. Zatem za pomocą linii 97*
s zwiększamy wartość rejestru do 103, która odpowiada literze,g
którą chcemy wydrukować.v
wpycha go do stosu iP
jest kolejną etykietą po uderzeniu, którą przeskakujemy do drugiejP
w pierwszym wierszu kodu.Tutaj
.
wyskakuje wartość ze stosu i drukuje ją jako znak. NastępnieX
wyskakuje 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.X
wyświetla wartość porównania ze stosu, jeśli wynosi zeroX
, a po jej!
wprowadzeniu kończy działanie programu.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 iv
umieszcza 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,v
wypycha zmniejszoną wartość na stos, adres IP próbuje skręcić w prawo, aX
wyskakuje 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 doX
gałęzi.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 przypadkug
, 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ć:
Osiąga to samo, co
ale z mniejszą ilością białych znaków.
Edycja 2:
Może być używany zamiast:
źródło
Haskell , 471
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
take
przyjmuje pierwsze n elementów listy. Nazywa się to tak:Chcemy wziąć pierwsze n elementów żądła
"GHYTFVBNJURDCMKIESXLOWAZPQ"
, więc chcemy coś takiegoMożemy jednak zrobić lepiej, możemy naprawić iniekcje
take
za pomocą backticksaA teraz można to uczynić bezcelowym
źródło
partial
w Clojure. Po to właśnie chciałem, alepartial
było za drogie.Galaretka , 211 punktów
19 bajtów
Wypróbuj online!
zaoszczędził sporo punktów dzięki sugestii Emigny
œ?
: Dźródło
Vim ,
461418Dzięki @pacholik za wynik -43!
Wypróbuj online!
źródło
CGHYTFVBNJURDCMKIESXLOWAZPQg©G@" D
(© to ucieczka)Befunge, wynik: 531
Wydaje mi się, że to wyzwanie byłoby bardziej interesujące, gdyby produkcja również musiała przebiegać spiralnie.
źródło
TI-Basic (TI-84 Plus CE),
454432 punkty-22 punktów od Conora O'Briena
Uruchom z
5:prgmNAME
.Zwraca / drukuje
sub
ciąg od1
doAns
(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 = 20Wielkie litery nie zmieniają się, więc ciąg ma wartość 351
,
wynosi 0x2b,+
więc 10 * 2 = 201
jest 0x311
, więc 10Ans
to 0x72, czylir
1120 + 20 + 351 + 20 + 10 + 11 = 432
źródło
Python 3, wynik =
7627531 wejście. Jest to gorsze niż trywialne podejście, ponieważ wykorzystuje 37 nie-liter. Jest to jednak dość interesujące.
-9 dzięki Leo .
Wypróbuj online!
źródło
[:g*3][-3:]
może stać się[g*3-3:g*3]
obniżenie całkowitego wyniku o 9 punktów05AB1E , wynik: 204
Wypróbuj online!
źródło
Brainf ** k, wynik = 2690
Wprowadź pojedynczy bajt od
0x1
do0x1a
.Wypróbuj online!
źródło
APL (Dyalog) , wynik: 391
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.
źródło
Python 3, 522
Wypróbuj online!
Anonimowa lambda wykorzystująca krojenie ciągów znaków przez Pythona (
"asdf"[:i]
pobiera pierwszei
znaki"asdf"
)źródło
Clojure,
484474 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.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.
źródło
Ly , 521 punktów
Wypróbuj online!
Nie wydaje mi się, że można to zoptymalizować.
źródło
Bash , wynik: 465
Wypróbuj online!
źródło
Łuska , 293 bajtów
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 (¨
).źródło
Common Lisp, wynik: 580
Wypróbuj online!
źródło
Excel, 490 punktów
Konwencja dla anserów programu Excel ma pobierać dane wejściowe
A1
. Zmieniając to naG1
22 punktów (468).źródło
C # , wynik 546
źródło
Rdza, wynik 443
Rdza nie jest często dobra w golfie kodowym, ale tutaj bije wiele języków
źródło
Golang, wynik 861
Zagraj online!
źródło
JavaScript ES6, 527 punktów
Spróbuj !
źródło
PHP, 590 punktów
Wypróbuj online!
źródło
PHP, wynik 584
bawił się trochę słownikiem; fakt, że xoring sznurka odcina go, staje się
substr
przestarzały.Wypróbuj online .
źródło
Mathematica, 528
Wypróbuj online!
źródło
Pyth , wynik: 371
Wypróbuj tutaj.
W jaki sposób?
źródło
Ruby , 453 punktów
Wypróbuj online!
źródło
> <> , 558 + 16 = 574 punkty
Używa
-v
flagi 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!
źródło
Pyth , 261 punktów
Wypróbuj tutaj!
To wyświetla dużą literę. W przypadku małych liter możesz wypróbować alternatywny bajt 261 .
źródło