Zunehmen, abnehmen, keine oder alle?

9

Nehmen Sie zwei Eingänge, einen nicht leeren Vektor / Liste mit Ziffern 1und 2und eine Zeichenfolge (nein, Sie können nicht nehmen 0/1statt). Die Zeichenfolge ist eine der folgenden (in Kleinbuchstaben, genau wie unten beschrieben:

increasing
decreasing
ones
twos
all
none

Wenn die Zeichenfolge ____ ist, geben Sie die Indizes ___ zurück:

  • increasing... wo sich die Liste von 1nach ändert 2(jede 2, die direkt nach a folgt 1)
  • decreasing... wo sich die Liste von 2nach ändert 1(jede 1, die direkt nach a folgt 2)
  • ones ... von allen Ziffern, die sind 1
  • twos ... von allen Ziffern, die sind 2
  • all ... alle Ziffern
  • none... keine der Ziffern. 0ist in Ordnung, wenn die Liste 1-indiziert ist. Eine negative Zahl ist in Ordnung, wenn die Liste 0-indiziert ist. Sie können auch eine leere Liste oder Zeichenfolge ausgeben.

Testfälle:

Diese sind 1-indiziert. Sie können wählen, ob Sie 1-indiziert oder 0-indiziert möchten. In den Testfällen werden die gleichen Vektoren für verschiedene Zeichenfolgen verwendet.

--------------------------------
Vector:
1 1 2 2 2 1 2 2 1 1 2

String       - Output
increasing   - 3, 7, 11
decreasing   - 6, 9
ones         - 1, 2, 6, 9, 10 
twos         - 3, 4, 5, 7, 8, 11
all          - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
none         - 0 / []

------------------------------------
Vector:
1

String:
ones         - 1
all          - 1
decreasing / increasing / twos / none  - 0 / []

Wertung

Da dies , gewinnt die Antwort mit den wenigsten Bytes.

Erklärungen sind erwünscht!

Stewie Griffin
quelle
@ RobertoGraham ja.
Stewie Griffin
@ KevinCruijssen Sie sind ein guter Ratgeber :)
Stewie Griffin
Bisher scheint keine der Antworten eine Liste wie im Beispiel gezeigt auszugeben. (dh verbunden mit "," ohne nachfolgendes Trennzeichen). Da der Herausforderungstext nicht angibt, wie flexibel die Liste sein kann, was wird normalerweise für solche Herausforderungen akzeptiert?
Tahg
Es ist normalerweise sehr flexibel. Solange es sich um eine Liste von Zahlen handelt, geht es Ihnen gut.
Stewie Griffin

Antworten:

7

JavaScript (Firefox 30-57), 74 73 Byte

(a,[s],i=0,p)=>[for(e of a)if({i:e>p,d:e<p,o:e<2,t:e>1,a:1}[p=e,i++,s])i]

Array Comprehensions sind eine nette Art und Weise zu kombinieren mapund filterin einem Rutsch. Bearbeiten: 1 Byte dank @ edc65 gespeichert.

Neil
quelle
3

Python 2 , 136 131 119 108 97 Bytes

  • Fünf Bytes gespeichert; mit einer lambdaFunktion.
  • Dank TFeld wurden zwölf Bytes gespeichert . Golf zwei Bedingungen.
  • Elf Bytes dank Mr. Xcoder gespeichert ; mit enumerate()anstelle von range(len()).
  • Elf Bytes wurden gespeichert, indem eine Liste anstelle eines Wörterbuchs verwendet und 0-indexing (wie in TFelds Antwort ) und Golfing"adinot".find(m[0]) to verwendet wurden ord(m[0])/3-32.
lambda l,m:[j for j,k in enumerate(l)if[1,j*k<j*l[~-j],0,j*k>j*l[~-j],0,k<2,k>1][ord(m[0])/3-32]]

Probieren Sie es online aus!

Jonathan Frech
quelle
Da der Eingang immer ist 1oder 2, können Sie ändern , (l[j]>1)*(l[~-j]<2)um (l[j]>l[~-j]) für 119 Bytes
TFeld
Sie können auch ein Byte speichern, indem Sie zu 0-indiziert
wechseln
@TFeld Danke; obwohl ich denke, ich werde bei 1-indexed bleiben.
Jonathan Frech
108 Bytes , mitenumerate()
Mr. Xcoder
3

