Запрещенный встроенный


52

В стандартных лазейках запрещено следующее :

Утверждая, что ваш ответ написан в «MyOwnLanguage», где команда xозначает «прочитать последовательность чисел, разбить их на группы по три и вывести последние номера тех групп, где второе число меньше первого»

Здесь мы собираемся сделать то же самое.

задача

Учитывая последовательность натуральных чисел, длина которой делится на 3, разбейте их на группы по три и выведите последние числа из тех групп, где второе число меньше первого.

Testcases

Input               Output
[]                  []
[1,2,3,4,5,6,7,8,9] []
[2,1,3,5,4,6,8,7,9] [3,6,9]
[3,1,4,1,5,9,2,6,5] [4]
[100,99,123]        [123]
[123,123,456]       []
[456,123,789]       [789]

счет

Это . Кратчайший ответ в байтах побеждает.

Применяются стандартные лазейки , поэтому не забывайте иметь встроенную команду, xкоторая выполняет эту задачу.


31
Хммм ... Теперь мне очень хочется создать MyOwnLanguageи добавить xкоманду ...: P
DJMcMayhem

6
* помните, чтобы не иметь встроенного *‽ Ну, если у нас уже есть, мы можем использовать его, нет?
Адам

2
@ Adám Согласно стандартным лазекам, у вас не может быть языка, содержащего встроенную xфункцию, специально выполняющую эту функцию.
Утренняя монахиня

34
@ LeakyNun Да, вы можете, вы просто не можете сделать такой язык из- за проблемы. Если ваш язык предшествует вызову, это приемлемо.
Адам

9
Если я позвоню на встроенный p, могу ли я его использовать?
Mindwin

Ответы:



13

Желе , 9 8 байт

>Ḋm3T×3ị

Попробуйте онлайн!

Как это устроено

>Ḋm3T×3ị  Main link. Argument: A (array)

 Ḋ        Dequeue; yield A without its first element.
>         Compare the elements of A with the elements of the result.
  m3      Select each third element, starting with the first.
    T     Truth; get all indices of truthy elements.
     ×3   Multiply those indices by 3.
       ị  Unindex; retrieve the elements at the redulting indices.

12

Haskell, 30 29 байт

x(a:b:c:l)=[c|b<a]++x l
x d=d

Моя первая попытка игры в гольф на Haskell, так что, возможно, я пропустил оптимизацию или два

-1 байт благодаря @JulianWolf


4
Хороший ответ! См. Codegolf.stackexchange.com/a/60884/66904 для соответствующего совета ; в частности, поменяв местами два определения и записав второе (теперь первое), которое x d=dможет сэкономить вам байт
Джулиан Вольф

Умная! Я просмотрел этот ответ заранее, но, должно быть, пропустил ту часть, где определение повторно использовало переменную

11

Mathematica, 37 байт

Предполагая, что это удовлетворяет спецификации, ngenisis получает кредит за этот подход, ведущий к экономии 1 байта!

BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&

