Menambah, mengurangi, tidak ada atau semua?

9

Ambil dua input, vektor / daftar kosong yang berisi digit 1dan 2dan sebuah string (tidak, Anda tidak boleh mengambil 0/1sebagai gantinya). String akan menjadi salah satu dari yang berikut ini (dalam huruf kecil, persis seperti yang tertulis di bawah ini:

increasing
decreasing
ones
twos
all
none

Jika string ____ maka Anda harus mengembalikan indeks ___:

  • increasing... tempat daftar berubah dari 1menjadi 2(setiap 2yang mengikuti langsung setelah a 1)
  • decreasing... tempat daftar berubah dari 2menjadi 1(setiap 1yang mengikuti langsung setelah a 2)
  • ones ... dari semua digit yang ada 1
  • twos ... dari semua digit yang ada 2
  • all ... semua digit
  • none... tidak ada digit. 0baik-baik saja jika daftar ini diindeks 1. Angka negatif baik-baik saja jika daftar diindeks 0. Anda juga dapat menampilkan daftar atau string kosong.

Kasus uji:

Ini adalah 1-diindeks. Anda dapat memilih jika Anda ingin 1-diindeks atau 0-diindeks. Vektor yang sama digunakan untuk string yang berbeda dalam kasus uji.

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

Mencetak gol

Karena ini adalah , jawaban dengan byte terkecil menang.

Penjelasan didorong!

Stewie Griffin
sumber
@RobertoGraham ya.
Stewie Griffin
@KevinCruijssen Anda adalah penebak yang baik :)
Stewie Griffin
Sejauh ini tidak ada jawaban yang menghasilkan daftar seperti ditunjukkan dalam contoh. (Yaitu, bergabung dengan "," tanpa pembatas trailing). Karena teks tantangan tidak mengatakan seberapa fleksibel daftar itu, apa yang biasanya diterima untuk tantangan seperti ini?
Tahg
Ini biasanya sangat fleksibel. Selama ini daftar angka Anda baik-baik saja.
Stewie Griffin

Jawaban:

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]

Pemahaman array adalah cara yang rapi untuk menggabungkan mapdan filtersekaligus. Sunting: Disimpan 1 byte berkat @ edc65.

Neil
sumber
3

Python 2 , 136 131 119 108 97 byte

  • Disimpan lima byte; menggunakan suatu lambdafungsi.
  • Disimpan dua belas byte berkat TFeld ; bermain golf dua kondisi.
  • Disimpan sebelas byte berkat Tn. Xcoder ; menggunakanenumerate() bukan range(len()).
  • Disimpan sebelas byte dengan menggunakan daftar alih-alih kamus dan menggunakan 0-indexing (seperti dalam jawaban TFeld ) dan golf "adinot".find(m[0])ke 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]]

Cobalah online!

Jonathan Frech
sumber
Karena input selalu 1atau 2, Anda dapat mengubah (l[j]>1)*(l[~-j]<2)ke (l[j]>l[~-j]) untuk 119 byte
TFeld
Selain itu, Anda dapat menyimpan byte dengan beralih ke 0-diindeks
TFeld
@Tfeld Terima kasih; meskipun saya pikir saya akan tetap dengan 1-indeks.
Jonathan Frech
108 byte , menggunakanenumerate()
Mr. Xcoder
3

Python 2 , 117 111 110 99 97 92 byte

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

Cobalah online!

0-indeks

Beralih ke menggunakan pengindeksan Jonathan , dan golf ord(m[0])/3-32keord(t[0])/3%7

TFeld
sumber
Anda dapat golf l[i]==2ke l[i]>1.
Jonathan Frech
3

Haskell , 112 83 81 byte

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

Cobalah online! Contoh penggunaan: "increasing"%[1,1,2,1,2]. Hasil diindeks 1.

Sebagian terinspirasi oleh jawaban Haskell dari Lynn .

Laikoni
sumber
2

MATL , 32 31 30 29 byte

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

Output berbasis 1, atau kosong.

Cobalah online!

Penjelasan

Kode menghitung enam kemungkinan output untuk input array, dan kemudian memilih output yang sesuai tergantung pada input string.

Untuk memilih output, poin kode ASCII dari semua karakter input string ditambahkan. Hasil modulo 9 memberikan 6, 1, 5, 2, 7, 0masing-masing untuk 'increasing', 'decreasing', 'ones', 'twos', 'all', 'none'. Karena semua angka yang dihasilkan berbeda, ini dapat digunakan sebagai kriteria seleksi.

Alih-alih benar-benar melakukan operasi modulo 9 pada penjumlahan, daftar input yang mungkin diperluas hingga 9 entri (beberapa di antaranya adalah dummy), dan pengindeksan ke dalam daftar itu secara otomatis dilakukan 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
sumber
1

Python 2 , 92 byte

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

