Zabronione wbudowane


52

W standardowych lukach zabronione jest :

Twierdzenie, że twoja odpowiedź jest napisana w „MyOwnLanguage”, gdzie polecenie xoznacza „przeczytaj sekwencję liczb, podziel je na grupy po trzy i wydrukuj ostatnie liczby z tych grup, w których druga liczba jest mniejsza niż pierwsza”

Tutaj zrobimy dokładnie to samo.

Zadanie

Biorąc pod uwagę ciąg dodatnich liczb całkowitych, których długość dzieli się przez 3, podziel je na grupy po trzy i wydrukuj ostatnie liczby z tych grup, w których druga liczba jest mniejsza niż pierwsza.

Przypadki testowe

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]

Punktacja

To jest . Najkrótsza odpowiedź w bajtach wygrywa.

Obowiązują standardowe luki , więc pamiętaj, aby nie mieć wbudowanego polecenia xwykonującego to zadanie.


31
Hmmm ... Teraz naprawdę kusi mnie, aby utworzyć MyOwnLanguagei dodać xpolecenie ...: P
DJMcMayhem

6
* pamiętaj, aby nie mieć wbudowanego *‽ Cóż, jeśli już go mamy, możemy go użyć, nie?
Adám

2
@ Adám Zgodnie ze standardowymi lukami nie można mieć języka zawierającego wbudowane xfunkcje wykonujące tę funkcję.
Leaky Nun

34
@LeakyNun Tak, możesz, po prostu nie możesz stworzyć takiego języka z powodu wyzwania. Jeśli Twój język wyprzedza wyzwanie, jest to do przyjęcia.
Adám

9
Czy pmogę użyć wbudowanego wywołania ?
Mindwin

Odpowiedzi:


14

Oktawa, 32 bajty

@(L)L(x=3:3:end)(diff(L)(x-2)<0)

Wypróbuj online!

lub

Sprawdź przypadki testowe!

L3 = L(3:3:end)  %extract last elements of groups
d= diff(L)       % first difference of the list
y=d(1:3:end)     %extract first elements of each subgroup of the difference
idx = y<0        %check for negative numbers  
result = L3(idx)

13

Galaretka , 9 8 bajtów

>Ḋm3T×3ị

Wypróbuj online!

Jak to działa

>Ḋ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 bajtów

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

Moja pierwsza próba gry w golfa w Haskell, więc mogłem przegapić optymalizację

-1 bajt dzięki @JulianWolf


4
Niezła odpowiedź! Zobacz codegolf.stackexchange.com/a/60884/66904 do odpowiedniej końcówki; w szczególności zamiana dwóch definicji i napisanie drugiej (teraz pierwsza) x d=dmoże zaoszczędzić bajt
Julian Wolf

Sprytny! Wcześniej przejrzałem tę odpowiedź, ale musiałem przeoczyć tę część, w której definicja ponownie wykorzystała zmienną

11

Mathematica, 37 bajtów

Zakładając, że spełnia to specyfikację, ngenisis zyskuje uznanie za to podejście prowadzące do oszczędności 1-bajta!

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

