Indizierung der Cha-Cha-Folie

12

Einführung:

Obwohl ich ursprünglich ein niederländisches Lied im Kopf hatte, in dem die Texte lauten: " Doe 'n stapje naar voren, en' n stapje terug " (was übersetzt bedeutet " Mach einen kleinen Schritt vorwärts und einen kleinen Schritt zurück ") Ich suchte nach den vollständigen Texten und stellte fest, dass sie nur hin und her gingen und nie seitwärts.

Also benutze ich jetzt stattdessen den Text von Mr. C. The Slide Man, auch bekannt als DJ Casper - Cha-Cha Slide, für diese Herausforderung.

Wenn wir alles andere ignorieren und nur die Wörter "left", "right", "back" und "hop" (ich habe "hop" als vorwärts gezählt) einschließlich der genannten Beträge betrachten, enthält das vollständige Lied die folgende Liste ( Ich verwende hier die Abkürzungen LRBH):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

Hier die vollständigen Songtexte in einem versteckbaren JavaScript-Code-Snippet (um Platz zu sparen), in dem die Züge und Beträge in sperrigen Klammern stehen:

Herausforderung:

Nun zur eigentlichen Herausforderung. Wir nehmen einen, zwei oder drei Eingänge . Eine davon ist eine Liste von Index-Ganzzahlen (also entweder nicht negativ für 0-indexiert oder positiv für 1-indexiert). (Die anderen Eingaben sind optional und werden in den Herausforderungsregeln erläutert.)

Jeder Testfall startet an einer Position {x=0, y=0}.
Verwenden Sie nun die Lyrics-Liste der Züge und entfernen Sie diese alle Moves an den angegebenen Indizes der Input-Liste. Gehen Sie dann über die Bewegungen (bis zum größten Index des Eingabe-Arrays) und geben Sie die Position aus, an der Sie landen werden.

Die Bewegungen ändern die Koordinaten wie folgt:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

Herausforderungsregeln:

  • Sie können auf die Zugliste zugreifen, wie Sie möchten. †: Kann eine zusätzliche Eingabe sein; Kann sich in einer separaten Datei auf der Festplatte befinden, von der Sie lesen werden. kann sich in einer Variablen auf Klassenebene befinden, auf die Sie zugreifen. Es wird in Form sein L, R, Bund Hobwohl (kann eine Zeichenfolge oder Zeichenliste / Array), so kann man nicht speichern Sie die Bewegungen Liste als 1s und -1s oder ganze Zahlen.
  • Die oben angegebene Zugliste ist fest codiert und bleibt immer gleich. (Aus diesem Grund ist es auch in Ordnung, es als Feld auf Klassenebene zu platzieren, anstatt es als Eingabe zu verwenden, wenn dies die Byteanzahl Ihrer Antwort verbessert.)
  • Input-Liste kann sowohl 0-indiziert als auch 1-indiziert sein (bis zu Ihnen)
  • Wir gehen nur die Schritte bis zum größten Index der Liste und schließen ihn aus.
    • †: Sie können dieses letzte Element auch als getrennte Ganzzahleingabe anstelle des letzten Elements des Eingabe-Arrays verwenden.
  • Die Ausgabe der x- und y-Koordinaten, bei denen wir landen, kann in einem beliebigen vernünftigen Format erfolgen (Integer-Array mit zwei Elementen, durch Trennzeichen getrennte Zeichenfolge, STDOUT-Ausdruck in zwei getrennten Zeilen usw.).
  • Sie können davon ausgehen, dass die Eingabeliste vom niedrigsten zum höchsten sortiert ist (oder vom höchsten zum niedrigsten, wenn Sie dies bevorzugen. In diesem Fall ist das erste Element die Anfangsgröße der Verschiebeliste - falls nicht als separate Eingabe verwendet). Und es werden auch keine doppelten Indizes enthalten.
  • Wenn der größte Index der Eingabeliste größer ist als die Liste der Züge (55 Züge sind in der Liste der Züge), werden wir erneut an den Anfang der Liste springen (je nach dem größten Index so oft wie nötig) der Eingabe).
  • Sie können y,xstatt ausgeben x,y, aber geben Sie dies bitte in Ihrer Antwort an, wenn Sie dies tun.

