Kreisförmige Tastaturspirale


24

Dies ist eine QWERTZ-Tastatur.

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

Wir können auf dieser Tastatur ausgehend von G "herausspiralen". Die Spirale beginnt bei G, geht zu H, dann zu Y, dann zu T, dann zu F, dann zu V, dann zu B, dann zu N, dann zu J, dann zu U , dann R, dann D, dann C, ... usw. Ihre Herausforderung besteht darin, bei einer Zahl von 1 ≤ N ≤ 26 die ersten N Zeichen in dieser Spirale auszugeben . (Wenn Sie verwirrt sind, lesen Sie die Bilder am Ende des Beitrags.)

Der Fang? Die Punktzahl Ihres Programms ist proportional zu den Indizes der Zeichen in der Spirale!

Wertung

  1. Fügen Sie für jeden Buchstaben (ohne Berücksichtigung der Groß- / Kleinschreibung) in Ihrem Code den Index dieses Zeichens in der Spirale zu Ihrer Punktzahl hinzu (beginnend mit 1).
  2. Für jeden Charakter, der nicht in der Spirale ist, addiere 10 zu deiner Punktzahl.
  3. Die niedrigste Punktzahl gewinnt.

Zum Beispiel hat das Programm print("Hello, World!")eine Punktzahl von 300.

Für Ihre Bequemlichkeit habe ich einen automatischen Programm-Grader geschrieben.

Andere Regeln

  • Ihre Einreichung kann ein Programm oder eine Funktion sein.
  • Sie können N mit 0 oder 1 beginnen und mit 25 oder 26 enden, aber die Ausgaben sollten immer noch mit "G" beginnen und mit "GHYTFVBNJURDCMKIESXLOWAZPQ" enden.
  • Sie müssen die Zeichen in der Spirale der Reihe nach ausgeben .
  • Bei einer Funktion können Sie anstelle einer Zeichenfolge eine Liste von Zeichen zurückgeben.
  • Möglicherweise folgt eine nachgestellte Zeile auf die Ausgabe.
  • Sie können Kleinbuchstaben anstelle von Großbuchstaben oder eine Kombination aus beiden verwenden.

Testfälle

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

Bilder

normale Tastatur

Die Spirale überlagert:

Spiraltastatur


3
Jemand hat kürzlich Sphere gesehen ...
Pureferret

@ Pureferret Könnten Sie mich aufklären? Ich bin nicht sicher, worauf Sie sich beziehen.
Conor O'Brien

@ ConorO'Brien In Sphere (sowohl der Roman als auch der Film) kommuniziert ein Außerirdischer mit Menschen unter Verwendung eines zweistelligen numerischen Codes, wobei jede Zahl einem Buchstaben auf der Tastatur in einem sehr ähnlichen Muster entspricht .
Ingenieur Toast

Antworten:


14

Japt , 304 264 162 Punkte

40 Punkte gespart dank @ ConorO'Brien

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

Testen Sie es online!

Um so viele Punkte wie möglich zu speichern, wird die gesamte Zeichenfolge in 9 Unicode-Zeichen zusammengefasst, indem jeder Lauf mit 3 Buchstaben als Zahl zur Basis 36 interpretiert und dann in einen Codepunkt konvertiert wird. Das Programm selbst nimmt diesen komprimierten String (der 110 Punkte kostet, einschließlich der Anführungszeichen) und ordnet jeden cHarcode zu, indem es ihn in einen sTring in Base-36 ( Gnach dem ;am Anfang) umwandelt . îNimmt die ersten {input} Zeichen davon, die implizit gedruckt werden.



11

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

Einen Dolmetscher finden Sie hier .

Erläuterung:

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

Das Programm beginnt mit dem 0Zeichen in der vierten Zeile. Der erste Code, der ausgeführt wird, ist 0;vg. ;Nimmt eine Zahl als Eingabe und legt sie im Stapel ab. vlegt das, was sich im Register befindet (eine Null), in den Stapel. Es wird als Zähler verwendet. gIst eine Beschriftung erreicht, springt das Steuerelement zum jeweils anderen Vorkommen des Buchstabens gim Code.

Hier befindet sich nun die Steuerung:

X
v
g

Da es in allen anderen Richtungen Leerzeichen gibt, bewegt sich der Befehlszeiger nach oben. vlegt eine Null in den Stapel und entfernt Xsie sofort aus dem Stapel. Da der POP-Wert Null ist, bewegt sich der Befehlszeiger auf X(andernfalls wird er als Leerzeichen behandelt).

Standardmäßig befindet sich der Steuerfluss im Rechtskurvenmodus. Wenn er die Kreuzung erreicht, dreht sich der Anweisungszeiger nach rechts. vSchiebt erneut eine Null in den Stapel, *inkrementiert das Register um eins.

v*v*v
  X
  v
  g