Czysta funkcja. BlockMap[...,#,3]&dzieli listę wejściową na podlisty o długości 3, a następnie działa na każdej podlistie z funkcją If[#>#2,Print@#3]&@@#&. W rezultacie drukowany jest każdy ostatni numer kwalifikujący się. Ta funkcja zwraca również wartość (mianowicie listę Nullsa trzeciego tak długo, jak lista wejściowa), co wydaje się być dozwolonym zachowaniem.

Mathematica, 42 38 bajtów

Dzięki Martin Ender za oszczędność 4 bajtów!

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

Czysta funkcja. #~Partition~3robi to, co myślisz. Cases[X,P:>Q]wybiera wszystkie elementy Xdopasowania wzorca Pi zwraca wynik reguły transformacji :>Qzastosowanej do każdej instancji. Tutaj dopasowywany wzorzec to {a__,b_}/;a>0: b_dopasuje ostatni element listy i a__wszystkie pozostałe elementy (w tym przypadku pierwsze dwa); zadzwoń do nich yi zna razie. Sneaky a>0następnie rozwija się do y>z>0testu, który chcemy zastosować (ważny, ponieważ specyfikacja mówi, że wszystko będzie dodatnią liczbą całkowitą). Reguła transformacji polega na tym :>b, że po prostu zamienia każdy dopasowany uporządkowany potrójny na ostatni element.

Oryginalne zgłoszenie:

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

Czysta funkcja; prawie prosta implementacja, inna niż ta, #.{1,-1,0}która oblicza różnicę między pierwszym i drugim elementem każdej 3-elementowej listy podrzędnej.


3
Produkt kropkowy jest schludny, ale #>#2&@@#&krótszy. Ale ogólnie rzecz biorąc, nadal jest krótszy w użyciu Caseszamiast Select:Cases[#~Partition~3,{a__,b_}/;a>0:>b]&
Martin Ender

a>0:>ma w sobie dwa rodzaje magii!
Greg Martin

BlockMapjest tu kuszące.
ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&działa i czy ma tylko 39 bajtów ... czy możemy zapisać kilka bajtów?
Greg Martin

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&prawdopodobnie spełnia spec
ngenisis

8

Pyth, 10 bajtów

eMf>FPTcQ3

Zestaw testowy

eMf>FPTcQ3
       cQ3    Chop the input into groups of size 3
  f           Filter on
     PT       All but the last element
   >F         Apply the greater than function
eM            Map to the last element


5

Brachylog (2), 14 bajtów

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

Wypróbuj online!

Brachylog raczej zmaga się z tego rodzaju problemem. Zauważ, że ten program ma straszną złożoność obliczeniową, ponieważ brutalne siły dzielą dane wejściowe na grupy 3 (bez wbudowanego „podziału na grupy”); działa szybko z czterema grupami, ale bardzo powoli z pięcioma.

Wyjaśnienie

~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

Warto wspomnieć, że l÷₃;?ḍ₍jest to szybsza alternatywa.
Leaky Nun

Miałem to we wcześniejszej próbie (użycie /nie ÷; są tutaj równoważne), ale jest to bajt dłużej, więc odrzuciłem go podczas gry w golfa.

4

J , 14 bajtów

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

To odnosi się do czasownika monadycznego. Wypróbuj online!

Wyjaśnienie

_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

Alice , 12 11 bajtów

Dzięki Leo za oszczędność 1 bajtu.

I.h%I-rI~$O

Wypróbuj online!

Używa punktów kodowych ciągu jako listy wejściowej i wypisuje znak odpowiadający wyjściowym, które powinny zostać zachowane.

Wyjaśnienie

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.

Możesz zagrać w golfa za pomocą jednego bajtu rzamiast ex. TIO
Leo

@Leo to wspaniale, dziękuję!
Martin Ender


3

dc , 30 bajtów

[???sAz1[[lAps.]s.<.dx]s.<.]dx

I / O: jedna liczba na linię.


3

Perl 5 , 31 bajtów

30 bajtów kodu + -pflaga.

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

Wypróbuj online!

Zastępuje każdą grupę 3 liczb ( \d+ (\d+) (\d+)) trzecią ( $2), jeśli druga ( $1) jest mniejsza niż pierwsza ( $&) i nic innego.


3

CJam , 15 bajtów

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

Anonimowy blok, który oczekuje argumentu na stosie i pozostawia wynik na stosie.

Wypróbuj online! (Uruchamia wszystkie przypadki testowe)

Wyjaśnienie

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 bajty

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

Wypróbuj online!

# 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

Galaretka , 10 bajtów

s3µṪWx>/µ€

Wypróbuj online!

lub

Sprawdź przypadki testowe

-3 bajty dzięki @LeakyNun

Wyjaśnienie

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 bajtów

Wersja, z scan()którą mi się nie podoba, ale czyni ją krótszą.

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

Wersja, z function()którą łatwiej jest przetestować (41 bajtów)

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

Dzięki @Giuseppe! Fajny pomysł na wykorzystanie recyklingu indeksu.

Test:

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

Wynik:

> 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

czytasz xod standardowego wejścia, używając x=scan()na początku zamiast definiowania funkcji, Możesz także po prostu ustawić, i=c(1,2,0)ponieważ indeksy logiczne są ponownie przetwarzane, tj.x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe


Dzięki @Giuseppe! Nie podoba mi się to x=scan()podejście, ponieważ sprawia, że ​​wkład jest bardzo kłopotliwy. I nie mogę uczynić tego powtarzalnym.
djhurio

2
Zgadza się, ale celem jest wygenerowanie możliwie najkrótszego kodu. Niestety dla nas obu ktoś znalazł lepsze rozwiązanie!
Giuseppe,

Heh, równie dobrze miałem pomysł na użycie, matrix()ale jakoś nie wierzyłem, że będzie to możliwe tak krótko.
djhurio

3

JavaScript (ES6), 46 44 42 41 39 bajtów

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Zaoszczędzono 2 bajty dzięki Neilowi .

Spróbuj

Wprowadź listę liczb oddzieloną przecinkami, bez spacji.

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>


Wyjaśnienie

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
Czy y%3>1&a[y-1]<a[y-2]działa
Neil

Przekreślone 44 to wciąż 44
Roman Gräf

Co masz na myśli, @ RomanGräf?
Kudłaty


Błąd w „Arial”, „Helvetica Neue”, Helvetica, sans-serif ”- dobrze zauważony @Roman
Flurbius

3

Łuska , 8 bajtów

ṁΓȯΓ↑<C3

Wypróbuj online!

Wyjaśnienie

Ten program jest trochę zaangażowany, więc trzymaj się mnie.

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

Funkcja ΓȯΓ↑<pobiera listę długości 3 x = [a,b,c]. Pierwszy Γdzieli się xna ai [b,c]przekazuje je jako argumenty do funkcji ȯΓ↑<. Powinno to być równoważne ((Γ↑)<), ale z powodu błędu / funkcji interpretera, w rzeczywistości jest równoważne (Γ(↑<)), interpretowane jako kompozycja Γi ↑<. Teraz ajest podawany do tej ostatniej funkcji przy użyciu częściowej aplikacji, wynikowa funkcja ↑<ajest przekazywana do Γ, która dekonstruuje [b,c]do bi [c]. Następnie bjest podawany do ↑<a, w wyniku czego funkcja pobiera pierwsze b<aelementy z listy. Ta funkcja jest w końcu stosowana do [c]; wynikiem jest, [c]jeśli a>bi[]Inaczej. Listy te są łączone w celu uzyskania końcowego wyniku, który jest drukowany w sposób dorozumiany.

Bez „funkcji” miałbym 9 bajtów:

ṁΓoΓo↑<C3


2

MATL , 10 bajtów

IeI&Y)d0<)