Beispiel:

Eingang: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

Hier die Bewegungen und (0-indizierten) Indizes übereinander:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L

Wenn wir die Indizes der Eingabeliste entfernen, haben wir die folgende Bewegungsliste übrig:

1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R

Wenn wir nun von der Position {0, 0}über die verbleibenden Züge gehen, haben wir nach jedem Zug die folgenden neuen Koordinaten:

{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}

Die endgültige Ausgabe lautet also: {-6, 10}

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Es wird außerdem dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}

0-indexed input: [55]    (Note: There are 55 moves in the unmodified list)
1-indexed input: [56]    (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}

0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}

0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}

0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}

0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}

0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}
Kevin Cruijssen
quelle
Können wir die Koordinaten in umgekehrter Reihenfolge ausgeben?
Shaggy
3
@ Shaggy Umm, klar, warum nicht. Solange Sie dies in Ihrer Antwort klar spezifizieren.
Kevin Cruijssen
@Arnauld Ja, die Bewegungen werden angezeigt und nie geändert. Ich werde das vielleicht klarer klären, wenn es noch nicht klar ist. (Aus diesem Grund können Sie es auch als hartcodiertes Feld auf Klassenebene verwenden, wenn Ihre
Byteanzahl
Kann der Ausgang ein Paar Schwimmer sein?
Jakob
1
Sehr spät zur Herausforderung, aber zwei Ihrer Testfälle scheinen falsche Eingaben für den 1-indizierten Fall zu haben: zusätzliche 82 im sechsten und 29 anstelle von 39 im dritten Testfall (die Sortierung zeigt an, dass Sie dies beabsichtigt haben könnten tatsächlich 28/29 sein, aber die erwartete Ausgabe wird von 38/39 dort gezeigt).
Sundar - Wiedereinsetzung von Monica

Antworten:

4

05AB1E , 15 12 Bytes

Dank Erik the Outgolfer 3 Bytes gespart

ÝsKèIêRS¢2ôÆ

Probieren Sie es online! oder als Testsuite

Erläuterung

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction
Emigna
quelle
1
Gute Antwort! Wusste nicht mal davon Æ. Intelligente Art und Weise, nur alle Bewegungen zu zählen und die Verwendung Æder Differenz für die berechnen RLund BHPaare.
Kevin Cruijssen
Æhat es für immer gegeben, nicht wahr? Ich würde es annehmen, da ich nichts davon wusste. Es scheint, als ob die Befehle, die ich für "neu" halte, seit ihrer Einführung existieren, aber ich wusste nie, wie ich sie verwenden sollte, lol. Oh, +1
Magic Octopus Urn
@MagicOctopusUrn: Es hat in der Tat für immer existiert;)
Emigna
7

Ruby , 98 ... 58 55 Bytes

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

Probieren Sie es online!

Erläuterung:

Der Haupttrick besteht darin, komplexe Zahlen zur Darstellung von Zügen zu verwenden: 'B' ist -i, 'H' ist + i, 'L' ist -1 und 'R' ist +1. Wenn wir alle Züge in komplexe Zahlen umwandeln, erhalten wir mit einer einzigen Summe das richtige Ergebnis.

Ich habe verschiedene Methoden ausprobiert, aber dann habe ich die magische Nummer 19 gefunden: Wir müssen nicht mit Regex-Übereinstimmungen herumspielen, weil:

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

Also, füge das alles zusammen, summiere, invertiere das Vorzeichen und wir sind fertig.

Danke Jakob für -3 Bytes

GB
quelle
Clevere Verwendung komplexer Zahlen! Da die Bewegung Zeichenfolge festgelegt ist, können Sie ersetzen (m*c+m)[c]mit m[c%55].
Jakob
4

