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


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.