Wynik jest wyświetlany jako liczby oddzielone spacjami.

Wypróbuj online!

Lub sprawdź wszystkie przypadki testowe . Wyświetla ciąg znaków reprezentujący dane wyjściowe, dzięki czemu pusta tablica jest faktycznie postrzegana jako []. Zauważ, że w MATL liczba jest taka sama jak tablica singletonów, więc [4]jest pokazana jako 4.

Wyjaśnienie

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 bajtów

{[_3]if[_2<_1]}

Röda jest prawie tak krótka, jak języki gry w golfa ...

To pobiera trzy wartości ze strumienia i wypycha trzecią ( _3) z powrotem, jeśli druga ( _2) jest mniejsza niż pierwsza ( _1).

Podkreślenia to cukier składniowy dla forpętli, więc program można zapisać jako {{[a]if[b<c]}for a,b,c}lub nawet {[a]for a,b,c if[b<c]}.

Brak linku TIO, ponieważ z jakiegoś powodu nie działa na TIO (chociaż działa z najnowszą wersją Rödy, która poprzedza wyzwanie).


2

Java 7, 86 85 bajtów

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

-1 bajt dzięki @ PunPun1000

Wyjaśnienie:

Wypróbuj tutaj.

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 Teraz zwiększyłeś tylko iterację o 2 zamiast 3, a zatem daje niepoprawne wyniki (tak jak 3,9w przypadku testowym 1,2,3,4,5,6,7,8,9zamiast 3,6,9).
Kevin Cruijssen

