Spiral Keyboard Melingkar


24

Ini adalah keyboard 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

Kita bisa "spiral keluar" pada keyboard ini, mulai dari G. Spiral akan mulai dari G, pergi ke H, lalu ke Y, lalu ke T, lalu F, lalu V, lalu B, lalu N, lalu J, lalu U , lalu R, lalu D, lalu C, ... dll. Tantangan Anda adalah, mengingat angka 1 ≤ N ≤ 26, menghasilkan karakter N pertama dalam spiral ini. (Jika Anda bingung, lihat gambar di akhir posting.)

Tangkapan? Skor program Anda sebanding dengan indeks karakter yang ditemukan di dalam spiral!

Mencetak gol

  1. Untuk setiap huruf (tidak peka huruf besar-kecil) dalam kode Anda, tambahkan indeks karakter tersebut di dalam spiral ke skor Anda (mulai dari 1).
  2. Untuk setiap karakter yang tidak ada dalam spiral, tambahkan 10 ke skor Anda.
  3. Skor terendah menang.

Misalnya, program print("Hello, World!")memiliki skor 300.

Untuk kenyamanan Anda, saya telah menulis program grader otomatis.

Aturan lainnya

  • Kiriman Anda dapat berupa program atau fungsi.
  • Anda dapat mengambil N mulai dari 0 atau 1 dan berakhir pada 25 atau 26, masing-masing, tetapi output masih harus dimulai dengan "G" dan diakhiri dengan "GHYTFVBNJURDCMKIESXLOWAZPQ".
  • Anda harus menampilkan karakter dalam spiral secara berurutan .
  • Jika suatu fungsi, Anda dapat mengembalikan daftar karakter alih-alih string.
  • Anda mungkin memiliki satu trailing newline mengikuti output.
  • Anda dapat menggunakan huruf kecil alih-alih huruf besar, atau kombinasi keduanya.

Uji kasus

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

Foto-foto

keyboard biasa

Spiral yang ditumpangkan:

keyboard spiral


3
Seseorang telah menyaksikan Sphere baru-baru ini ...
Pureferret

@ Pureferret Bisakah Anda memberi tahu saya? Saya tidak yakin apa yang Anda rujuk.
Conor O'Brien

@ ConorO'Brien In Sphere (baik novel dan film), seorang alien berkomunikasi dengan manusia menggunakan kode numerik dua digit di mana setiap angka berhubungan dengan huruf pada keyboard dalam pola yang sangat mirip .
Engineer Toast

Jawaban:


14

Japt , 304 264 162 poin

Menyimpan 40 poin berkat @ ConorO'Brien

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

Uji secara online!

Untuk menyimpan poin sebanyak mungkin, seluruh string dikondensasi menjadi 9 karakter Unicode dengan menginterpretasikan setiap proses 3 huruf sebagai angka dasar-36, kemudian mengkonversi ke titik kode. Program itu sendiri mengambil string terkompresi ini (yang biayanya 110 poin, termasuk tanda kutip) dan memetakan setiap ckode sandi dengan mengonversinya menjadi string di base-36 ( Gsetelah ;di awal). îmengambil {input} chars pertama dari ini, yang dicetak secara implisit.



11

Spiral , skor:  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

Seorang juru bahasa dapat ditemukan di sini .

Penjelasan:

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 dimulai pada 0karakter di baris keempat. Potongan kode pertama yang dijalankan adalah 0;vg. ;mengambil nomor sebagai input dan menempatkannya di tumpukan. vmenempatkan apa yang ada di register (nol) ke dalam tumpukan. Ini akan digunakan sebagai penghitung. gadalah label, ketika tercapai, kontrol melompat ke kemunculan huruf gdalam kode.

Jadi di sinilah kontrolnya sekarang:

X
v
g

Karena ada spasi putih di semua arah lain, penunjuk instruksi mulai bergerak ke atas. vmenempatkan nol ke dalam tumpukan, dan Xsegera mengeluarkannya dari tumpukan. Karena nilai yang muncul adalah nol, penunjuk instruksi bergerak ke X(jika tidak akan memperlakukannya sebagai spasi).

Secara default, aliran kontrol dalam mode belok kanan, jadi sekarang ketika mencapai persimpangan, penunjuk instruksi berbelok ke kanan. vlagi-lagi mendorong angka nol ke tumpukan, *menambah register dengan satu.

