Dairesel Klavye Spiral


24

Bu bir QWERTY klavyesidir.

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'den başlayarak bu klavyede "spiral" yapabiliriz. Spiral G'de başlayacak, H'ye, sonra Y'ye, sonra T'ye, sonra F, sonra V, sonra B, sonra N, sonra J, sonra U , sonra R, sonra D, sonra C, ... vb. Meydan okumanız, 1 ≤ N ≤ 26 sayısı verildiğinde , bu spiralin ilk N karakterini çıkarmak . (Kafanız karışıksa, gönderinin sonundaki resimlere bakın.)

Yakalayış? Programınızın puanı, spiralin içinde bulunan karakterlerin indeksleriyle orantılıdır!

puanlama

  1. Kodunuzdaki her harf (büyük / küçük harf duyarlı) için, sarmaldaki o karakterin dizinini puanınıza ekleyin (1'den başlayarak).
  2. Spiralde olmayan her karakter için puanınıza 10 ekleyin.
  3. En düşük puan kazanır.

Örneğin, program print("Hello, World!")300 bir puana sahip.

Size kolaylık sağlamak için, otomatik bir program sınıf öğrencisi yazdım.

Diğer kurallar

  • Gönderiminiz bir program veya işlev olabilir.
  • Sen sürebilir N sırasıyla 0 veya 1 den başlayarak ve 25 ya da 26'da biten ancak çıkışlar hala "GHYTFVBNJURDCMKIESXLOWAZPQ" ile "G" ve sonu ile başlamalıdır.
  • Spiraldeki karakterleri sırayla çıkarmanız gerekir .
  • Bir işlev olursa, bir dize yerine bir karakter listesi döndürebilirsiniz.
  • Çıktıyı takip eden bir son satırınız olabilir.
  • Büyük harfler yerine küçük harfler veya her ikisinin birleşimini kullanabilirsiniz.

Test durumları

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

Resimler

normal klavye

Üst üste gelen sarmal:

spiral klavye


3
Birisi son zamanlarda Küre izledi ...
Pureferret

@Pureferret Beni aydınlatır mısın? Ne demek istediğinden emin değilim.
Conor O'Brien,

@ ConorO'Brien Sphere (hem roman hem de film), bir uzaylı insanlarla iki basamaklı bir sayısal kod kullanarak iletişim kurar, burada her sayı klavyedeki bir harfe benzer bir şekilde karşılık gelir .
Mühendis Toast,

Yanıtlar:


14

Japt , 304 264 162 puan

@ ConorO'Brien sayesinde 40 puan kurtarıldı

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

Çevrimiçi test edin!

Olabildiğince fazla nokta kaydetmek için, dizgenin tamamı, 3 harften oluşan her bir işlemi bir baz-36 sayı olarak yorumlayıp ardından bir kod noktasına dönüştürerek 9 Unicode karakterine yoğunlaştırılır. Programın kendisi bu sıkıştırılmış dizgiyi (tırnak işaretleri dahil 110 puana mal olur) alır ve her charkodu s36 tabanındaki bir tring'e ( başlangıçtan Gsonra ;) dönüştürerek eşler . îdolaylı olarak basılan ilk {input} karakterini alır.



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

Bir tercüman bulunabilir burada .

Açıklama:

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 0dördüncü satırdaki karakterden başlar . Çalıştırılacak ilk kod parçası 0;vg. ;girdi olarak bir sayı alır ve yığına yerleştirir. vkasada ne olduğunu (sıfır) yığına yerleştirir. Sayaç olarak kullanılacaktır. gBu, bir etikete ulaşıldığında, kontrol g, koddaki harfin diğer bir yerine geçer .

Demek burası kontrolün şu anda:

X
v
g

Diğer tüm yönlerde boşluk olduğundan, işaretçi yukarı doğru hareket etmeye başlar. vyığına sıfır yerleştirir ve Xhemen yığından çıkar. Açılan değer sıfır olduğundan, komut işaretçisi hareket eder X(aksi takdirde boşluk olarak değerlendirilir).

Varsayılan olarak, kontrol akışı sağa dönüş modundadır, bu yüzden şimdi kavşağa ulaştığında, komut gösterici sağa döner. vYine bir kez daha yığına bir sıfır iter *, kayıt birer birer artar.

v*v*v
  X
  v
  g

Bir sonraki vadım kayıt defterinde olanı (sayı 1) yığına yerleştirir, komut gösterici bir sonrakine vurarak sağa dönmeye çalışır X. Yığına yeni eklenen değer açılır ve kayıt defterine yerleştirilir. Sıfır Xolmadığından girilmez ve IP *bunun yerine sağdaki bir sonraki adıma geçer ve kayıtdaki değeri tekrar artırır.

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

Bu, bu kısmın sonuna ulaşana ve *s çizgisi başlayana kadar tekrar tekrar olur . Şimdiye kadar, kayıt defterindeki değer ASCII harfi geksi ASCII harfi olan 6'dır a. Böylece 97 *s'lik bir satırla , kayıttaki değeri 103'e yükseltiriz; bu gda yazdırmak istediğimiz harfle eşleşir . vyığına iter ve Pbir diğer etikettir P, kodun ilk satırında diğerine atladık .

İşte .yığındaki değeri çıkar ve karakter olarak yazdırır. Bundan sonra X, fazlalık sıfırı yığından çıkar, sonra yığında ~kalan iki değeri karşılaştırır (değerler sayaç ve giriş değeridir). Değerler aynıysa, operatör yığına sıfırı koyar (aksi halde -1 veya 1). Yine kontrol sağa dönmeye çalışır. XSıfır Xise ve girdikten sonra !programı sonlandırarak, yığından karşılaştırmanın değerini çıkarır .

P.X~ZZ*v+^
   X
   !

Aksi halde IP Z, bu durumda yalnızca bir adım sağa atlayan bir etiket olan sekmesine devam eder. Bunu yapmanın nedeni, atlamanın kayıttaki değeri sıfıra ayarlamasıdır. *yazmacı artırır ve vsonuç 1'i yığına yerleştirir. +yığının iki üst elemanını (1 ve sayaç) çıkarır, ekler ve sonucu yığına yerleştirir (bu sayede sayaç birer birer artar). ^sonucu, yığından çıkarmadan yığından kayıt defterine kopyalar.

#Kayıt defterindeki değeri birer birer vazaltır, azalmış değeri yığına iter, IP sağa çevirmeye çalışır Xve değeri yığından çıkar. Değer sıfır değilse, IP doğuya doğru ilerlemeye devam eder, kayıt sırasındaki değeri sıfıra düşürene kadar düşürür ve IP bir Xdal girer .

#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

Dal, sayacın değerine karşılık gelen bir etikete yönlendirir. Etikete vurulduktan sonra, kontrol, etiketle başladığımız bölümdeki etiketin diğer oluşumuna atlayarak gbaşka bir yineleme başlatır. Aynı şekilde, gkayıt defterindeki değer, yazdırmamız gereken mektubun ASCII değerine kadar artırılır. Ardından karakter yazdırılır ve sayaç artırılır, başka bir etiket seçilir. Bu, son yinelemenin ardından sayaç girişe eşit oluncaya kadar gerçekleşir ve program sona erer.

Düzenle:

P.X~Zv+^
   X *
   ! Z

İle aynı şeyi elde eder

P.X~ZZ*v+^
   X
   !

ama daha az boşlukla.

Düzenleme 2:

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

Yerine kullanılabilir:

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

2
"Spiral" olarak adlandırılan bir dilin spiral çıkış probleminde bu kadar yüksek bir puan alması ironik.
Shirkam

6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Çevrimiçi deneyin!

Bu bir kıyaslama ölçütü, daha iyi bir yol olması gerektiğini düşünüyorum, ama şimdiye kadar bulduğum en iyisi.

açıklama

Sanırım bunu Haskell'e aşina olmayanlar için açıklamalıyım. İşlev takelistenin ilk n elemanlarını alır. Buna şöyle denir:

take n list

Sokmanın ilk n elemanlarını almak istiyoruz "GHYTFVBNJURDCMKIESXLOWAZPQ", bu yüzden gibi bir şey istiyoruz

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Yine de daha iyisini yapabiliriz, takebackticks kullanarak yerleştirebiliriz.

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

Ve şimdi bu noktasuz yapılabilir

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

partialClojure'da kullanılmasını gerektiren kısmi bir uygulama . Bunun için gidiyordum ama partialçok pahalıydı.
Carcigenicate

3
470 puanın değil mi? Bu sorudaki snippet'in bana verdiği şey ...
Sadece bir öğrenci,



4

Befunge, Puan: 531

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

Çıktının spiral olması durumunda da bu zorluğun daha ilginç olacağını düşünüyorum.


4

TI-Basic (TI-84 Artı CE), 454 432 puan

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-Conor O'Brien'dan 22 puan

İle koş 5:prgmNAME.

İade / yazdırır subgelen dize 1kadar Ans(sayı girişi).

TI-Basic tokenize bir dildir , bu yüzden bunu belirteçlerin byte değerleriyle puanlarım.

sub( 0xbb 0x0c, yani 20

"0x2a, yani *, 10 * 2 = 20

Büyük harfler değişmez, dize 351'dir

,0x2b, yani +, 10 * 2 = 20

10x31, 1yani 10

Ans0x72, ryani 11

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


Puanlama kurallarının bu yorumuyla, yaratıcı yerlerdeki harfleri arayarak 31 bayttan tasarruf edebilirsiniz. Her biri 17 puan alan s, a, z, p (STAT + 5 menüsünde) stat değişkenleriyle S, A, Z, P değiştirin: bunlar ilk baytı b'ye karşılık gelen 2 baytlık simgelerdir. Her biri 20 puan alan sıradan küçük harflerle O, W, Q değiştirin: bunlar 2 baytlık simgelerdir. 0xBBBF, 0xBBC7, 0xBBC1.
Misha Lavrov

3

Python 3, puan = 762 753

1 tabanlı giriş. Bu, 37 harf içermeyen kullandığı için, önemsiz yaklaşımdan daha kötü. Yine de biraz ilginç.

-9 Leo sayesinde .

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

Çevrimiçi deneyin!


1
Bu arada bu yaklaşım :) gibi [:g*3][-3:]olabilir [g*3-3:g*3]9 puanlık toplam puanı düşürücü
Leo


2

Brainf ** k, puan = 2690

Arasında değişen giriş tek bir bayt 0x1için 0x1a.

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

Çevrimiçi deneyin!


2

APL (Dyalog) , puan: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Çevrimiçi deneyin!

Dyalog’daki Latin harflerinin tek kullanımı değişken isimlerinde ve bazı sistem işlevlerindedir. Bunun dışında sadece glifler ve bazı Yunanca harfler kullanılmıştır.


1

Python 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

Çevrimiçi deneyin!

Python'un dizeleri dilimlemesini kullanan isimsiz bir lambda ( "asdf"[:i]ilk ikarakterlerini alır "asdf")


1

Clojure, 484 474 puan

-10 puan çünkü görünüşe göre bir %sayı onları ayıran bir boşluk olmadan var olabilir! Geri dönüp bazı başvuruları iyileştirmem gerekebilir.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Anonim bir işlev. Temel olarak, zaten kaydedilmiş olanın bir Clojure limanı. Güzel puanlar! Sanırım bu, bugüne kadar yazdığım tek bir boşluk içermeyen ilk Clojure programı.

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



1

Kabuğu , 293 bayt

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

Bu bulabildiğim en kısa, bir sonraki ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨293 puanına yaklaşan ..

Çevrimiçi deneyin!

açıklama

Kaba kuvvet arama, tüm küçük harflerin en iyi skoru verdiğini ortaya koydu. Temelde @Wheat Wizard'ın take(, ) sıkıştırılmış bir dizesindeki ( ¨) çözümüyle aynıdır .



1

Excel, 490 puan

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Excel kullanıcıları için Sözleşme girdi almaktır A1. Bunu değiştirmek G122 puan keser (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Pas, 443 puan

Rust kod golfta genellikle iyi değildir ancak burada birçok dili yener.

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


1

Javascript ES6, 527 puan

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

Dene !

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 puan

sözlük ile biraz kemandı; ipi xor ile kesmek gerçeği ortadan kaldırır hale getirir substr.

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

Çevrimiçi deneyin .



0

Pyth , puan: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Burada dene.

Nasıl?

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


0

> <> , 558 + 16 = 574 puan

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

-vGirdiyi yığına itmek için bayrağı kullanır .

Spirali istifin tersi sıraya doğru iter, ardından girişi en üste döndürür. Ardından, yığının üstü sıfır olmadığında, sonraki harfi yazdırır ve yığının tepesini azaltır.

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.