Збільшується, зменшується, немає або все?


9

Візьміть два входи, не порожній вектор / список, що містить цифри 1та 2рядок (ні, 0/1замість цього ви можете не брати ). Рядок буде одним із наступних (у малому регістрі, точно так, як написано нижче:

increasing
decreasing
ones
twos
all
none

Якщо рядок дорівнює ____, ви повинні повернути індекси ___:

  • increasing... де список змінюється з 1на 2(все, 2що слід безпосередньо після a 1)
  • decreasing... де список змінюється з 2на 1(все, 1що слід безпосередньо після a 2)
  • ones ... усіх цифр, які є 1
  • twos ... усіх цифр, які є 2
  • all ... всі цифри
  • none... жодна цифра. 0добре, якщо список 1-індексований. Від'ємне число добре, якщо список індексується 0. Ви також можете вивести порожній список або рядок.

Тестові приклади:

Це 1-індексовані. Ви можете вибрати, чи потрібно 1-індексований або 0-індексований. Одні й ті ж вектори використовуються для різних рядків у тестових випадках.

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

Оцінка балів

Як це є , відповідь з найменшими байтами виграє.

Пояснення заохочуються!


@RobertoGraham так.
Стюі Гріффін

@KevinCruijssen Ви хороший здогад :)
Стюі Гріффін

Поки жодна відповідь не видає список, як показано в прикладі. (тобто, з'єднаний "," без відмітника від задніх сторін). Оскільки текст виклику не говорить про те, наскільки гнучким може бути цей список, що зазвичай прийнято для таких проблем?
Tahg

Зазвичай це дуже гнучко. Поки це список номерів, які ви добре.
Стюі Гріффін

Відповіді:


7

JavaScript (Firefox 30-57), 74 73 байт

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

Поняття масиву - це акуратний спосіб поєднання mapі filterза один раз. Редагувати: Збережено 1 байт завдяки @ edc65.


3

Python 2 , 136 131 119 108 97 байт

  • Збережено п’ять байтів; за допомогою lambdaфункції.
  • Збережено дванадцять байтів завдяки TFeld ; два умови для гри в гольф.
  • Збережено одинадцять байтів завдяки містеру Xcoder ; використовуючи enumerate()замість range(len()).
  • Збережено одинадцять байтів, використовуючи список замість словника та використовуючи 0-indexing (як у відповіді TFeld ) та гольф "adinot".find(m[0])на 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]]

Спробуйте в Інтернеті!


Оскільки вхід завжди 1або 2, ви можете змінити (l[j]>1)*(l[~-j]<2)в (l[j]>l[~-j]) протягом 119 байт
TFeld

Крім того, ви можете зберегти байт , перейшовши на 0-індексований
TFeld

@TFeld Спасибі; хоча я думаю, я буду дотримуватися 1-indexed.
Джонатан Фрех

108 байт , використовуючиenumerate()
Містер Xcoder



2

MATL , 32 31 30 29 байт

dQ~fQGqfOOGofGd1=fQGfO[]Xhjs)

Вихід є на основі 1 або порожній.

Спробуйте в Інтернеті!

Пояснення

Код обчислює шість можливих виходів для введення масиву, а потім вибирає відповідний вихід в залежності від введення рядка.

Для вибору виводу додаються кодові точки ASCII всіх символів рядкового вводу. Результат по модулю 9 дає 6, 1, 5, 2, 7, 0відповідно 'increasing', 'decreasing', 'ones', 'twos', 'all', 'none'. Оскільки всі отримані числа є різними, це може використовуватися як критерій відбору.

Замість того, щоб реально виконати операцію модуля 9 над сумою, список можливих входів розширюється до 9 записів (деякі з яких є фіктивними), і тому індексація до цього списку автоматично робиться за модулем 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


1

Желе , 27 байт

>2\0;
NÇ
Ị
=2

ḟ
⁹Ḣ“hɠ»iµĿT

Спробуйте в Інтернеті!

-3 завдяки Джонатану Аллану .