Python 2 , 117 111 110 99 97 92 Bytes

lambda l,t:[i for i,v in enumerate(l)if[l[i+i/~i]<v,0,v<2,v>1,1,l[i+i/~i]>v][ord(t[0])/3%7]]

Probieren Sie es online aus!

0-indexiert

Geschaltet mit Jonathans Indizierung und golfed ord(m[0])/3-32zuord(t[0])/3%7

TFeld
quelle
Sie können Golf l[i]==2auf l[i]>1.
Jonathan Frech
3

Haskell , 112 83 81 Bytes

s%l=[i|(i,p,q)<-zip3[1..]l$l!!0:l,elem(s!!0,1<2)$zip"idota"[q<p,p<q,p<2,1<p,1<2]]

Probieren Sie es online aus! Anwendungsbeispiel : "increasing"%[1,1,2,1,2]. Die Ergebnisse sind 1-indiziert.

Teilweise inspiriert von Lynns Haskell-Antwort .

Laikoni
quelle
2

MATL , 32 31 30 29 Bytes

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

Die Ausgabe ist 1-basiert oder leer.

Probieren Sie es online aus!

Erläuterung

Der Code berechnet die sechs möglichen Ausgaben für die Array-Eingabe und wählt dann abhängig von der Zeichenfolgeneingabe die entsprechende Ausgabe aus.

Zur Auswahl der Ausgabe werden die ASCII-Codepunkte aller Zeichen der Zeichenfolgeneingabe hinzugefügt. Das Ergebnis Modulo 9 gibt 6, 1, 5, 2, 7, 0jeweils für 'increasing', 'decreasing', 'ones', 'twos', 'all', 'none'. Da alle resultierenden Zahlen unterschiedlich sind, kann dies als Auswahlkriterium verwendet werden.

Anstatt tatsächlich eine Modulo 9-Operation für die Summe durchzuführen, wird die Liste der möglichen Eingaben auf 9 Einträge erweitert (von denen einige Dummy-Einträge sind), sodass die Indizierung in diese Liste automatisch in Modulo 9 erfolgt.

d     % Implicit input: numeric vector. Push vector of consecutive differences.
      % Contains -1, 0 or 1
Q~    % For each entry: add 1, negate. This turns -1 into 1, other values into 0
f     % Push indices of nonzeros
Q     % Add 1 to each entry (compensates the fact that computing consecutive
      % differences removes one entry). This the output for 'decreasing'
Gq    % Push input again. Subtract 1 from the code points
f     % Push indices of nonzeros. This is the output for 'twos'
OO    % Push two zeros. These are used as placeholders
Go    % Push input and compute parity of each entry
f     % Push indices of nonzeros. This is the output for 'ones'
Gd    % Push input and compute consecutive differences
1=    % Test each entry for equality with 1
f     % Push indices of nonzeros 
Q     % Add 1. This is the output for 'increasing'
Gf    % Push indices for all input (nonzero) entries. This is the output for 'all'
O     % Push zeros. Used as placeholder
[]    % Push empty array. This is the output for 'none'
Xh    % Concatenate stack into a cell array
j     % Input a string
s     % Sum of code points
)     % Use as an index into the cell aray. Implicitly display
Luis Mendo
quelle
1

Gelee , 27 Bytes

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

Probieren Sie es online aus!

-3 danke an Jonathan Allan .

Erik der Outgolfer
quelle
Sparen Sie drei Bytes, indem Sie das Wörterbuchwort "diota" verwenden. Beachten Sie, dass Link 0 alles richtig macht. Sie können jedoch erneut bestellen und "Gegenmittel" oder ein anderes solches Wort verwenden und Ihr Testgeschirr wieder funktionieren lassen.
Jonathan Allan
@ JonathanAllan Ich dachte, Link 0sei der unterste Link, aber anscheinend ist es Çaber seltsamer, danke! (auch ich habe gerade ein neues Wort gelernt: p)
Erik der Outgolfer
1

