Dank an @ Agawa001 für die Beantwortung dieser Frage.
Erläuterung
Mein neuer "Keybore" hat nur 2 Buttons, nämlich +
und -
.
Die Nummer im Speicher beginnt bei 0
.
Jedes aufeinanderfolgende Drücken von +
oder -
erhöht / erniedrigt den Speicher genau so oft, wie er nacheinander gedrückt wurde.
Wenn Sie also +
viermal drücken , wird beim ersten Mal 1 hinzugefügt, beim zweiten Mal 2, beim dritten Mal 3 und beim vierten Mal 4, sodass Sie 10
(zehn) erhalten.
Wenn Sie nun -
dreimal drücken , wird beim ersten Mal 1, beim zweiten Mal 2 und beim dritten Mal 3 abgezogen, und Sie haben 4
(vier).
TL; DR
Teilen Sie die Zeichenfolge bei jedem Zeichenwechsel durch + und -. Dann +
addiert jede resultierende Folge von m Symbolen die m-te Dreieckszahl und jede Folge von n-
Symbolen subtrahiert die n-te Dreieckszahl.
Begehbar
Nun, wenn Sie immer noch nicht verstehen, werde ich Ihnen zeigen, wie es +++--+--
schafft 1
.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Aufgabe
- Sie nehmen eine positive Ganzzahl als Eingabe, entweder als Funktionsargument oder von STDIN.
- Anschließend geben Sie die Mindestanzahl von Tastenanschlägen aus, die zum Erstellen dieser Anzahl mit der oben beschriebenen Methode erforderlich sind.
Testfälle
Da das Umordnen der +
oder -
-Läufe die gleiche Nummer ergibt, wird für jede solche Gruppe nur die lexikographisch früheste Sequenz aufgelistet.
Input | Output | Possible corresponding sequences
-------------------------------------------------
4 | 5 | -+++-
6 | 3 | +++
9 | 5 | ++++-
11 | 7 | +++-+++
12 | 7 | +++++--, ++++-++
19 | 8 | -++++++-
39 | 12 | +++++++++---
40 | 13 | +++++++++---+, ++++++++-+++-
45 | 9 | +++++++++
97 | 20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
361 | 34 | ++++++++++++++++++++++++++-+++-+++
Zusätzliche Ressourcen
- Beweis, dass jede Zahl gemacht werden kann : Grundsätzlich können Sie durch Wiederholen
++-
jede gerade Zahl erhalten. Um die ungeraden Zahlen zu erhalten, setzen Sie einfach ein+
am Ende. - Ein weiterer allgemeiner Weg, um eine beliebige Anzahl zu erhalten. Zum Generieren
50
müssen Sie beispielsweise+
50-mal und dann-
49-mal drücken . - Lösung der ersten 50 Zahlen .
- Obligatorische JSFiddle .
Wertung
Das ist Code-Golf . Kürzeste Lösung in Bytes gewinnt.
quelle
+++++--
ist auch eine Alternative, aber ich habe entfernt,++-++++
da das äquivalent ist zu++++-++
). Ich habe noch einen weiteren Fall, den ich später hinzufügen möchte, falls jemand eine effiziente Lösung findet, wenn ich es schaffe, sie zu generieren.++-++++
entfernen. Auch das war MEINE Bearbeitung, nicht DEINE.+++++--
(oder gleichwertig--+++++
) gefehlt , weshalb ich das Bedürfnis verspürte, es überhaupt zu bearbeiten.Antworten:
Python 2, 119 Bytes
Sehr langsamer Brute-Force-Ansatz. Die dritte Zeile berechnet die Punktzahl eines Strings
x
. Die anderen Zeilen durchlaufen alle möglichen binären Zeichenfolgen, bis eine gefunden wird, deren Punktzahl dem Argument entspricht.@Leaky sparte drei Bytes!
quelle
s/x==n and len/(x==n)*len/
s
und einfach die wiederholte Division verwenden, wiedef f(n): \n while n>0:print n%2;n/=2
Pyth, 25 Bytes
Probieren Sie es online aus.
Dies ist äußerst ineffizient, und der Arbeitsspeicher für wird knapp
f(n)
≥ 11 nicht mehr genügendf(22)
Auf meinem Laptop wird in etwa 10 Sekunden = 10 berechnet .Erläuterung
T
. (f
)T
. (./T
).pM
)s
){
) Dieser Schritt könnte entfernt werden, macht den Code jedoch viel schneller.f
)d
der Partition (*R
) mit sich selbst plus eins (hd
). Dies ergibt die doppelte Zahl, die zum Ergebnis addiert / subtrahiert werden muss.c
…2
)-M
).a
) Wenn das Ergebnis negativ war, wird durch Vertauschen der Additionen und Subtraktionen das positive Ergebnis erzielt.qyQ
) In diesem Fall ist die Partitionspermutation korrekt, geben Sie sie zurück.T
. Zurück und ausdruckenT
.quelle
MATL ,
4329 BytesDies ist speicher- und zeitineffizient. Der Online-Compiler kann
45
nur Eingaben verarbeiten .Probieren Sie es online!
Hier ist eine modifizierte Version mit allen Testfällen bis zu
40
(es dauert fast eine Minute im Online-Compiler).Erläuterung
Dadurch werden alle möglichen Tastendrucksequenzen jeder Länge in aufsteigender Reihenfolge geprüft, bis eine gültige Sequenz gefunden wird.
quelle
Python,
105100 BytesVerwendet eine ineffiziente Breitensuche.
h
ist eine Liste, die als Warteschlange verwendet wirdm
ist der Wert der Sequenz am Anfang der Listet
ist die letzte hinzugefügte Nummerm
l
ist die Länge der Sequenz, die generiert wurdem
o
ist +/- 1, das Vorzeichen ist entgegengesetzt zum Vorzeichen vont
Edit: Undichte Nonne rasiert fünf Bytes.
quelle
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/