Das nächste Mal, vwenn das, was sich im Register (Nummer 1) befindet, in den Stapel gelegt wird, versucht der Befehlszeiger, sich nach rechts zu drehen und trifft das nächste Mal X. Der soeben zum Stapel hinzugefügte Wert wird abgelegt und in das Register eingetragen. Da es nicht Null ist, Xwird es nicht eingegeben, und die IP-Adresse wechselt *stattdessen zur nächsten auf der rechten Seite, wobei der Wert im Register erneut erhöht wird.

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

Dies geschieht immer wieder, bis wir das Ende dieses Teils erreichen und die Linie von *s beginnt. Inzwischen ist der Wert im Register 6, also der ASCII-Buchstabe gminus der ASCII-Buchstabe a. Mit einer Zeile von 97 *s erhöhen wir den Wert im Register auf 103, was dem zu druckenden Buchstaben entspricht g. vschiebt es in den Stapel und Pist ein weiteres Etikett, bei dem wir in Pder ersten Codezeile zum anderen springen .

Hier wird .der Wert vom Stapel abgerufen und als Zeichen gedruckt. Anschließend wird Xdie externe Null aus dem Stapel entfernt und ~die beiden verbleibenden Werte im Stapel verglichen (die Werte sind der Zähler und der Eingabewert). Sind die Werte gleich, setzt der Operator Null in den Stapel (ansonsten -1 oder 1). Die Steuerung versucht erneut, nach rechts zu drehen. XLädt den Wert des Vergleichs vom Stapel, wenn er Null ist X, und !beendet das Programm , nachdem er eingegeben wurde.

P.X~ZZ*v+^
   X
   !

Ansonsten fährt die IP mit der fort Z, was eine Beschriftung ist, die in diesem Fall nur einen Schritt nach rechts springt. Der Grund dafür ist, dass beim Springen der Wert im Register auf Null zurückgesetzt wird. *erhöht das Register und vlegt die resultierende 1 in den Stapel. +Fügt die beiden obersten Elemente des Stapels (die 1 und den Zähler) hinzu und platziert das Ergebnis im Stapel. ^kopiert das Ergebnis vom Stapel in das Register, ohne es vom Stapel zu entfernen.

#Verringert den Wert im Register um eins, vschiebt den verringerten Wert in den Stapel, die IP versucht, sich nach rechts zu drehen, und Xder Wert wird aus dem Stapel entfernt. Wenn der Wert nicht Null ist, bewegt sich die IP weiter nach Osten und verringert den Wert im Register, bis sie Null erreicht und die IP in eine XVerzweigung eintritt .

#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

Die Verzweigung führt zu einer Beschriftung, die dem Wert des Zählers entspricht. Beim Auftreffen auf das Etikett springt das Steuerelement zu dem anderen Vorkommen des Etiketts in dem Abschnitt, in dem wir mit dem Etikett begonnen haben g, und startet eine weitere Iteration. Wie beim gwird der Wert im Register auf den ASCII-Wert des zu druckenden Buchstabens erhöht. Dann wird das Zeichen gedruckt und der Zähler erhöht, ein anderes Etikett wird ausgewählt. Dies geschieht so lange, bis der Zähler nach der letzten Iteration mit der Eingabe übereinstimmt und das Programm beendet wird.

Bearbeiten:

P.X~Zv+^
   X *
   ! Z

Erreicht das Gleiche wie

P.X~ZZ*v+^
   X
   !

aber mit weniger Leerzeichen.

Bearbeiten 2:

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

Kann verwendet werden anstelle von:

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

2
Es ist bedauerlich, dass eine Sprache mit dem Namen "Spiral" bei einem Problem mit der Spiralausgabe einen so hohen Punktestand aufweist.
Shirkam

6

Haskell , 471

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Probieren Sie es online!

Dies ist ein bisschen wie ein Maßstab, ich glaube, es muss einen besseren Weg geben, aber es ist das Beste, was ich bisher gefunden habe.

Erläuterung

Ich nehme an, ich sollte dies denjenigen erklären, die Haskell nicht so gut kennen. Die Funktion takeübernimmt die ersten n Elemente der Liste. Es heißt so:

take n list

Wir wollen die ersten n Elemente des Stichs nehmen "GHYTFVBNJURDCMKIESXLOWAZPQ", also wollen wir so etwas wie

f n=take n"GHYTFVBNJURDCMKIESXLOWAZPQ"

Wir können es aber besser machen, wir können es takemit Backticks befestigen

f n=n`take`"GHYTFVBNJURDCMKIESXLOWAZPQ"

Und jetzt kann dies sinnlos gemacht werden

(`take`"GHYTFVBNJURDCMKIESXLOWAZPQ")

Es ist eine Schande, dass Teilanwendungen partialin Clojure verwendet werden müssen. Dies ist, was ich wollte, aber es partialwar zu teuer.
Carcigenicate

3
Ist Ihre Punktzahl nicht 470? Das ist, was der Ausschnitt in der Frage mir sowieso gibt ...
Nur ein Student



4

Befunge, Score: 531

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

Ich bin der Meinung, dass diese Herausforderung interessanter gewesen wäre, wenn der Output ebenfalls spiralförmig verlaufen müsste.


4

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