v*v*v
  X
  v
  g

Tempat berikutnya vapa yang ada di register (nomor 1) ke dalam tumpukan, penunjuk instruksi mencoba untuk berbelok ke kanan, memukul yang berikutnya X. Nilai yang baru ditambahkan ke stack muncul dan ditempatkan di register. Karena itu bukan nol, Xtidak dimasukkan, dan IP melanjutkan ke yang berikutnya *di sebelah kanan, lagi-lagi menambah nilai dalam register.

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

Ini terjadi berulang-ulang sampai kita mencapai akhir bagian ini dan garis *s dimulai. Sekarang nilai dalam register adalah 6, yaitu surat gASCII dikurangi surat ASCII a. Maka dengan garis 97 *detik kami menambah nilai dalam register menjadi 103, yang cocok dengan huruf yang gingin kami cetak. vmendorongnya ke tumpukan, dan Plabel lain setelah memukul yang kita lompat ke yang lain Pdi baris pertama kode.

Di sini .muncul nilai dari tumpukan dan mencetaknya sebagai karakter. Setelah itu Xmuncul nol asing dari tumpukan, kemudian ~membandingkan dua nilai yang tersisa di tumpukan (nilai menjadi penghitung dan nilai input). Jika nilainya sama, operator menempatkan nol dalam tumpukan (jika tidak -1 atau 1). Sekali lagi, kontrol mencoba berbelok ke kanan. Xmuncul nilai perbandingan dari tumpukan, jika itu nol X,, dan setelah !dimasukkan, mengakhiri program.

P.X~ZZ*v+^
   X
   !

Kalau tidak, IP berlanjut ke Z, yang merupakan label yang dalam hal ini hanya melompat satu langkah ke kanan. Alasan untuk melakukan ini adalah bahwa melompat menetapkan nilai dalam register kembali ke nol. *menambah register dan vmenempatkan 1 yang dihasilkan ke dalam tumpukan. +muncul dua elemen teratas tumpukan (1 dan penghitung), menambahkannya, dan menempatkan hasilnya di tumpukan (pada dasarnya ini menambah penghitung dengan satu). ^menyalin hasil dari tumpukan ke register tanpa menghapusnya dari tumpukan.

#mengurangi nilai dalam register dengan satu, vmendorong nilai yang dikurangi ke stack, IP mencoba untuk berbelok ke kanan, dan Xmuncul nilai dari stack. Jika nilainya tidak nol, IP terus bergerak ke timur, menurunkan nilai dalam register, hingga mencapai nol, dan IP memasuki Xcabang.

#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

Cabang mengarah ke label yang sesuai dengan nilai penghitung. Setelah memukul label, kontrol melompat ke kemunculan label lainnya di bagian di mana kita mulai dengan label g, memulai iterasi lain. Seperti halnya g, nilai dalam register akan bertambah hingga nilai ASCII dari surat yang perlu kita cetak. Kemudian karakter dicetak dan penghitung bertambah, label lain dipilih. Ini terjadi sampai setelah iterasi terakhir penghitung sama dengan input, dan program berakhir.

Edit:

P.X~Zv+^
   X *
   ! Z

Mencapai hal yang sama dengan

P.X~ZZ*v+^
   X
   !

tetapi dengan spasi yang lebih sedikit.

Edit 2:

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

Dapat digunakan sebagai ganti:

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

2
Ironisnya, bahasa yang disebut "Spiral" memiliki skor tinggi dalam masalah keluaran spiral.
Shirkam

6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Cobalah online!

Ini sedikit patokan, saya merasa harus ada cara yang lebih baik, tapi ini yang terbaik yang saya temukan sejauh ini.

Penjelasan

Kurasa aku harus menjelaskan ini untuk mereka yang tidak terlalu mengenal Haskell. Fungsi ini takemengambil elemen n pertama dari daftar. Disebut seperti ini:

take n list

Kami ingin mengambil elemen pertama dari sengatan "GHYTFVBNJURDCMKIESXLOWAZPQ", jadi kami ingin sesuatu seperti

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Kita bisa melakukan yang lebih baik, kita dapat menambahkan takemenggunakan backticks

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

Dan sekarang ini bisa dibuat pointfree

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Ini memalukan aplikasi parsial perlu menggunakan partialdi Clojure. Ini adalah tujuan saya, tetapi partialterlalu mahal.
Carcigenicate

