Il proibito incorporato


52

Nelle scappatoie standard è vietato quanto segue :

Affermare che la tua risposta è scritta in "MyOwnLanguage", dove il comando xsignifica "leggere una sequenza di numeri, dividerli in gruppi di tre e stampare gli ultimi numeri di quei gruppi in cui il secondo numero è inferiore al primo"

Qui faremo esattamente la stessa cosa.

Compito

Data una sequenza di numeri interi positivi, la cui lunghezza è divisibile per 3, li divide in gruppi di tre e stampa gli ultimi numeri di quei gruppi in cui il secondo numero è inferiore al primo.

Casi test

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]

punteggio

Questo è . Vince la risposta più breve in byte.

Si applicano scappatoie standard , quindi ricorda di non avere un comando integrato xche svolge questa attività.


31
Hmmm ... Ora sono davvero tentato di creare MyOwnLanguagee aggiungere il xcomando ...: P
DJMcMayhem

6
* ricorda di non avere un built-in *‽ Bene, se lo abbiamo già, possiamo usarlo, no?
Adám,

2
@ Adám Secondo le scappatoie standard, non è possibile avere una lingua che contenga lo xspecifico built-in che svolge tale funzione.
Leaky Nun,

34
@LeakyNun Sì, puoi, non puoi proprio fare un simile linguaggio a causa della sfida. Se la tua lingua precede la sfida, è accettabile.
Adám,

9
Se chiamo il built-in p, posso usarlo?
Mindwin,

Risposte:


14

Ottava, 32 byte

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

Provalo online!

o

Verifica i casi di test!

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

Gelatina , 9 8 byte

>Ḋm3T×3ị

Provalo online!

Come funziona

>Ḋ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 byte

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

Il mio primo tentativo di giocare a golf a Haskell, quindi potrei aver perso un'ottimizzazione o due

-1 byte grazie a @JulianWolf


4
Bella risposta! Vedi codegolf.stackexchange.com/a/60884/66904 per un suggerimento rilevante; in particolare, scambiando le due definizioni e scrivendo la seconda (ora la prima) per x d=dfarti risparmiare un byte
Julian Wolf

Intelligente! Ho cercato prima quella risposta ma devo aver perso la parte in cui la definizione ha riutilizzato la variabile

11

Mathematica, 37 byte

Supponendo che questo soddisfi le specifiche, ngenisis ottiene credito per questo approccio che porta ad un risparmio di 1 byte!

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