Чистая функция. BlockMap[...,#,3]&разбивает входной список на подсписки длиной 3, а затем работает с каждым подсписком с помощью функции If[#>#2,Print@#3]&@@#&. В результате печатается каждый последний соответствующий номер. Функция также возвращает значение (а именно, список на Nullтреть от длины списка ввода), что, по-видимому, является допустимым поведением.

Mathematica, 42 38 байт

Спасибо Мартину Эндеру за сохранение 4 байта!

Cases[#~Partition~3,{a__,b_}/;a>0:>b]&

Чистая функция. #~Partition~3делает то, что ты думаешь. Cases[X,P:>Q]выбирает все элементы, Xсоответствующие шаблону P, и возвращает результат правила преобразования, :>Qпримененного к каждому экземпляру. Здесь сопоставляемый шаблон {a__,b_}/;a>0: b_будет соответствовать последнему элементу списка и a__всем другим элементам (в данном случае, первым двум); позвони им yи zпока. Затем подлый a>0расширяется y>z>0, и это тест, который мы хотим применить (действительный, потому что спецификация говорит, что все будет положительным целым числом). И есть правило преобразования :>b, которое просто заменяет каждую совпадающую упорядоченную тройку своим последним элементом.

Исходное представление:

Last/@Select[#~Partition~3,#.{1,-1,0}>0&]&

Чистая функция; в значительной степени простая реализация, кроме #.{1,-1,0}которой вычисляется разница между первым и вторым элементами каждого 3-элементного подсписка.


3
Точечный продукт аккуратный, но #>#2&@@#&короче. Но в целом это все еще короче, чтобы использовать Casesвместо Select:Cases[#~Partition~3,{a__,b_}/;a>0:>b]&
Мартин Эндер

a>0:>в нем есть два вида магии!
Грег Мартин

BlockMapдразнит здесь.
ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&работает и только 39 байт ... мы можем сохранить пару байтов?
Грег Мартин

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&возможно , удовлетворяет спецификации
ngenisis



5

Брахилог (2), 14 байт

~c{Ṫ}ᵐ{k>₁&t}ˢ

Попробуйте онлайн!

Brachylog скорее борется с такой проблемой. Обратите внимание, что эта программа имеет ужасную вычислительную сложность, так как она грубой силой разделяет входные данные на группы по 3 (без встроенной функции «разбить на группы»); он работает быстро с четырьмя группами, но очень медленно с пятью.

объяснение

~c{Ṫ}ᵐ{k>₁&t}ˢ
~c              Split into groups
  { }ᵐ          such that each group
   Ṫ            has three elements
      {     }ˢ  then on each element, skipping that element on error:
       k          with the list minus its last element
        >₁        assert that it's strictly decreasing
          &       and with the original list
           t      keep only its last element

Стоит упомянуть, что l÷₃;?ḍ₍это более быстрая альтернатива.
Утренняя монахиня

У меня было это в более ранней попытке (использование /не ÷; они эквивалентны здесь), но это был байт длиннее, поэтому я отбросил его, играя в гольф.

4

J , 14 байт

_3&(>`[/\#]/\)

Это дает монадический глагол. Попробуйте онлайн!

объяснение

_3&(>`[/\#]/\)  Input is y.
_3&(    \    )  For each non-overlapping 3-element chunk of y,
    >`[/        check if first element is greater than second.
                Call the resulting array x.
_3&(        \)  For each non-overlapping 3-element chunk of y,
          ]/    take the last element.
         #      Keep those where the corresponding element of x is 1.

4

Алиса , 12 11 байт

Спасибо Лео за сохранение 1 байта.

I.h%I-rI~$O

Попробуйте онлайн!

Использует кодовые точки строки в качестве списка ввода и выводит символ, соответствующий выводам, которые следует сохранить.

объяснение

I      Read x. Pushes -1 on EOF.
.h%    Compute x%(x+1). This terminates the program due to division by zero at EOF,
       but does nothing for non-negative x.
I      Read y.
-      Compute x-y. We only want to output z is this is positive.
r      Range. Pushes 0 1 ... n for positive n, and -n ... 1 0 for negative n
       (and simply 0 for n = 0). So this results in a positive number on top
       of the stack iff x-y is positive.
I      Read z.
~      Swap it with x-y > 0.
$O     Output z iff x-y > 0.
       Then the IP wraps to the beginning of the program to process the next triplet.

Вы можете играть в гольф один байт, используя rвместо ex. TIO
Лев

@ Лео, это замечательно, спасибо!
Мартин Эндер



3

Perl 5 , 31 байт

30 байт кода + -pфлаг.

s/\d+ (\d+) (\d+)/$2if$1<$&/ge

Попробуйте онлайн!

Заменяет каждую группу из 3 чисел ( \d+ (\d+) (\d+)) на третью ( $2), если секунда ( $1) меньше первой ( $&), и ничто иное.


3

CJam , 15 байтов

{3/{)\:>{;}|}%}

Анонимный блок, который ожидает аргумент в стеке и оставляет результат в стеке.

Попробуйте онлайн! (Запускает все тестовые случаи)

объяснение

3/             e# Split the list into length-3 chunks.
  {            e# For each chunk:
   )           e#  Remove the last element.
    \:>        e#  Reduce the first 2 elements by greater than.
       {;}|    e#  If the first is not larger than the second, delete the third.
           }%  e# (end for)

3

Brain-Flak , 82 байта

{([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}((<({}<>)<>>))}{}{}}<>

Попробуйте онлайн!

# Until the stack is empty (input is guaranteed to not contain 0)
{

  # Push 1 for greater than or equal to 0
  ([({}[{}()]<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
  #  ^------^  This part is Top - (Second + 1)

  # If the second number was less than the first...
  {{}

     # Get ready to push 2 zeros
     ((<

       # Move the next number to the other stack
       ({}<>)<>

     # Push those 2 zeros
     >))}

     # Pop 2 values.
     # This is either 2 zeros, or a 0 and a "last number" that shouldn't be printed
     {}{}

# End loop
}

# Switch to the stack where we stored the numbers to be printed
<>

3

Желе , 10 байт

s3µṪWx>/µ€

Попробуйте онлайн!

или же

Проверьте контрольные примеры

-3 байта благодаря @LeakyNun

объяснение

s3µṪWx>/µ€
s3         - split into groups of three
  µ     µ€ - on each group, do:
   ṪW      - return the third element as the only element of a list
     x     - repeat each element in that list the number of times
      >/   - corresponding to 1 if the second element of the group is greater than the first; 0 otherwise.



3

R, 37 байт

Версия с scan()которой мне не нравится, но она делает ее короче.

x=scan();x[(i<--1:1)>0][x[!i]<x[i<0]]

Версия с function()которой легче тестировать (41 байт)

f=function(x)x[(i<--1:1)>0][x[!i]<x[i<0]]

Спасибо @Giuseppe! Хорошая идея использовать переработку индекса.

Контрольная работа:

f(c())
f(c(1,2,3,4,5,6,7,8,9))
f(c(2,1,3,5,4,6,8,7,9))
f(c(3,1,4,1,5,9,2,6,5))
f(c(100,99,123))
f(c(123,123,456))
f(c(456,123,789))

Выход:

> f(c())
NULL
> f(c(1,2,3,4,5,6,7,8,9))
numeric(0)
> f(c(2,1,3,5,4,6,8,7,9))
[1] 3 6 9
> f(c(3,1,4,1,5,9,2,6,5))
[1] 4
> f(c(100,99,123))
[1] 123
> f(c(123,123,456))
numeric(0)
> f(c(456,123,789))
[1] 789

вы читаете xиз stdin, используя x=scan()в начале вместо определения функции, вы также можете просто установить, i=c(1,2,0)так как логические индексы будут переработаны, т. е.x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe


Спасибо @ Джузеппе! Мне не нравится этот x=scan()подход, поскольку он делает ввод очень громоздким. И я не могу сделать это повторяемым тогда.
Джурио

2
Правильно, но цель - создать как можно более короткий код. К сожалению для нас обоих, кто-то еще нашел лучшее решение!
Джузеппе

Хех, у меня тоже была идея использовать, matrix()но почему-то я не верил, что можно будет сделать так коротко.
Джурио

3

JavaScript (ES6), 46 44 42 41 39 байт

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Сохранено 2 байта благодаря Нейлу .

Попробуй

Введите разделенный запятыми список чисел без пробелов.

f=
a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
i.oninput=_=>o.innerText=JSON.stringify(f(i.value.split`,`.map(eval)))
console.log(JSON.stringify(f([])))                  // []
console.log(JSON.stringify(f([1,2,3,4,5,6,7,8,9]))) // []
console.log(JSON.stringify(f([2,1,3,5,4,6,8,7,9]))) // [3,6,9]
console.log(JSON.stringify(f([3,1,4,1,5,9,2,6,5]))) // [4]
console.log(JSON.stringify(f([100,99,123])))        // [123]
console.log(JSON.stringify(f([123,123,456])))       // []
console.log(JSON.stringify(f([456,123,789])))       // [789]
<input id=i><pre id=o>


объяснение

a=>              :Anonymous function taking the input array as an argument via parameter a
a.filter((_,y)=> :Filter the array by executing a callback function on each element,
                  with the index of the current element passed through parameter y.
                  If the function returns 0 for any element, remove it from the array.
y%3>1            :Check if the modulo of the current index is greater than 1.
                  (JS uses 0 indexing, therefore the index of the 3rd element is 2; 2%3=2)
&                :Bitwise AND.
a[y-1]<a[y-2]    :Check if the element at index y-1 in array a
                  is less than the element at index y-2
)                :End filtering method

1
Работает ли y%3>1&a[y-1]<a[y-2]?
Нил

Вычеркнуто 44 все еще 44
Роман Грэф

Что ты имеешь в виду, @ RomanGräf?
Лохматый


Ошибка в "Arial", "Helvetica Neue", Helvetica, без засечек "- хорошо замечено @Roman
flurbius

3

Шелуха , 8 байт

ṁΓȯΓ↑<C3

Попробуйте онлайн!

объяснение

Эта программа немного вовлечена, так что терпите меня.

ṁΓȯΓ↑<C3  Implicit input (list of integers).
      C3  Split into slices of length 3.
ṁ         Map over slices and concatenate results
 ΓȯΓ↑<    of this function, explained below.

Функция ΓȯΓ↑<принимает список длиной 3 x = [a,b,c],. Первый Γразделяется xна aи [b,c]и передает их в качестве аргументов функции ȯΓ↑<. Это должно быть эквивалентно ((Γ↑)<), но из-за ошибки / возможности интерпретатора, это фактически эквивалентно (Γ(↑<)), интерпретируется как композиция Γи ↑<. Теперь передается aпоследней функции с использованием частичного применения, результирующей функции ↑<aприсваивается Γ, которая деконструирует [b,c]в bи [c]. Затем bподается на ↑<a, в результате чего функция, которая берет первые b<aэлементы из списка. Эта функция наконец применяется к [c]; результат [c]если a>bи[]в противном случае. Эти списки объединяются для формирования окончательного результата, который печатается неявно.

Без «фича» у меня было бы 9 байтов:

ṁΓoΓo↑<C3


2

MATL , 10 байт

IeI&Y)d0<)

Результат отображается в виде чисел, разделенных пробелами.

Попробуйте онлайн!

Или проверьте все тестовые случаи . Это отображает строковое представление вывода, так что пустой массив фактически рассматривается как []. Обратите внимание, что в MATL число совпадает с одноэлементным массивом, поэтому [4]отображается как 4.

объяснение

Ie    % Implicit input. Reshape as a 3-row matrix (column-major order)
I&Y)  % Split into the third row and a submatrix with the other two rows
d     % Consecutive difference along each column of the submatrix
0<    % True for negative values
)     % Use as logical index into the original third row. Implicitly display

2

Röda , 15 байт

{[_3]if[_2<_1]}

Рода почти такая же короткая, как и языки для игры в гольф ...

Это берет три значения из потока и _3возвращает третье ( ) обратно, если second ( _2) меньше первого ( _1).

Подчеркивания являются синтаксическим сахаром для forциклов, поэтому программа может быть написана как {{[a]if[b<c]}for a,b,c}или даже {[a]for a,b,c if[b<c]}.

Нет ссылки на TIO, потому что она по какой-то причине не работает на TIO (хотя работает с последней версией Röda, которая предшествовала этой проблеме).


2

Java 7, 86 85 байт

void c(int[]a){for(int i=-1;++i<a.length;)if(a[i++]>a[i++])System.out.println(a[i]);}

-1 байт благодаря @ PunPun1000

Объяснение:

Попробуй это здесь.

void c(int[]a){                  // Method with integer-array parameter and no return
  for(int i=-1;++i<a.length;)    //  Loop over the array in steps of three at a time
    if(a[i++]>a[i++])            //   If the value of the current index is larger than the next:
      System.out.println(a[i]);  //    Print the value on the third index
                                 //  End of loop (implicit / single-line body)
}                                // End of method

@ PunPun1000 Теперь вы только увеличили итерацию на 2, а не на 3, и, следовательно, дали неверные результаты (как 3,9для тестового примера 1,2,3,4,5,6,7,8,9вместо 3,6,9).
Кевин Круйссен

1
@Kevin_Cruijssen Упс, вы правы. Вы все еще можете сохранить байт, используя оператор приращения. Вам просто нужно начать с -1 Попробуйте онлайн!
PunPun1000

@ PunPun1000 Ах, ты прав, хороший улов. Спасибо!
Кевин Круйссен

2

C #, 126 байт

using System.Linq;i=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);

Если вам нужна целая программа с методом, это будет 175 байт :

using System.Linq;namespace S{class P{static System.Collections.IEnumerable X(int[]i)=>Enumerable.Range(0,i.Length/3).Select(u=>3*u).Where(u=>i[u]>i[u+1]).Select(u=>i[u+2]);}}

Сохранено 7 байт с помощью TheLethalCoder


Вы можете просто напечатать эти ...
Leaky Nun

@ LeakyNun, конечно, я мог бы - но почему я должен? Я спросил, нужно ли это, это не так, и, думаю, будет больше байтов.
MetaColon

(int[]i)может просто не быть iнеобходимости в типе.
TheLethalCoder

@TheLethalCoder Обновил его.
MetaColon

@ MetaColon Тебе тоже не нужны брекеты (i).
TheLethalCoder


1

CJam , 16 байтов

q~3/{~@@>S{;}?}%

Вывод отображается в виде чисел, разделенных пробелами.

Попробуйте онлайн!

объяснение

q~               e# Read input list
  3/             e# List of sublists of length 3
   {         }%  e# Apply this to each sublist
    ~            e# Push sublist contents: 3 numbers
     @@          e# Rotate twice. This moves first two numbers to top
       >         e# Greater than?
        S{;}?    e# If so: push space (used as separator). Else: pop the third number
                 e# Implicitly display


1

JavaScript, 108 107 108 байт

Это действительная анонимная (лямбда) функция JS. Добавить x=в начале и вызвать как x([5,4,9,10,5,13]). Выходы как функция return.

a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))

Фрагмент принимает входные данные как список целых чисел через запятую.

x=a=>(y=[],a.map((c,i)=>(i+1)%3?0:y.push(a.slice(i-2,i+1))),y.map(v=>v[1]<v[0]?v[2]:null).filter(c=>c|c==0))
martin.oninput = e => { dennis.innerHTML = x(martin.value.split`,`.map(c=>parseInt(c,10))) }
<input type=text id=martin><pre id=dennis>


Какой смысл публиковать более длинное решение, использовать martinи в dennisкачестве идентификатора?
Утренняя монахиня

@LeakyNun Shaggy опубликовал свое решение, пока я работал над своим. Но это не было причиной для меня, чтобы не публиковать свое решение. Что касается использования имен в качестве идентификаторов, я подумал, что это будет смешно.
Арджун,

Это не работает для [5,4,9,10,5,13].
Лохматый

@Shaggy Это была проблема с реализацией фрагмента тестового примера; ничего плохого в решении. На самом деле значение входного элемента всегда является строкой. Таким образом, разделение строки ,привело к тому, что она стала массивом строк, а не чисел! Решение прекрасно. Только фрагмент теста был неправильным. Я исправил это сейчас. Спасибо что подметил это! :)
Арджун

Ах да, это объясняет проблему! Спасибо вам , @Arjun.
Лохматый

1

Perl5.8.9, 73 60 байт

while(@F){@b=splice@F,0,3;$b[1]<$b[0]&&print$b[2]}print"-"

(58 + 2 для флага 'n', чтобы прочитать весь файл и для автоматического разделения). Предполагается, что входные данные представляют собой строки чисел, разделенных пробелами

Снижение благодаря Дада. Включая печать в конце для видимости, это сэкономило бы 8 байт, если нет.


Хороший! Имейте свои заслуженные +1!
Арджун

Формат вывода достаточно гибкий, вам не обязательно указывать это print"\n"в конце. Кроме того, вы можете сделать, $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,3чтобы сохранить 7 байтов. Наконец, вы можете использовать -aфлаг вместо выполнения @a=split(он будет делать то же самое автоматически и сохранять результат @Fвместо @a); с Perl 5.8.9 вам понадобится, в -naто время как с последними Perls -aдостаточно. Это должно привести вас к 47-48 байтам.
Дада

о, я не знал о -а. Я все еще думаю, что я должен сделать одну строку вывода на строку ввода, в противном случае вывод довольно непонятен
Том Таннер


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.