sub("GHYTFVBNJURDCMKIESXLOWAZPQ",1,Ans

-22 Punkte von Conor O'Brien

Laufen Sie mit 5:prgmNAME.

Liefert / druckt den subString von 1bis Ans(die Zahleneingabe).

TI-Basic ist eine tokenisierte Sprache , daher bewerte ich dies anhand der Bytewerte der Token.

sub( ist 0xbb 0x0c, also 20

"ist 0x2a, *also 10 * 2 = 20

Großbuchstaben ändern sich nicht, daher lautet die Zeichenfolge 351

,ist 0x2b, +also 10 * 2 = 20

1ist 0x31, also 1, also 10

Ansist 0x72 r, also 11

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


Mit dieser Interpretation der Bewertungsregeln können Sie 31 weitere Bytes einsparen, indem Sie an kreativen Stellen nach den Buchstaben suchen. Ersetzen Sie S, A, Z, P durch die stat-Variablen s, a, z, p (im STAT + 5-Menü), die jeweils 17 Punkte erzielen: Es handelt sich um 2-Byte-Token, deren erstes Byte b entspricht. Ersetzen Sie das O, W, Q durch die gewöhnlichen Kleinbuchstaben, die jeweils 20 Punkte ergeben: Es handelt sich um 2-Byte-Token 0xBBBF, 0xBBC7, 0xBBC1.
Mischa Lawrow

3

Python 3, Score = 762 753

1-basierte Eingabe. Dies ist schlimmer als der triviale Ansatz, da 37 Nichtbuchstaben verwendet werden. Es ist jedoch etwas interessant.

-9 danke an Leo .

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

Probieren Sie es online!


1
Ich mag diesen Ansatz :) Übrigens [:g*3][-3:]kann [g*3-3:g*3]die Gesamtpunktzahl um 9 Punkte senken
Leo


2

Brainf ** k, Score = 2690

Geben Sie ein einzelnes Byte von 0x1bis ein 0x1a.

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

Probieren Sie es online!


2

APL (Dyalog) , Punktzahl: 391

↑∘'GHYTFVBNJURDCMKIESXLOWAZPQ'

Probieren Sie es online!

Die einzige Verwendung für lateinische Buchstaben in Dyalog sind Variablennamen und einige Systemfunktionen. Ansonsten werden nur Glyphen und einige griechische Buchstaben verwendet.


1

Python 3, 522

lambda g:"GHYTFVBNJURDCMKIESXLOWAZPQ"[:g]

Probieren Sie es online!

Ein anonymer Lambda, der Pythons Aufteilen von Zeichenfolgen verwendet ( "asdf"[:i]erhält die ersten iZeichen von "asdf")


1

Clojure, 484 474 Punkte

-10 Punkte, weil anscheinend %nach einer Zahl eine Dose existieren kann, ohne dass ein Leerzeichen dazwischen steht !? Möglicherweise muss ich noch einmal vorbeischauen und einige Einsendungen verbessern.

#(subs"ghytfvbnjurdcmkiesxlowazpq"0%)

Eine anonyme Funktion. Grundsätzlich ein Clojure-Port von dem, was bereits gepostet wurde. Scores schön! Ich denke, dies ist das erste Clojure-Programm, das ich jemals geschrieben habe und das kein Leerzeichen enthält.

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



1

Schale , 293 Bytes

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

Dies ist die kürzeste, die ich finden konnte, als nächstes näher ¨gHYtfvB⌋ȷÜdCmkÏex←ẆAzpq¨für eine Punktzahl von 293 ..

Probieren Sie es online!

Erläuterung

Brute-Force-Suche, stellte sich heraus, dass alle Kleinbuchstaben die beste Punktzahl gaben. Es ist im Grunde dasselbe wie die @ Wheat Wizard-Lösung take( ) für einen komprimierten String ( ¨).



1

Excel, 490 Punkte

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",A1)

Konvention für Excel-Antworten ist die Eingabe von A1. Wenn Sie dies G1ändern, werden 22 Punkte gekürzt (468).

=LEFT("GHYTFVBNJURDCMKIESXLOWAZPQ",G1)


1

Rust, 443 Punkte

Es ist nicht oft so, dass Rust gut im Codegolf ist, aber hier schlägt er viele Sprachen

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


1

Javascript ES6, 527 Punkte

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

Versuch es !

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

ein bisschen mit dem Wörterbuch herumgespielt; Die Tatsache, dass das Xoring des Strings ihn abschneidet, ist substrveraltet.

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

Probieren Sie es online aus .



0

Pyth , Kerbe: 371

<"GHYTFVBNJURDCMKIESXLOWAZPQ

Probieren Sie es hier aus.

Wie?

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


0

> <> , 558 + 16 = 574 Punkte

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

Verwendet das -vFlag, um die Eingabe auf den Stapel zu schieben.

Schiebt die Spirale in umgekehrter Reihenfolge auf den Stapel und dreht die Eingabe dann nach oben. Während die Oberseite des Stapels nicht Null ist, wird der nächste Buchstabe gedruckt und die Oberseite des Stapels verkleinert.

Probieren Sie es online!


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.