Clavier circulaire en spirale

24

Il s'agit d'un clavier 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

On peut "sortir en spirale" sur ce clavier, à partir de G. La spirale va commencer à G, aller à H, puis à Y, puis à T, puis F, puis V, puis B, puis N, puis J, puis U , puis R, puis D, puis C, ... etc. Votre défi consiste à, étant donné un nombre 1 ≤ N ≤ 26, sortir les N premiers caractères de cette spirale. (Si vous êtes confus, reportez-vous aux photos à la fin du post.)

Le hic? Le score de votre programme est proportionnel aux indices de caractères trouvés à l'intérieur de la spirale!

Notation

  1. Pour chaque lettre (insensible à la casse) de votre code, ajoutez l'index de ce caractère dans la spirale à votre score (à partir de 1).
  2. Pour chaque personnage qui n'est pas dans la spirale, ajoutez 10 à votre score.
  3. Le score le plus bas l'emporte.

Par exemple, le programme print("Hello, World!")a un score de 300.

Pour votre commodité, j'ai écrit une niveleuse de programme automatique.

Autres règles

  • Votre soumission peut être un programme ou une fonction.
  • Vous pouvez prendre N commençant à 0 ou 1 et se terminant à 25 ou 26, respectivement, mais les sorties doivent toujours commencer par "G" et se terminer par "GHYTFVBNJURDCMKIESXLOWAZPQ".
  • Vous devez sortir les caractères dans la spirale dans l'ordre .
  • S'il s'agit d'une fonction, vous pouvez renvoyer une liste de caractères au lieu d'une chaîne.
  • Vous pouvez avoir un retour à la ligne suivant la sortie.
  • Vous pouvez utiliser des lettres minuscules au lieu de lettres majuscules ou une combinaison des deux.

Cas de test

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

Des photos

clavier ordinaire

La spirale superposée:

clavier à spirale

Conor O'Brien
la source
3
Quelqu'un a regardé Sphère récemment ...
Pureferret
@Pureferret Pourriez-vous m'éclairer? Je ne sais pas de quoi vous parlez.
Conor O'Brien
@ ConorO'Brien Dans Sphère (à la fois le roman et le film), un extraterrestre communique avec les humains en utilisant un code numérique à deux chiffres où chaque numéro correspond à une lettre sur le clavier dans un modèle très similaire .
Ingénieur Toast

Réponses:

14

Japt , 304 264 162 points

40 points gagnés grâce à @ ConorO'Brien

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

Testez-le en ligne!

Afin d'enregistrer autant de points que possible, la chaîne entière est condensée en 9 caractères Unicode en interprétant chaque série de 3 lettres comme un nombre en base 36, puis en la convertissant en point de code. Le programme lui-même prend cette chaîne compressée (qui coûte 110 points, y compris les guillemets) et mappe chaque charcode en le convertissant en un string en base-36 ( Gaprès ;le début). îprend les premiers {input} caractères de ceci, qui sont implicitement imprimés.

ETHproductions
la source
11

C, score: 544

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

Essayez-le en ligne!

Steadybox
la source
... pourquoi nommez-vous la fonction la même chose que l'argument?
Fonder le procès de Monica
6
@QPaysTaxes Parce que gc'est la lettre la moins chère selon le score utilisé dans le défi.
Steadybox
Ah, j'ai raté le score personnalisé.
Fund Monica's Lawsuit
11

Spirale , score:  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

Un interprète peut être trouvé ici .

Explication:

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

Le programme commence au 0caractère sur la quatrième ligne. Le premier morceau de code à exécuter est 0;vg.;prend un nombre en entrée et le place dans la pile. vplace ce qui est dans le registre (un zéro) dans la pile. Il sera utilisé comme compteur. gest une étiquette, lorsqu'elle est atteinte, le contrôle passe à l'autre occurrence de la lettre gdans le code.

C'est donc là que se trouve le contrôle:

X
v
g

Puisqu'il y a un espace dans toutes les autres directions, le pointeur d'instruction commence à se déplacer vers le haut. vplace un zéro dans la pile et le Xsort immédiatement de la pile. Étant donné que la valeur sautée est zéro, le pointeur d'instruction se déplace vers X(sinon il le traiterait comme un espace).

Par défaut, le flux de contrôle est en mode tourner à droite, donc maintenant quand il atteint la jonction, le pointeur d'instruction tourne vers la droite. vpousse encore une fois un zéro dans la pile, *incrémente le registre de un.

v*v*v
  X
  v
  g

La prochaine vplace ce qui est dans le registre (numéro 1) dans la pile, le pointeur d'instruction tente de tourner vers la droite, frappant la suivante X. La valeur qui vient d'être ajoutée à la pile est extraite et placée dans le registre. Parce qu'il est différent de zéro, Xn'est pas entré et l'IP passe à la suivante *à droite à la place, incrémentant à nouveau la valeur dans le registre.

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