3
Bukankah skor Anda 470? Itulah yang diberikan potongan itu dalam pertanyaan saya ...
Hanya seorang siswa



4

Befunge, Nilai: 531

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

Saya merasa tantangan ini akan lebih menarik jika output harus dalam spiral juga.


4

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

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 poin dari Conor O'Brien

Jalankan dengan 5:prgmNAME.

Mengembalikan / mencetak substring dari 1ke Ans(input nomor).

TI-Basic adalah bahasa yang tokenized , jadi saya mencetak ini dengan nilai byte dari token.

sub( adalah 0xbb 0x0c, jadi 20

" adalah 0x2a, jadi * , jadi 10 * 2 = 20

Huruf besar tidak berubah, jadi stringnya 351

,adalah 0x2b, jadi +, jadi 10 * 2 = 20

1adalah 0x31, jadi 1, jadi 10

Ans adalah 0x72, yaitu r , jadi, jadi 11

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


Dengan interpretasi aturan penilaian ini, Anda dapat menyimpan 31 byte lebih banyak dengan mencari huruf di tempat-tempat kreatif. Ganti S, A, Z, P dengan variabel stat s, a, z, p (dalam menu STAT + 5), yang masing-masing skornya 17 poin: mereka token 2-byte yang byte pertamanya berkorespondensi dengan b. Ganti O, W, Q dengan huruf kecil biasa, yang masing-masing skor 20 poin: mereka token 2-byte 0xBBBF, 0xBBC7, 0xBBC1.
Misha Lavrov

3

Python 3, skor = 762 753

Input berbasis 1. Ini lebih buruk daripada pendekatan sepele, karena menggunakan 37 non-huruf. Ini agak menarik.

Terima kasih untuk Leo .

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

Cobalah online!


1
Saya suka pendekatan ini :) Ngomong-ngomong [:g*3][-3:]bisa [g*3-3:g*3]menurunkan skor total dengan 9 poin
Leo


2

Brainf ** k, skor = 2690

Masukkan satu byte mulai dari 0x1hingga 0x1a.

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

Cobalah online!


2

APL (Dyalog) , skor: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Cobalah online!

Satu-satunya penggunaan untuk huruf Latin di Dyalog adalah dalam nama variabel dan beberapa fungsi sistem. Selain itu, hanya mesin terbang dan beberapa huruf Yunani yang digunakan.


1

Python 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

Cobalah online!

Lambda anonim yang memanfaatkan sling string Python ( "asdf"[:i]mendapat ikarakter pertama "asdf")


1

Clojure, 484 474 poin

-10 poin karena ternyata %bisa ada setelah angka tanpa spasi memisahkan mereka !? Saya mungkin harus kembali dan meningkatkan beberapa pengiriman.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Fungsi anonim. Pada dasarnya port Clojure dari apa yang sudah diposting. Skor bagus! Saya pikir ini adalah program Clojure pertama yang pernah saya tulis yang tidak mengandung satu ruang.

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



1

Sekam , 293 byte

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

Ini adalah yang terpendek yang dapat saya temukan, lebih dekat berikutnya ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨dengan skor 293 ..

Cobalah online!

Penjelasan

Pencarian brute force, ternyata semua huruf kecil memberi skor terbaik. Ini pada dasarnya sama dengan solusi @Wheat Wizard, take( ) pada string terkompresi ( ¨).



1

Excel, 490 poin

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Convention for Excel ansers adalah untuk mengambil input dari A1. Mengubah ini untuk G1memotong 22 poin (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Rust, skor 443

Jarang bahwa Rust pandai kode golf tetapi di sini ia mengalahkan banyak bahasa

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


1

Javascript ES6, 527 poin

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

Cobalah !

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

mengotak-atik kamus; fakta bahwa xoring string memotongnya menjadi substrusang.

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

Cobalah online .



0

Pyth , skor: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Coba di sini.

Bagaimana?

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


0

> <> , 558 + 16 = 574 poin

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

Menggunakan -v bendera untuk mendorong input ke tumpukan.

Dorong spiral ke tumpukan dengan urutan terbalik, lalu putar input ke atas. Kemudian, sementara bagian atas tumpukan bukan nol, cetak huruf berikutnya dan kurangi bagian atas tumpukan.

Cobalah online!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.