1
@Kevin_Cruijssen Ups, masz rację. Nadal możesz jednak zapisać bajt, używając operatora inkrementacji. Musisz tylko zacząć od -1 Wypróbuj online!
PunPun1000

@ PunPun1000 Ah, masz rację, niezły chwyt. Dzięki!
Kevin Cruijssen

2

C #, 126 bajtów

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

Jeśli chcesz cały program z tą metodą, będzie to 175 bajtów :

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

Zapisano 7 bajtów za pomocą TheLethalCoder


Możesz po prostu wydrukować te ...
Leaky Nun

@LeakyNun oczywiście mogłem - ale dlaczego miałbym? Zapytałem, czy jest to konieczne, tak nie jest, i chyba więcej bajtów.
MetaColon

(int[]i)może być po prostu iniepotrzebny dla tego typu.
TheLethalCoder

@TheLethalCoder Zaktualizowano to.
MetaColon

@MetaColon Nie potrzebujesz też nawiasów klamrowych (i).
TheLethalCoder


1

CJam , 16 bajtów

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

Dane wyjściowe są wyświetlane jako liczby oddzielone spacjami.

Wypróbuj online!

Wyjaśnienie

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 bajtów

To jest poprawna funkcja anonimowa JS (lambda). Dodaj x=na początku i wywołaj jak x([5,4,9,10,5,13]). Wyjścia jako funkcja 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))

Fragment przyjmuje dane wejściowe jako listę liczb całkowitych oddzielonych przecinkami.

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>


Jaki jest sens publikowania dłuższego rozwiązania oraz używania martini dennisjako identyfikatora?
Leaky Nun

@LeakyNun Shaggy opublikował swoje rozwiązanie, gdy pracowałem nad moim. Ale to nie był powód, dla którego nie opublikowałem mojego rozwiązania. Jeśli chodzi o używanie nazw jako identyfikatorów, pomyślałem, że to będzie śmieszne.
Arjun,

To nie działa dla [5,4,9,10,5,13].
Kudłaty

@Shaggy To był problem z implementacją fragmentu przypadku testowego; nic złego w rozwiązaniu. W rzeczywistości wartością elementu wejściowego jest zawsze ciąg. Tak więc podzielenie łańcucha ,spowodowało, że powstał szereg ciągów zamiast liczb! Rozwiązanie jest w porządku. Tylko fragment przypadku testowego był niepoprawny. Naprawiłem to teraz. Dzięki za zwrócenie na to uwagi! :)
Arjun,

Och, tak, to wyjaśnia problem! Dziękuję wam , @Arjun.
Kudłaty

1

Perl5.8.9, 73 60 bajtów

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

(58 + 2 dla flagi „n”, aby odczytać cały plik i a dla automatycznego podziału). Zakłada, że ​​dane wejściowe to linie liczb oddzielonych spacją

Redukcja dzięki Dadzie. Uwzględniając nadruk na końcu dla widoczności, co pozwoliłoby zaoszczędzić 8 bajtów, jeśli nie.


Niezłe! Niech Twój zasłużony +1!
Arjun,

Format wyjściowy jest dość elastyczny, tak naprawdę nie musisz go umieszczać print"\n"na końcu. Możesz także zrobić, $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,3aby zapisać 7 bajtów. Na koniec możesz użyć -aflagi zamiast @a=split(zrobi to samo automatycznie i zapisze wynik @Fzamiast @a); z Perl 5.8.9, trzeba -nanatomiast z ostatnich Perls, -awystarczy. To powinno doprowadzić Cię do 47-48 bajtów.
Dada,

och, nie wiedziałem o -a. Nadal uważam, że powinienem zrobić jedną linię wyjściową na linię wejściową, w przeciwnym razie dane wyjściowe są dość niezrozumiałe
Tom Tanner

1

Clojure, 43 bajty

#(for[[a b c](partition 3 %):when(< b a)]c)

Nudny :/


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.