Cobalah online!

Lynn
sumber
1

Jelly , 27 byte

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

Cobalah online!

Terima kasih kepada Jonathan Allan .

Erik the Outgolfer
sumber
Simpan tiga byte dengan menggunakan kata kamus "diota" - perhatikan bahwa tautan 0 dapat memperbaikinya, tetapi Anda dapat memesan ulang lagi dan menggunakan "penawar racun" atau kata lain yang serupa dan memungkinkan uji coba Anda berfungsi lagi.
Jonathan Allan
@ Jonathan Allan, saya pikir tautan 0adalah tautan terbawah, tetapi tampaknya seperti lebih Çaneh, terima kasih! (juga saya baru belajar kata baru: p)
Erik the Outgolfer
1

Sekam , 27 byte

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

Cobalah online!

-9 terima kasih kepada H.PWiz .

Saya cukup bangga dengan jawaban ini.

Erik the Outgolfer
sumber
Golf kebanyakan dengan menggunakan ΘẊ>dan ΘẊ<dan`fN
H.PWiz
@ H.Piz, bagaimana saya tidak melihat mereka dengan jujur
Erik the Outgolfer
-1 byte Daftar yang diindeks pada 0adalah elemen terakhir.
H.PWiz
@ H.PWiz Ooh Saya pikir string terkompresi akan menjadi ¨₆Żσa¨alasan saya tidak menggunakan fitur itu, terima kasih. Dan sekarang saya bisa mengatakan itu mengikat Jelly .
Erik the Outgolfer
1

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

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

Cobalah online!

Roberto Graham
sumber
Jika anda mendefinisikan ysebagai char, Anda dapat tes golf kesetaraan suka y.equals("a")untuky=='a' , y==97atau bahkan y<98.
Jonathan Frech
@JonathanFrech Baru saja mengubahnya :)
Roberto Graham
TIO setidaknya bukan output yang saya harapkan. Meskipun hanya diberikan dengan contoh, daftar membutuhkan ruang antara elemen dan tidak ada koma trailing.
Tahg
Sejak 19 yaitu cnilai tertinggi 's, c==19sama dengan c>18.
Jonathan Frech
2
131 byte: 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 byte

Berdasarkan pendekatan xcali karena pencocokan string lebih pendek daripada versi array saya.

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

Asumsikan jq dipanggil dengan -Rsopsi dan input muncul pada dua baris misalnya

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

Diperluas:

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

Cobalah online!

jq170727
sumber
1

Haskell , 91 byte

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

Cobalah online!

Laikoni menyimpan satu byte.

Lynn
sumber
1
Anda dapat menyimpan byte dengan (i,y,x)<-zip3[1..]l$l!!0:l.
Laikoni
1

J, 73 byte

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

Akan sangat penasaran untuk melihat bagaimana ini bisa dikondensasi secara signifikan - Saya percaya itu bisa (10 karakter hanya untuk semua agenda orangtua!)

  • g - kata kerja pembantu untuk menambah dan mengurangi, yang hanya berarti membandingkan nilai-nilai infiks \ run dari ukuran 2
  • Sisanya hanya mengambil karakter pertama dari "perintah" dan mengeksekusi kasus yang sesuai menggunakan Agenda @.

Cobalah online!

Jonah
sumber
Apakah 1=]dan 2=]tidak bekerja? Juga, bagaimana jika gmengambil nomor sebagai argumen kiri dan daftar sebagai argumen kanan dan mengembalikan indeks yang 2-/\ diterapkan pada daftar sama dengan argumen kiri. Dengan begitu Anda bisa melewatinya _1atau 1untuk menemukan berkurang dan meningkat daripada menggunakan kata keterangan.
cole
@cole Komentar bagus. Saya membuat perubahan, dan hasilnya jauh lebih bersih, meskipun 73 masih tampak seperti jumlah byte yang tinggi. Maksudku, J mengikat JS di sini .... memalukan!
Jonah
0

Java 8, 233 229 216 byte

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

Pendekatan String ini berakhir lebih lama dari yang saya harapkan .. Tetapi bahkan berpikir saya sangat tidak bermain golf dengan jawaban Java 8 lainnya , saya memutuskan untuk tetap mempostingnya.
Itu pasti bisa golf, bahkan dengan pendekatan ini .. "Tidak ada" dan "naik / turun" terutama disebabkan beberapa solusi yang menghabiskan beberapa byte ..

Hasilnya adalah 1-diindeks.

Penjelasan:

Coba di sini.

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
sumber
0

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

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

Cobalah online!

Logika yang direvisi secara efektif sama dengan penjelasan di bawah ini, tetapi kecocokan pola telah dipersingkat.

Sebelumnya:

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

Cobalah online!

Tidak menghasilkan apa-apa jika kriteria tidak cocok.

Dijelaskan:

$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
sumber