Заборонений вбудований


52

У стандартних лазівки , наступне заборонено :

Стверджуючи, що ваша відповідь написана в "MyOwnLanguage", де команда xозначає "прочитати послідовність чисел, розділити їх на групи по три і надрукувати останні числа тих груп, де друге число менше першого".

Тут ми будемо робити саме те саме.

Завдання

Враховуючи послідовність натуральних чисел, довжина яких ділиться на 3, розділіть їх на групи по три і надрукуйте останні числа тих груп, де друге число менше першого.

Тестові шафи

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функцію, яка спеціально виконує цю функцію.
Leaky Nun

34
@LeakyNun Так, ви можете, ви просто не можете скласти таку мову через проблеми. Якщо ваша мова передує виклику, це прийнятно.
Адам

9
Якщо я називаю вбудований p, чи можу я його використовувати?
Міндвін

Відповіді:



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

Моя перша спроба в гольф Хаскелл, тому я, можливо, пропустив оптимізацію чи дві

-1 байт завдяки @JulianWolf


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

Розумний! Я заздалегідь переглянув цю відповідь, але, мабуть, пропустив частину, де визначення повторно використало змінну

11

Математика, 37 байт

Припускаючи, що це задовольняє специфікації, ngenisis отримує кредит за цей підхід, що веде до 1-байтової економії!

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

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

Математика, 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&@@#&коротший. Але загалом замість цього все-таки коротше :CasesSelectCases[#~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]&Можливо, задовольняє характеристики
1717



5

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

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

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

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

@Leo це геніально, дякую!
Мартін Ендер




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

Мозок-Флак , 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()підхід, оскільки це робить дуже громіздким. І я не можу зробити це повторюваним тоді.
dhhurio

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

Хе, я також мав ідею використовувати, matrix()але я якось не вірив, що можна зробити так коротко.
dhhurio

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, sans-serif" - добре помічений @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

Рода , 15 байт

{[_3]if[_2<_1]}

Röda майже такий же короткий, як мови для гольфу ...

Це бере три значення з потоку і відштовхує третє ( _3) назад, якщо друге ( _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як id?
Leaky Nun

@LeakyNun Шаггі розмістив своє рішення, поки я працював над своїм. Але це не було причиною для мене, щоб не публікувати своє рішення. Щодо використання імен як ідентичних, я вважав, що це буде смішно.
Арджун

Це не працює [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', щоб прочитати весь файл та a для автошпалі). Передбачається, що введення - це рядки пробілів, розділених цифрами

Скорочення завдяки Даді. Включаючи друк в кінці для наочності, ви можете зберегти 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.