Rosnące, malejące, żadne czy wszystkie?

9

Weź dwa dane wejściowe, niepusty wektor / listę zawierającą cyfry 1i 2ciąg znaków (nie, 0/1zamiast tego możesz nie wziąć ). Ciąg będzie jednym z następujących (pisane małymi literami, dokładnie tak, jak napisano poniżej:

increasing
decreasing
ones
twos
all
none

Jeśli ciąg ma wartość ____, należy zwrócić indeksy ___:

  • increasing... gdzie lista zmienia się z 1na 2(każda 2następująca bezpośrednio po a 1)
  • decreasing... gdzie lista zmienia się z 2na 1(każda 1następująca bezpośrednio po a 2)
  • ones ... wszystkich cyfr, które są 1
  • twos ... wszystkich cyfr, które są 2
  • all ... wszystkie cyfry
  • none... brak cyfr. 0jest w porządku, jeśli lista ma indeks 1. Liczba ujemna jest w porządku, jeśli lista jest indeksowana na 0. Możesz także wypisać pustą listę lub ciąg znaków.

Przypadki testowe:

Są one indeksowane 1. Możesz wybrać, czy chcesz indeksować 1 czy 0. Te same wektory są używane dla różnych ciągów w przypadkach testowych.

--------------------------------
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 / []

Punktacja

Jak to jest , wygrywa odpowiedź z najmniejszą liczbą bajtów.

Wyjaśnienia są zachęcane!

Stewie Griffin
źródło
@RobertoGraham tak.
Stewie Griffin
@KevinCruijssen Jesteś dobrym zgadywaczem :)
Stewie Griffin
Jak dotąd żadna z odpowiedzi nie wydaje listy, jak pokazano w przykładzie. (tj. połączone przez „,” bez ogranicznika końcowego). Ponieważ tekst wyzwania nie określa, jak elastyczna może być lista, co zwykle jest akceptowane w przypadku takich wyzwań?
Tahg
Zwykle jest bardzo elastyczny. Dopóki jest to lista liczb, nic ci nie jest.
Stewie Griffin,

Odpowiedzi:

7

JavaScript (Firefox 30-57), 74 73 bajty

(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]

Wyrażenia tablicowe to zgrabny sposób łączenia mapi filterza jednym razem. Edycja: Zapisano 1 bajt dzięki @ edc65.

Neil
źródło
3

Python 2 , 136 131 119 108 97 bajtów

  • Zapisano pięć bajtów; za pomocą lambdafunkcji.
  • Zaoszczędź dwanaście bajtów dzięki TFeld ; golfa dwa warunki.
  • Zaoszczędź jedenaście bajtów dzięki Panu Xcoder ; za pomocą enumerate()zamiast range(len()).
  • Zaoszczędzono jedenaście bajtów, używając listy zamiast słownika i używając 0-indexing (jak w odpowiedzi TFelda ) i grając "adinot".find(m[0])w golfa 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]]

Wypróbuj online!

Jonathan Frech
źródło
Ponieważ wejście jest zawsze 1czy 2można zmienić (l[j]>1)*(l[~-j]<2), aby (l[j]>l[~-j]) na 119 bajtów
TFeld
Możesz także zapisać bajt , przełączając na indeksowane 0
TFeld
@TFeld Dzięki; choć myślę, że będę się trzymał 1-indexed.
Jonathan Frech
108 bajtów , przy użyciuenumerate()
Mr. Xcoder
3

Python 2 , 117 111 110 99 97 92 bajtów

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]]

Wypróbuj online!

0-indexed

Zamieniłem się na indeksowanie Jonathana i grałem ord(m[0])/3-32w golfaord(t[0])/3%7

TFeld
źródło
Możesz grać l[i]==2w golfa l[i]>1.
Jonathan Frech
3

Haskell , 112 83 81 bajtów

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]]

Wypróbuj online! Przykładowe zastosowania: "increasing"%[1,1,2,1,2]. Wyniki są indeksowane 1.

Częściowo zainspirowany odpowiedzią Lynn Haskell .

Laikoni
źródło
2

MATL , 32 31 30 29 bajtów

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

Dane wyjściowe są oparte na 1 lub puste.

Wypróbuj online!

Wyjaśnienie

Kod oblicza sześć możliwych danych wyjściowych dla danych wejściowych tablicy, a następnie wybiera odpowiednie dane wyjściowe w zależności od danych wejściowych ciągu.

Aby wybrać wynik, dodawane są punkty kodowe ASCII wszystkich znaków wprowadzanego ciągu. Wynikiem modulo 9 zapewnia 6, 1, 5, 2, 7, 0odpowiednio 'increasing', 'decreasing', 'ones', 'twos', 'all','none' . Ponieważ wszystkie liczby wynikowe są różne, można to wykorzystać jako kryterium wyboru.

Zamiast faktycznie wykonywać operację modulo 9 na sumie, lista możliwych danych wejściowych jest rozszerzana do 9 pozycji (niektóre z nich są fikcyjne), więc indeksowanie do tej listy odbywa się automatycznie modulo 9.

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
źródło
1

Python 2 , 92 bajty