Funzione pura. BlockMap[...,#,3]&divide l'elenco di input in elenchi di lunghezza 3 e quindi opera su ciascun elenco con la funzione If[#>#2,Print@#3]&@@#&. Il risultato è che ogni ultimo numero valido viene stampato. La funzione restituisce anche un valore (vale a dire un elenco di Nullun terzo purché l'elenco di input), a cui sembra essere consentito il comportamento.

Mathematica, 42 38 byte

Grazie a Martin Ender per aver salvato 4 byte!

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

Funzione pura. #~Partition~3fa quello che pensi. Cases[X,P:>Q]seleziona tutti gli elementi di Xcorrispondenza del modello Pe restituisce il risultato della regola di trasformazione :>Qapplicata a ciascuna istanza. Qui, il modello da abbinare è {a__,b_}/;a>0: b_corrisponderà all'ultimo elemento della lista e a a__tutti gli altri elementi (in questo caso, i primi due); chiamali ye zper ora. Il subdolo a>0si espande quindi y>z>0, che è il test che vogliamo applicare (valido perché la specifica dice che tutto sarà un numero intero positivo). E la regola di trasformazione è :>b, che semplicemente sostituisce ogni tripla ordinata corrispondente con il suo ultimo elemento.

Presentazione originale:

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

Funzione pura; praticamente un'implementazione semplice, a parte la #.{1,-1,0}quale calcola la differenza tra il primo e il secondo elemento di ciascun elenco secondario a 3 elementi.


3
Il prodotto punto è pulito, ma #>#2&@@#&è più corto. Ma nel complesso è ancora più breve da usare Casesinvece di Select:Cases[#~Partition~3,{a__,b_}/;a>0:>b]&
Martin Ender

a>0:>contiene due tipi di magia!
Greg Martin,

BlockMapè allettante qui.
ngenisi,

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&funziona e ha solo 39 byte ... possiamo salvare un paio di byte?
Greg Martin,

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&soddisfa probabilmente la spec
ngenisi del

8

Pyth, 10 byte

eMf>FPTcQ3

Suite di test

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 byte

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

Provalo online!

Brachylog lotta piuttosto con questo tipo di problema. Si noti che questo programma ha un'orribile complessità computazionale, in quanto forza brutalmente a dividere l'input in gruppi di 3 (non avendo "diviso in gruppi" incorporato); gira rapidamente con quattro gruppi ma molto lentamente con cinque gruppi.

Spiegazione

~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

Vale la pena ricordare che l÷₃;?ḍ₍è un'alternativa più rapida.
Leaky Nun,

L'ho avuto in un tentativo precedente (usando /no ÷; sono equivalenti qui), ma è un byte più lungo quindi l'ho scartato mentre lo giocavo a golf.

4

J , 14 byte

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

Questo valuta un verbo monadico. Provalo online!

Spiegazione

_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 byte

Grazie a Leo per aver salvato 1 byte.

I.h%I-rI~$O

Provalo online!

Utilizza i punti di codice di una stringa come elenco di input e genera il carattere corrispondente agli output che devono essere mantenuti.

Spiegazione

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.

Puoi giocare a golf a un byte usando rinvece di ex. TIO
Leone,

@Leo è geniale, grazie!
Martin Ender,


3

dc , 30 byte

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

I / O: un numero per riga.


3

Perl 5 , 31 byte

30 byte di codice + -pflag.

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

Provalo online!

Sostituisce ogni gruppo di 3 numeri ( \d+ (\d+) (\d+)) con il terzo ( $2) se il secondo ( $1) è inferiore al primo ( $&) e nient'altro.


3

CJam , 15 byte

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

Blocco anonimo che prevede l'argomento nello stack e lascia il risultato nello stack.

Provalo online! (Esegue tutti i casi di test)

Spiegazione

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 byte

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

Provalo 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

Gelatina , 10 byte

s3µṪWx>/µ€

Provalo online!

o

Verifica casi di test

-3 byte grazie a @LeakyNun

Spiegazione

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 byte

Versione con la scan()quale non mi piace, ma la rende più breve.

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

Versione con function()cui è più facile testare (41 byte)

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

Grazie a @Giuseppe! Bella idea usare il riciclo dell'indice.

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

Produzione:

> 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

hai letto xdallo stdin usando x=scan()all'inizio invece di definire una funzione, puoi anche semplicemente impostare i=c(1,2,0)poiché gli indici logici vengono riciclati, cioè,x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe,


Grazie @Giuseppe! Non mi piace questo x=scan()approccio in quanto rende l'ingresso molto ingombrante. E quindi non posso renderlo ripetibile.
djhurio,

2
Giusto, ma l'obiettivo è generare un codice il più breve possibile. Sfortunatamente per entrambi, qualcun altro ha trovato una soluzione migliore!
Giuseppe,

Ehi, avevo anche l'idea di usare, matrix()ma in qualche modo non credevo che sarebbe stato possibile farlo in breve.
djhurio

3

JavaScript (ES6), 46 44 42 41 39 byte

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Salvato 2 byte grazie a Neil .

Provalo

Immettere un elenco di numeri separato da virgole, senza spazi.

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>


Spiegazione

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
Funziona y%3>1&a[y-1]<a[y-2]?
Neil,

Cancellati 44 sono ancora 44
Roman Gräf,

Cosa intendi con RomanGräf?
Shaggy,


Un bug in "Arial," Helvetica Neue ", Helvetica, sans-serif" - ben individuato @Roman
flurbius

3

Buccia , 8 byte

ṁΓȯΓ↑<C3

Provalo online!

Spiegazione

Questo programma è un po 'coinvolto, quindi abbi pazienza.

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

La funzione ΓȯΓ↑<prende una lista di lunghezza 3, x = [a,b,c]. Il primo si Γdivide xin ae [b,c], e li alimenta come argomenti della funzione ȯΓ↑<. Questo dovrebbe essere equivalente a ((Γ↑)<), ma a causa di un bug / caratteristica dell'interprete, in realtà è equivalente a (Γ(↑<)), interpretato come una composizione di Γe ↑<. Ora, aviene alimentato a quest'ultima funzione usando un'applicazione parziale, ↑<aviene data la funzione risultante Γ, che si decostruisce [b,c]in be [c]. Quindi bviene inviato a ↑<a, risultante in una funzione che accetta i primi b<aelementi da un elenco. Questa funzione è finalmente applicata a [c]; il risultato è [c]if a>be[]altrimenti. Queste liste sono concatenate per formare il risultato finale, che viene stampato implicitamente.

Senza la "caratteristica", avrei 9 byte:

ṁΓoΓo↑<C3


2

MATL , 10 byte

IeI&Y)d0<)

Il risultato viene visualizzato come numeri separati da spazi.

Provalo online!