Schale , 27 Bytes

`fN!+mmëI=2ε¬moΘẊe><€¨Ÿȧö¨←

Probieren Sie es online aus!

-9 danke an H.PWiz .

Ich bin ziemlich stolz auf diese Antwort.

Erik der Outgolfer
quelle
Golfen meistens mit ΘẊ>und ΘẊ<und`fN
H.PWiz
@ H.PWiz wie habe ich die nicht ehrlich gesehen
Erik der Outgolfer
-1 Byte Eine indizierte Liste 0ist das letzte Element.
H.PWiz
@ H.PWiz Ooh, ich dachte, dass der komprimierte String ¨₆Żσa¨stattdessen sein würde, deshalb habe ich diese Funktion nicht verwendet, danke. Und jetzt kann ich sagen, dass es Jelly bindet .
Erik der Outgolfer
1

Java (OpenJDK 8) , 266 217 213 205 172 171 155 131 Bytes

s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}

Probieren Sie es online aus!

Roberto Graham
quelle
Wenn Sie definieren yals char, können Sie Golf Gleichheitstests gerne y.equals("a")zu y=='a', y==97oder sogar y<98.
Jonathan Frech
@ JonathanFrech änderte es gerade :)
Roberto Graham
Der TIO ist zumindest nicht die Ausgabe, die ich erwarten würde. Die Liste ist zwar nur beispielhaft angegeben, erfordert jedoch ein Leerzeichen zwischen den Elementen und kein nachfolgendes Komma.
Tahg
Da 19is c's höchster Wert ist, c==19ist gleich c>18.
Jonathan Frech
2
131 Bytes:s->a->{int i=0,l=0,c=s.charAt(0)-97;for(int e:a){if(++i>1&(c==8&e>l|c==3&e<l)|c==14&(l=e)<2|c>18&l>1|c<1)System.out.print(i+",");}}
Nevay
1

Jq 1,5 , 131 Bytes

Basierend auf dem Ansatz von xcali , da der String-Abgleich kürzer ist als meine Array-Version.

def D(s):[.[1]|gsub(" ";"")|match(s;"g").offset+(s|length)];./"
"|{i:D("12"),d:D("21"),o:D("1"),t:D("12"),a:D("."),n:[]}[.[0][0:1]]

Angenommen, jq wird mit -RsOptionen aufgerufen und die Eingabe wird in zwei Zeilen angezeigt, z

decreasing
1 1 2 2 2 1 2 2 1 1 2

Erweitert:

def D(s): [
      .[1]                              # find where s appears
    | gsub(" ";"")                      # in the input and add
    | match(s;"g").offset + (s|length)  # length to get ending index
  ]
;

  ./"\n"                                # split on newline
| {i:D("12"),                           # increasing
   d:D("21"),                           # decreasing
   o:D("1"),                            # ones
   t:D("2"),                            # twos
   a:D("."),                            # all
   n:[]                                 # none
  }[.[0][0:1]]

Probieren Sie es online aus!

jq170727
quelle
1

J, 73 Bytes

g=.[:I.[=0,2-/\]
(_1 g])`(1 g])`(1=])`(2=])`(i.@#@])`_1:@.('idotan'i.{.@[)

Wäre neugierig zu sehen, wie dies erheblich verdichtet werden kann - ich glaube es kann (10 Zeichen nur für all diese Agenda Parens!)

  • g- Hilfsverb zum Erhöhen und Verringern, was nur dem Vergleich der Werte von Infix- \Läufen der Größe 2 gleichkommt
  • Der Rest greift nur das erste Zeichen aus dem "Befehl" und führt den entsprechenden Fall mit Agenda aus @.

Probieren Sie es online aus!

Jona
quelle
Haben 1=]und 2=]nicht arbeiten? Was wäre, wenn geine Zahl als linkes Argument und eine Liste als rechtes Argument verwendet und die 2-/\ auf die Liste angewendeten Indizes zurückgegeben würden , die dem linken Argument entsprechen? Auf diese Weise können Sie es weitergeben _1oder 1abnehmen und erhöhen, anstatt ein Adverb zu verwenden.
Cole
@cole Gute Kommentare. Ich habe die Änderungen vorgenommen und das Ergebnis ist viel sauberer, obwohl 73 immer noch wie eine hohe Byteanzahl erscheint. Ich meine, J bindet den JS hier ... die Schande!
Jonah
0