JavaScript (ES6), 85 Byte

Gemäß den Herausforderungsregeln erwartet dieser Code, dass die Zeichenfolge m für den globalen Bereich die Liste der Bewegungen enthält. (Speichern von 3 Bytes, wie von @KevinCruijssen vorgeschlagen.)

Nimmt die Eingabe als Liste von 0-basierten Indizes in der Reihenfolge vom niedrigsten zum höchsten.

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

Probieren Sie es online!

Wie?

Jedes Zugzeichen wird in seine Position in der Zugzeichenfolge konvertiert "LBHR...". Wir multiplizieren das Ergebnis mit 3 und wenden ein Modulo 5 an , das p ergibt . Wir haben dann:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

Wo das Vorzeichen eines Mods b das von a ist .

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0
Arnauld
quelle
3

Gelee , 14 Bytes

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

Probieren Sie es online!

Argument 1 / Linkes Argument: Maximal 1-basierter Index.
Argument 2 / Rechtes Argument: 1-basierte Indizes.
Argument 3: Moves-Liste als String. Die Funktion kann weiterhin verwendet werden, wenn das dritte Befehlszeilenargument für diesen Zweck verwendet wird.

Erik der Outgolfer
quelle
3

Java 10, 129 119 112 107 100 86 Bytes

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

Nimmt das Maximum als zusätzliche Eingabe; Moves-List ist ein Zeichen-Array auf Klassenebene.

Inspiriert von @Emignas 05AB1E Antwort .
-7 Bytes dank @Jakob .
-14 Bytes dank @Geobits .

Probieren Sie es online aus.

Erläuterung:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73Ordnet je nach Charakter entweder die x- oder die y-Koordinate zu ( Online ausprobieren ):

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2Ordnet dem richtigen Charakter +1oder -1je nach Charakter zu ( Online ausprobieren ):

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1
Kevin Cruijssen
quelle
1
Wenn Sie die Indexliste als veränderliche Menge verwenden, können Sie sie a.add(m)als ifBedingung verwenden.
Jakob
Und int c[]kann sein int[]c.
Jakob
1
@ Jakob Ah, int c[]war von einer früheren Version, in der ich immer noch einen Index verwendet habe, ianstatt ihn zu verwenden m. Und schlau, ein Set zu verwenden, addanstatt !contains, danke!
Kevin Cruijssen
1
Sie können die Byte-Hogging-Subtraktion am Ende vermeiden, indem Sie c[2]für axis (with s[m%55]/73) verwenden und mit so etwas wie 3*s[m%55]%5-2(ich wünschte, ich könnte einen Weg finden, das zu verkürzen, aber ...) gehen. Zusammen mit einem Ternär ist es a->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}für 98.
Geobits
@ Geobits Danke! Und -12 Bytes mehr, indem Sie int[]statt eines Strings einfach den zurückgeben . :)
Kevin Cruijssen
2

Python 3, 85 Bytes

bist die Indexliste (a set) und list der Endindex. Die Verschiebungsliste (eine Zeichenfolge oder eine Zeichenliste) erscheint frei als s. Dies ist eine Portierung der Ruby-Antwort von GB , und eine Erklärung des Ansatzes finden Sie dort.

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

Probieren Sie es online

Ungolfed

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)
Jakob
quelle
2

MATL , 16 Bytes

:wX-)Jw19\^s_&Zj

Probieren Sie es online!

Nimmt 3 Eingaben wie die Jelly-Antwort, den größten Index, die Liste der zu überspringenden Indizes und das Array mit 55 Zeichen auf.

Sundar - Setzen Sie Monica wieder ein
quelle
1

Sauber , 148 ... 130 Bytes

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

Probieren Sie es online!

Definiert die Funktion $ :: [Int] -> (Int, Int), indem eine Liste von (vom kleinsten zum größten) Indizes erstellt wird, die aus den Zügen entfernt werden sollen, bevor foldrdie entsprechenden Operationen ausgeführt werden (0,0).

Οurous
quelle