Oppure verifica tutti i casi di test . Questo mostra una rappresentazione in forma di stringa dell'output, in modo che un array vuoto sia effettivamente visto come []. Si noti che in MATL un numero è uguale a un array singleton, quindi [4]viene mostrato come 4.

Spiegazione

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 byte

{[_3]if[_2<_1]}

Röda è breve quasi quanto le lingue del golf ...

Questo prende tre valori dallo stream e _3riporta il terzo ( ) indietro, se il secondo ( _2) è inferiore al primo ( _1).

I trattini bassi sono zucchero di sintassi per i forloop, quindi il programma potrebbe essere scritto come {{[a]if[b<c]}for a,b,c}o anche {[a]for a,b,c if[b<c]}.

Nessun collegamento TIO, perché non funziona su TIO per qualche motivo (sebbene funzioni con l'ultima versione di Röda che precede la sfida).


2

Java 7, 86 85 byte

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

-1 byte grazie a @ PunPun1000

Spiegazione:

Provalo qui.

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 Ora hai solo incrementato l'iterazione di 2 invece di 3, e quindi dando risultati errati (come 3,9nel caso del test 1,2,3,4,5,6,7,8,9invece che 3,6,9).
Kevin Cruijssen,

1
@Kevin_Cruijssen Oops hai ragione. È comunque possibile salvare un byte utilizzando l'operatore di incremento. Devi solo iniziare da -1 Provalo online!
PunPun1000,

@ PunPun1000 Ah, hai ragione, bella cattura. Grazie!
Kevin Cruijssen,

2

C #, 126 byte

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

Se si desidera un intero programma con il metodo sarebbe 175 byte :

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

Salvato 7 byte con l'aiuto di TheLethalCoder


Puoi semplicemente stampare quelle ...
Leaky Nun,

@LeakyNun ovviamente potrei - ma perché dovrei? Ho chiesto se è necessario, non lo è, e sarebbe più byte, immagino.
MetaColon,

(int[]i)può non essere inecessario per il tipo.
TheLethalCoder

@TheLethalCoder Lo ha aggiornato.
MetaColon

@MetaColon Non hai bisogno neanche delle parentesi graffe (i).
TheLethalCoder


1

CJam , 16 byte

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

L'output viene mostrato come numeri separati da spazi.

Provalo online!

Spiegazione

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 byte

Questa è una funzione anonima JS (lambda) valida. Aggiungi x=all'inizio e invoca like x([5,4,9,10,5,13]). Uscite come funzione 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))

Lo snippet accetta l'input come un elenco di numeri interi separati da virgola.

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>


Qual è il punto di pubblicare una soluzione più lunga, e usare martine denniscome id?
Leaky Nun,

@LeakyNun Shaggy ha pubblicato la sua soluzione mentre stavo lavorando alla mia. Ma non era una ragione per me non pubblicare la mia soluzione. Per quanto riguarda l'utilizzo dei nomi come ID, ho pensato che sarebbe stato divertente.
Arjun,

Questo non funziona per [5,4,9,10,5,13].
Shaggy,

@Shaggy Quello era un problema con l'implementazione dello snippet del caso di test; niente di sbagliato con la soluzione. In realtà, il valore dell'elemento di input è sempre una stringa. Quindi, dividere la stringa su ne ,ha fatto diventare una matrice di stringhe piuttosto che numeri! La soluzione è perfettamente soddisfacente. Solo lo snippet del test case era errato. L'ho risolto, ora. Grazie per la segnalazione! :)
Arjun,

Oh, sì, questo spiega il problema! Grazie voi , @Arjun.
Shaggy,

1

Perl 5.8.9, 73 60 byte

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

(58 + 2 per il flag 'n' per leggere l'intero file e per eseguire l'autosplit). Presuppone che l'input sia costituito da righe di numeri separati da spazi

Riduzione grazie a Dada. Inclusa la stampa alla fine per la visibilità, che risparmierebbe 8 byte in caso contrario.


Ben fatto! Hai il tuo meritato +1!
Arjun,

Essendo il formato di output abbastanza flessibile, non devi davvero metterlo print"\n"alla fine. Inoltre, puoi fare $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,3per salvare 7 byte. Infine, puoi usare -aflag invece di fare @a=split(farà lo stesso automaticamente e memorizzerà il risultato @Finvece di @a); con Perl 5.8.9, è necessario -namentre con Perls recenti, -aè sufficiente. Questo dovrebbe portarti a 47-48 byte.
Dada,

oh, non sapevo di -a. Penso ancora che dovrei fare una riga di output per riga di input, altrimenti l'output è piuttosto incomprensibile
Tom Tanner

1

Clojure, 43 byte

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

Noioso: /


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.