Java 8, 233 229 216 Bytes

l->s->{int i=s.charAt(0)-97,k=0,j=1;for(s=(l+"").replaceAll("[^12]","");s.length()*j>0;System.out.print(j++<0?"":(k+=j)+","),s=s.substring(j))j=i<1?0:s.indexOf(i<4?"21":i<9?"12":i<14?" ":i<15?"1":"2")+(i>2&i<9?1:0);}

Dieser String-Ansatz endete länger als erwartet. Aber obwohl ich von der anderen Java 8-Antwort überfordert bin, habe ich mich trotzdem entschlossen, ihn zu veröffentlichen.
Es kann definitiv Golf gespielt werden, auch mit diesem Ansatz. Das "Keine" und "Erhöhen / Verringern" verursachte hauptsächlich eine Problemumgehung, die einige Bytes kostete.

Das Ergebnis ist 1-indiziert.

Erläuterung:

Probieren Sie es hier aus.

l->s->{                          // Method with List and String parameters
  int i=s.charAt(0)-97,          //  First character of the String - 97
                                 //   (i=8; d=3; o=14; t=19; a=0; n=13)
      k=0,                       //  Total counter
      j=1;                       //  Index integer
  for(s=(l+"")                   //  toString of the List,
         .replaceAll("[^12]","");//   and leave only the 1s and 2s 
      s.length()*j>0             //  Loop as long as `j` and the size of the String
                                 //  are both larger than 0
      ;                          //   After every iteration:
      System.out.print(          //    Print:
       j++<0?                    //     If `j` is -1:
        ""                       //      Print nothing
       :                         //     Else:
        (k+=j)+",")              //      Print the current index
      ,s=s.substring(j))         //    And then remove the part of the String we've checked
    j=i<1?                       //   If "all":
                                 //    Change `j` to 0
      :                          //   Else:
       s.indexOf(                //    Replace `j` with the next index of:
        i<1?                     //     If "all":
         s.charAt(0)+""          //      The next character
        :i<4?                    //     Else-if "decreasing":
         "21"                    //      Literal "21"
        :i<9?                    //     Else-if "increasing":
         "12"                    //      Literal "12"
        :i<14?                   //     Else-if "none":
         " "                     //      Literal space (any char that isn't present)
        :i<15?                   //     Else-if "one":
         "1"                     //      Literal "1"
        :                        //     Else(-if "two"):
         "2")                    //      Literal "2"
       +(i>2&i<9?1:0);           //     +1 if it's "increasing"/"decreasing"
                                 //  End of loop (implicit / single-line body)
}                                // End of method
Kevin Cruijssen
quelle
0

Perl 5 , 71 + 2 ( -nl) = 73 Bytes

$p=/l/?'.':/t/?2:/^o/?1:/d/?21:/i/?12:0;$_=<>;s/ //g;say pos while/$p/g

Probieren Sie es online aus!

Die überarbeitete Logik entspricht praktisch der folgenden Erklärung, die Musterübereinstimmungen wurden jedoch verkürzt.

Vorher:

$p=/all/?'.':/^o/?1:/^t/?2:/^d/?21:/^i/?12:0;$_=<>;s/ //g;say pos while/$p/g

Probieren Sie es online aus!

Gibt nichts aus, wenn die Kriterien nicht übereinstimmen.

Erklärt:

$p=          # set the pattern to seach based on the input string
  /all/?'.'  # any character
 :/^o/?1     # starts with 'o', find ones
 :/^t/?2     # starts with 't', find twos
 :/^d/?21    # starts with 'd', find decreasing
 :/^i/?12    # starts with 'i', find increasing
 :0;         # anything else: create pattern that won't match
$_=<>;s/ //g;# read the digits and remove spaces
say pos while/$p/g # output position(s) of all matches
Xcali
quelle