Збережіть три байти , використовуючи словникове слово "diota" - зауважте, що посилання 0 підходить правильно, але ви можете знову змінити порядок і використати "антидот" або інше таке слово і дозволити вашому тестовому ремінцю знову працювати.
Джонатан Аллан

@JonathanAllan Я подумав, що посилання 0є найнижчою ланкою, але, мабуть, це як, Çале дивніше, дякую! (також я щойно дізнався нове слово: p)
Ерік Позакореневий

1

Лушпиння , 27 байт

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

Спробуйте в Інтернеті!

-9 дякую H.PWiz .

Я дуже пишаюся цією відповіддю.


Гольфували в основному за допомогою ΘẊ>та ΘẊ<та`fN
H.PWiz

@ H.PWiz, як я не бачив їх чесно
Ерік Вихідник

-1 байт Список, індексований на, 0є останнім елементом.
H.PWiz

@ H.PWiz Ooh Я думав, що ¨₆Żσa¨замість цього буде стислий рядок , тому я не використовував цю функцію, дякую. І тепер я можу сказати, що це зв'язує Jelly .
Erik the Outgolfer

1

Java (OpenJDK 8) , 266 217 213 205 172 171 155 131 байт

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

Спробуйте в Інтернеті!


Якщо ви визначаєте , yяк charви можете випробуванню гольф рівності подобається y.equals("a")в y=='a', y==97або навіть y<98.
Джонатан Фрех

@JonathanFrech Просто змінював це :)
Роберто Грем

Принаймні, TIO - це не результат, який я б очікував. Хоча, наведений лише на прикладі, у списку потрібний пробіл між елементами і не потрібно тримати кому.
Tahg

Оскільки 19це cнайвище значення, c==19дорівнює c>18.
Джонатан Фрех

2
131 байт: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+",");}}
Невай

1

Jq 1,5 , 131 байт

На основі підходу xcali , оскільки відповідність рядків коротша, ніж моя версія масиву.

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

Припускає, що jq викликається -Rsпараметрами, а введення відображається у двох рядках, наприклад

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

Розширено:

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

Спробуйте в Інтернеті!



1

J, 73 байти

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

Цікаво було б побачити, як це можна значно зменшити - я вважаю, що це може бути (10 символів для всіх цих порядку денного!)

  • g - допоміжне дієслово для збільшення та зменшення, яке справедливе для порівняння значень інфіксу \ прогонів величини 2
  • Решта просто хапає першого символу з "команди" та виконує відповідний випадок, використовуючи Порядок денний @.

Спробуйте в Інтернеті!


Робити 1=]і 2=]не працювати? Крім того, що робити, якщо gчисло було лівим аргументом, а список - правильним аргументом і повернуло індекси, 2-/\ застосовані до списку, дорівнювало лівому аргументу. Таким чином, ви могли б пропустити це _1чи 1знайти зменшувальну та збільшувану замість того, щоб вживати прислівник.
Коул

@cole Хороші коментарі. Я вніс зміни, і результат набагато чистіший, хоча 73 все ще здається високим числом байтів. Я маю на увазі, J пов'язує тут JS .... ганьба!
Йона

0

Java 8, 233 229 216 байт

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

Цей струнний підхід закінчився довше, ніж я очікував .. Але навіть думав, що я дуже переграв гольф іншою відповіддю Java 8 , я все-таки вирішив опублікувати його.
Це, безумовно, можна пограти в гольф, навіть при такому підході. "Ні" та "збільшення / зменшення" в основному спричинили певне вирішення, яке коштувало декількох байтів.

Результат - 1-індексований.

Пояснення:

Спробуйте тут.

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

0

Perl 5 , 71 + 2 ( -nl) = 73 байти

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

Спробуйте в Інтернеті!

Переглянута логіка фактично така ж, як у наведеному нижче поясненні, але відповідність шаблону була скорочена.

Раніше:

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

Спробуйте в Інтернеті!

Виводить нічого, якщо критерії не відповідають.

Пояснили:

$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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.