lambda a,s:[i for i,(x,y)in enumerate(zip([0]+a,a))if[0<x<y,0,y<2,y>1,1,x>y][ord(s[0])/3%7]]

Wypróbuj online!

Lynn
źródło
1

Galaretka , 27 bajtów

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

Wypróbuj online!

-3 dzięki Jonathanowi Allanowi .

Erik the Outgolfer
źródło
Zaoszczędź trzy bajty , używając słownika „diota” - zwróć uwagę, że link 0 robi to dobrze, ale możesz zmienić kolejność i użyć „antidotum” lub innego takiego słowa i pozwolić, aby uprząż testowa znów działała.
Jonathan Allan
@JonathanAllan Myślałem, że link 0jest linkiem na samym dole, ale najwyraźniej to Çdziwniejsze, dzięki! (też właśnie nauczyłem się nowego słowa: p)
Erik Outgolfer
1

Łuska , 27 bajtów

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

Wypróbuj online!

-9 dzięki H.PWiz .

Jestem dość dumny z tej odpowiedzi.

Erik the Outgolfer
źródło
Grałem głównie za pomocą ΘẊ>i ΘẊ<i`fN
H.PWiz
@ H.PWiz, jak nie widziałem ich szczerze
Erik the Outgolfer
-1 bajt Lista indeksowana na 0jest ostatnim elementem.
H.PWiz
@ H.PWiz Ooh Myślałem, że ¨₆Żσa¨zamiast tego skompresowany łańcuch będzie , dlatego nie skorzystałem z tej funkcji, dzięki. A teraz mogę powiedzieć, że wiąże Jelly .
Erik the Outgolfer
1

Java (OpenJDK 8) , 266 217 213 205 172 171 155 131 bajtów

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+",");}}

Wypróbuj online!

Roberto Graham
źródło
Jeśli zdefiniujemy yjako char, można testy równości golf podoba y.equals("a")się y=='a', y==97lub nawet y<98.
Jonathan Frech
@JonathanFrech Właśnie to zmieniałem :)
Roberto Graham
TIO przynajmniej nie jest tym, czego oczekiwałbym. Podana tylko jako przykład, lista wymaga spacji między elementami i bez przecinka.
Tahg
Ponieważ 19jest cnajwyższą wartością, c==19jest równe c>18.
Jonathan Frech
2
131 bajtów: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 bajtów

Oparte na podejściu xcali , ponieważ dopasowanie ciągów jest krótsze niż moja wersja tablicy.

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]]

Zakłada, że ​​jq jest wywoływane z -Rsopcjami i dane wejściowe pojawiają się w dwóch wierszach, np

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

Rozszerzony:

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]]

Wypróbuj online!

jq170727
źródło
1

Haskell , 91 bajtów

(c:_)!l=[i|(i,y,x)<-zip3[1..]l$l!!0:l,c/='i'||x<y,c>'d'||x>y,c/='o'||y<2,c<'t'||y>1,c/='n']

Wypróbuj online!

Laikoni uratował bajt.

Lynn
źródło
1
Możesz zapisać bajt za pomocą (i,y,x)<-zip3[1..]l$l!!0:l.
Laikoni
1

J, 73 bajty

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

Byłbym ciekawy, jak można to znacznie skondensować - wierzę, że tak (10 znaków tylko dla wszystkich tych części programu!)

  • g- czasownik pomocniczy do zwiększania i zmniejszania, co sprowadza się do porównania wartości serii nieskończoności \rozmiaru 2
  • Reszta po prostu chwyta pierwszą postać z „polecenia” i wykonuje odpowiedni przypadek za pomocą Agendy @.

Wypróbuj online!

Jonasz
źródło
Czy 1=]i 2=]nie działa? Co więcej, gdyby gwziął liczbę jako lewy argument, a listę jako prawy argument i zwrócił indeksy 2-/\ zastosowane do listy równe lewemu argumentowi. W ten sposób możesz przekazać to _1lub 1znaleźć malejące i rosnące zamiast używać przysłówka.
cole
@cole Dobre komentarze. Wprowadziłem zmiany, a wynik jest znacznie czystszy, chociaż 73 nadal wydaje się dużą liczbą bajtów. Mam na myśli, że J wiąże tutaj JS .... wstyd!
Jonah
0

Java 8, 233 229 216 bajtów

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);}

Takie podejście do Stringów skończyło się dłużej, niż się spodziewałem. Ale nawet sądząc, że jestem znacznie słabsza od drugiej odpowiedzi Java 8 , zdecydowałem się opublikować.
Z pewnością można grać w golfa, nawet przy takim podejściu. „Brak” i „wzrost / spadek” spowodowały głównie obejście, które kosztowało niektóre bajty ..

Wynik jest indeksowany 1.

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
0

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

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

Wypróbuj online!

Zmieniona logika jest w rzeczywistości taka sama jak poniższe wyjaśnienie, ale dopasowania wzorca zostały skrócone.

Poprzednio:

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

Wypróbuj online!

Nic nie zwraca, jeśli kryteria nie zostaną spełnione.

Wyjaśnione:

$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
źródło