Cela se produit encore et encore jusqu'à ce que nous atteignions la fin de cette partie et que la ligne de *s commence. À présent, la valeur dans le registre est 6, qui est la lettre gASCII moins la lettre ASCII a. Ainsi, avec une ligne de 97 *s, nous incrémentons la valeur du registre à 103, ce qui correspond à la lettre que gnous voulons imprimer. vle pousse dans la pile, et Pest une autre étiquette lors de la frappe que nous sautons à l'autre Psur la première ligne du code.

Ici .apparaît la valeur de la pile et l'imprime comme un caractère. Après cela, Xle zéro étranger de la pile apparaît, puis ~compare les deux valeurs restantes de la pile (les valeurs étant le compteur et la valeur d'entrée). Si les valeurs sont les mêmes, l'opérateur place zéro dans la pile (sinon -1 ou 1). Encore une fois, le contrôle tente de tourner à droite. Xextrait la valeur de la comparaison de la pile, si elle est nulle X, et après sa !saisie, termine le programme.

P.X~ZZ*v+^
   X
   !

Sinon, l'IP continue vers le Z, qui est une étiquette qui dans ce cas ne saute qu'une étape vers la droite. La raison en est que le saut remet la valeur du registre à zéro. *incrémente le registre et vplace le résultat 1 dans la pile.+fait apparaître les deux éléments supérieurs de la pile (le 1 et le compteur), les ajoute et place le résultat dans la pile (en fait, cela incrémente le compteur d'une unité). ^copie le résultat de la pile dans le registre sans le retirer de la pile.

#décrémente la valeur dans le registre d'une vunité , pousse la valeur décrémentée vers la pile, l'IP tente de tourner vers la droite et fait Xsortir la valeur de la pile. Si la valeur est non nulle, l'IP continue de se déplacer vers l'est, décrémentant la valeur dans le registre, jusqu'à ce qu'elle atteigne zéro et que l'IP entre dans une Xbranche.

#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

La branche conduit à une étiquette correspondant à la valeur du compteur. En frappant l'étiquette, le contrôle passe à l'autre occurrence de l'étiquette dans la section où nous avons commencé avec l'étiquette g, en commençant une autre itération. Comme pour le g, la valeur dans le registre est incrémentée jusqu'à la valeur ASCII de la lettre que nous devons imprimer. Ensuite, le caractère est imprimé et le compteur incrémenté, une autre étiquette est sélectionnée. Cela se produit jusqu'à ce qu'après la dernière itération, le compteur soit égal à l'entrée et le programme se termine.

Modifier:

P.X~Zv+^
   X *
   ! Z

Atteint la même chose que

P.X~ZZ*v+^
   X
   !

mais avec moins d'espace.

Modifier 2:

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

Peut être utilisé à la place de:

*****************************************************************vP
Steadybox
la source
2
Ironique qu'un languaje appelé "Spiral" a un score aussi élevé dans un problème de sortie en spirale.
Shirkam
6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Essayez-le en ligne!

C'est un peu une référence, je pense qu'il doit y avoir une meilleure façon, mais c'est le meilleur que j'ai trouvé jusqu'à présent.

Explication

Je suppose que je devrais expliquer cela à ceux qui ne connaissent pas trop bien Haskell. La fonction takeprend les n premiers éléments de la liste. Cela s'appelle comme ceci:

take n list

Nous voulons prendre les n premiers éléments de la piqûre "GHYTFVBNJURDCMKIESXLOWAZPQ", nous voulons donc quelque chose comme

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Nous pouvons faire mieux cependant, nous pouvons takeinfixer en utilisant des crochets

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

Et maintenant, cela peut être rendu sans point

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")
Assistant de blé
la source
C'est une application partielle dommage qu'il faut utiliser partialdans Clojure. C'est ce que je voulais, mais partialc'était trop cher.
Carcigenicate
3
Ce n'est pas votre score 470? C'est ce que l'extrait de la question me donne de toute façon ...
Juste un étudiant
5

Gelée , score de 211

19 octets

“eȷÞ('¢ạẓkȮV’œ?ØAðḣ

Essayez-le en ligne!

enregistré un tas de score grâce à la suggestion d'Emigna d'utiliser œ?: D

HyperNeutrino
la source
5

Vim , 461 418

CGHYTFVBNJURDCMKIESXLOWAZPQg^[G@" D

Merci @pacholik pour le score de -43!

Essayez-le en ligne!

vim-animation

ბიმო
la source
1
Make it 418 with CGHYTFVBNJURDCMKIESXLOWAZPQg©G@" D(© is escape)
pacholik
4

Befunge, Score: 531

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

Je pense que ce défi aurait été plus intéressant si la sortie devait également être dans une spirale.

Jo King
la source
4

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

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 points de Conor O'Brien

Courez avec 5:prgmNAME.

Renvoie / imprime la subchaîne de 1à Ans(l'entrée numérique).

TI-Basic est une langue à jeton , donc je note cela par les valeurs d'octet des jetons.

sub( est 0xbb 0x0c, donc 20

"est 0x2a, donc *, donc 10 * 2 = 20

Les lettres majuscules ne changent pas, la chaîne est donc 351

,est 0x2b, donc +, donc 10 * 2 = 20

1est 0x31, donc 1, donc 10

Ansest 0x72, ce qui signifie rque 11

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

pizzapants184
la source
Avec cette interprétation des règles de notation, vous pouvez économiser 31 octets supplémentaires en recherchant les lettres dans les endroits créatifs. Remplacez S, A, Z, P par les variables statistiques s, a, z, p (dans le menu STAT + 5), qui marquent 17 points chacune: ce sont des jetons de 2 octets dont le premier octet correspond à b. Remplacez O, W, Q par les lettres minuscules ordinaires, qui marquent 20 points chacune: ce sont des jetons de 2 octets 0xBBBF, 0xBBC7, 0xBBC1.
Misha Lavrov
3

Python 3, score = 762 753

Entrée basée sur 1. C'est pire que l'approche triviale, car elle utilise 37 non-lettres. C'est quelque peu intéressant, cependant.

-9 merci à Leo .

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

Essayez-le en ligne!

Colera Su
la source
1
J'aime cette approche :) Soit dit en passant, cela [:g*3][-3:]peut [g*3-3:g*3]réduire le score total de 9 points
Leo
3

05AB1E , score: 204

.•3ŽγY
₁ùÐÁo0ª ’ö:•£

Essayez-le en ligne!

Emigna
la source
1
Je me demandais pourquoi c'était caché hah!
Magic Octopus Urn
2

Brainf ** k, score = 2690

Entrez un seul octet allant de 0x1à 0x1a.

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

Essayez-le en ligne!

Colera Su
la source
2

APL (Dyalog) , score: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Essayez-le en ligne!

La seule utilisation des lettres latines dans Dyalog est dans les noms de variables et certaines fonctions système. En dehors de cela, seuls les glyphes et certaines lettres grecques sont utilisés.

Uriel
la source
1

Python 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

Essayez-le en ligne!

Un lambda anonyme utilisant le découpage de chaînes de Python ( "asdf"[:i]obtient les premiers icaractères de "asdf")

pizzapants184
la source
1

Clojure, 484 474 points

-10 points car apparemment un %peut exister après un nombre sans espace les séparant!? Je devrai peut-être revenir en arrière et améliorer certaines soumissions.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Une fonction anonyme. Fondamentalement, un port Clojure de ce qui a déjà été publié. Scores bien! Je pense que c'est le premier programme Clojure que j'ai jamais écrit qui ne contient pas un seul espace.

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

Husk , 293 octets

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

C'est la plus courte que j'ai pu trouver, la plus proche ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨pour un score de 293 ..

Essayez-le en ligne!

Explication

La recherche de force brute, se révèle que tous les minuscules ont donné le meilleur score. C'est fondamentalement la même que la solution de @Wheat Wizard, take( ) sur une chaîne compressée ( ¨).

ბიმო
la source
1

Common Lisp, score: 580

(subseq"GHYTFVBNJURDCMKIESXLOWAZPQ"0(read))

Essayez-le en ligne!

Renzo
la source
1

Excel, 490 points

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

La convention pour les ansers d'Excel est de prendre la contribution de A1. Changer cela en G1coupe 22 points (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)
Wernisch
la source
1

C # , score 546

g=>"GHYTFVBNJURDCMKIESXLOWAZPQ".Substring(0,g);
auhmaan
la source
1

Rust, score 443

Ce n'est pas souvent que Rust est bon au golf de code, mais ici, il bat de nombreuses langues

|g|&"GHYTFVBNJURDCMKIESXLOWAZPQ"[..g]
raggy
la source
1

Golang, score 861

func g(g int){io.WriteString(os.Stdout,"GHYTFVBNJURDCMKIESXLOWAZPQ"[0:g])}

Jouez en ligne!

Toxicomane
la source
1

Javascript ES6, 527 points

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

Essayez!

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>

Weedoze
la source
1

PHP, score 584

tripoté un peu le dictionnaire; le fait que xorer la chaîne la coupe le rende substrobsolète.

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

Essayez-le en ligne .

Titus
la source
0

Pyth , score: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Essayez-le ici.

Comment?

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

> <> , 558 + 16 = 574 points

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

Utilise le -v indicateur pour pousser l'entrée sur la pile.

Pousse la spirale sur la pile dans l'ordre inverse, puis fait pivoter l'entrée vers le haut. Ensuite, alors que le haut de la pile est différent de zéro, imprime la lettre suivante et décrémente le haut de la pile.

Essayez-le en ligne!

KSmarts
la source