El prohibido incorporado


52

En las lagunas estándar , está prohibido lo siguiente :

Afirmando que su respuesta está escrita en "MyOwnLanguage", donde el comando xsignifica "leer una secuencia de números, dividirlos en grupos de tres e imprimir los últimos números de esos grupos donde el segundo número es menor que el primero"

Aquí, vamos a hacer exactamente lo mismo.

Tarea

Dada una secuencia de enteros positivos, cuya longitud es divisible por 3, divídalos en grupos de tres e imprima los últimos números de aquellos grupos donde el segundo número es menor que el primero.

Casos de prueba

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]

Puntuación

Este es el . La respuesta más corta en bytes gana.

Se aplican las lagunas estándar , así que recuerde no tener un comando incorporado xque realice esta tarea.


31
Hmmm ... Ahora estoy realmente tentado de crear MyOwnLanguagey agregar el xcomando ...: P
DJMcMayhem

66
* recuerda no tener un dispositivo incorporado *‽ Bueno, si ya lo tenemos, podemos usarlo, ¿no?
Adám

2
@ Adám De acuerdo con las lagunas estándar, no puede tener un lenguaje que contenga el incorporado xespecíficamente para realizar esa función.
Leaky Nun

34
@LeakyNun Sí, puedes, pero no puedes hacer ese lenguaje debido al desafío. Si su idioma es anterior al desafío, es aceptable.
Adám

99
Si llamo al builtin p, ¿puedo usarlo?
Mindwin

Respuestas:


14

Octava, 32 bytes

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

Pruébalo en línea!

o

¡Verifique los casos de prueba!

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

Jalea , 9 8 bytes

>Ḋm3T×3ị

Pruébalo en línea!

Cómo funciona

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

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

Mi primer intento de jugar al golf en Haskell, por lo que podría haber perdido una o dos optimizaciones

-1 byte gracias a @JulianWolf


44
¡Buena respuesta! Consulte codegolf.stackexchange.com/a/60884/66904 para obtener una sugerencia relevante; en particular, intercambiando las dos definiciones y escribiendo la segunda (ahora primera) como x d=dpuede ahorrarle un byte
Julian Wolf

¡Inteligente! Busqué esa respuesta de antemano, pero

11

Mathematica, 37 bytes

Suponiendo que esto satisfaga la especificación, ngenisis obtiene crédito por este enfoque que conduce a un ahorro de 1 byte.

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

Pura función. BlockMap[...,#,3]&divide la lista de entrada en sublistas de longitud 3 y luego opera en cada sublista con la función If[#>#2,Print@#3]&@@#&. El resultado es que se imprime cada último número que califica. La función también devuelve un valor (es decir, una lista de Nullun tercio siempre que la lista de entrada), que parece ser un comportamiento permitido.

Mathematica, 42 38 bytes

¡Gracias a Martin Ender por guardar 4 bytes!

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

Pura función. #~Partition~3hace lo que piensas Cases[X,P:>Q]selecciona todos los elementos de Xcoincidencia del patrón Py devuelve el resultado de la regla de transformación :>Qaplicada a cada instancia. Aquí, el patrón que se está haciendo coincidir es {a__,b_}/;a>0: b_coincidirá con el último elemento de la lista y a__todos los demás elementos (en este caso, los dos primeros); llámalos yy zpor ahora. El astuto a>0luego se expande a y>z>0, que es la prueba que queremos aplicar (válido porque la especificación dice que todo será un número entero positivo). Y la regla de transformación es :>b, que simplemente reemplaza cada triple ordenado coincidente con su último elemento.

Presentación original:

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

Función pura; más o menos una implementación sencilla, aparte de la #.{1,-1,0}cual calcula la diferencia entre el primer y el segundo elemento de cada sublista de 3 elementos.


3
El producto de punto es limpio, pero #>#2&@@#&es más corto. Pero en general es aún más corto para usar Casesen lugar de Select:Cases[#~Partition~3,{a__,b_}/;a>0:>b]&
Martin Ender

a>0:>tiene dos tipos de magia!
Greg Martin

BlockMapEs tentador aquí.
ngenisis

BlockMap[If[#>#2,#3,Nothing]&@@#&,#,3]&funciona y solo tiene 39 bytes ... ¿podemos guardar un par de bytes?
Greg Martin

1
BlockMap[If[#>#2,Print@#3]&@@#&,#,3]&podría decirse que satisface la especificación
ngenisis

8

Pyth, 10 bytes

eMf>FPTcQ3

Banco de pruebas

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 bytes

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

Pruébalo en línea!

Brachylog lucha bastante con este tipo de problema. Tenga en cuenta que este programa tiene una complejidad computacional horrible, ya que fuerza a la fuerza bruta dividiendo la entrada en grupos de 3 (sin tener "dividido en grupos" integrado); funciona rápidamente con cuatro grupos pero muy lentamente con cinco.

Explicación

~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 mencionar que l÷₃;?ḍ₍es una alternativa más rápida.
Leaky Nun

Tuve eso en un intento anterior (usando /no ÷; son equivalentes aquí), pero es un byte más largo, así que lo descarté mientras jugaba golf.

4

J , 14 bytes

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

Esto se evalúa como un verbo monádico. Pruébalo en línea!

Explicación

_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

Alicia , 12 11 bytes

Gracias a Leo por guardar 1 byte.

I.h%I-rI~$O

Pruébalo en línea!

Utiliza los puntos de código de una cadena como la lista de entrada y genera el carácter correspondiente a las salidas que deben mantenerse.

Explicación

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.

Puedes jugar golf un byte usando en rlugar de ex. TIO
Leo

@Leo eso es genial, ¡gracias!
Martin Ender


3

dc , 30 bytes

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

E / S: un número por línea.


3

Perl 5 , 31 bytes

30 bytes de código + -pbandera.

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

Pruébalo en línea!

Reemplaza cada grupo de 3 números ( \d+ (\d+) (\d+)) por la tercera ( $2) si el segundo ( $1) es menor que el primero ( $&), y nada de lo contrario.


3

CJam , 15 bytes

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

Bloque anónimo que espera un argumento en la pila y deja el resultado en la pila.

Pruébalo en línea! (Ejecuta todos los casos de prueba)

Explicación

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 bytes

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

Pruébalo en línea!

# 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

Jalea , 10 bytes

s3µṪWx>/µ€

Pruébalo en línea!

o

Verificar casos de prueba

-3 bytes gracias a @LeakyNun

Explicación

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 bytes

Versión con la scan()que no me gusta, pero la hace más corta.

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

Versión con la function()que es más fácil de probar (41 byte)

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

Gracias a @Giuseppe! Buena idea utilizar el reciclaje de índice.

Prueba:

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

Salida:

> 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

se lee xen la entrada estándar usando x=scan()al principio en vez de definir una función, También puede establecer simplemente i=c(1,2,0)ya que los índices lógicos se reciclan es decir,x=scan();i=c(1,2,0);x[!i][x[i>1]<x[i==1]]
Giuseppe


Gracias @Giuseppe! No me gusta este x=scan()enfoque, ya que hace que la entrada sea muy engorrosa. Y no puedo hacer que sea repetible entonces.
djhurio

2
Correcto, pero el objetivo es generar un código lo más corto posible. ¡Desafortunadamente para los dos, alguien más encontró una mejor solución!
Giuseppe

Heh, tuve la mejor idea de usar, matrix()pero de alguna manera no creía que fuera posible hacerlo tan corto.
djhurio

3

JavaScript (ES6), 46 44 42 41 39 bytes

a=>a.filter((_,y)=>y%3>1&a[y-1]<a[y-2])
  • Guardado 2 bytes gracias a Neil .

Intentalo

Ingrese una lista de números separados por comas, sin espacios.

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>


Explicación

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

Tachado 44 sigue siendo 44
Roman Gräf

¿Qué quieres decir, @ RomanGräf?
Shaggy


Un error en "Arial," Helvetica Neue ", Helvetica, sans-serif" - bien visto @Roman
flurbius

3

Casco , 8 bytes

ṁΓȯΓ↑<C3

Pruébalo en línea!

Explicación

Este programa es un poco complicado, así que tengan paciencia conmigo.

ṁΓȯΓ↑<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 función ΓȯΓ↑<toma una lista de longitud 3, x = [a,b,c]. El primero se Γdivide xen ay [b,c], y los alimenta como argumentos de la función ȯΓ↑<. Esto debería ser equivalente a ((Γ↑)<), pero debido a un error / característica del intérprete, en realidad es equivalente a (Γ(↑<)), interpretado como una composición de Γy ↑<. Ahora, ase alimenta a la última función usando una aplicación parcial, ↑<ase le da a la función resultante Γ, que se deconstruye [b,c]en by [c]. Luego bse alimenta a ↑<a, dando como resultado una función que toma los primeros b<aelementos de una lista. Esta función finalmente se aplica a [c]; el resultado es [c]si a>b, y[]de otra manera. Estas listas se concatenan para formar el resultado final, que se imprime implícitamente.

Sin la "característica", tendría 9 bytes:

ṁΓoΓo↑<C3


2

MATL , 10 bytes

IeI&Y)d0<)

El resultado se muestra como números separados por espacios.

Pruébalo en línea!

O verificar todos los casos de prueba . Esto muestra una representación de cadena de la salida, de modo que una matriz vacía se ve realmente como []. Tenga en cuenta que en MATL un número es lo mismo que una matriz singleton, por lo que [4]se muestra como 4.

Explicación

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 bytes

{[_3]if[_2<_1]}

Röda es casi tan corto como los idiomas de golf ...

Esto toma tres valores de la secuencia y empuja el tercer ( _3) hacia atrás, si el segundo ( _2) es menor que el primero ( _1).

Los guiones bajos son azúcar de sintaxis para los forbucles, por lo que el programa podría escribirse como {{[a]if[b<c]}for a,b,c}o incluso {[a]for a,b,c if[b<c]}.

Sin enlace TIO, porque no funciona en TIO por alguna razón (aunque funciona con la última versión de Röda que es anterior al desafío).


2

Java 7, 86 85 bytes

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

-1 byte gracias a @ PunPun1000

Explicación:

Pruébalo aquí.

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 Ahora solo ha incrementado la iteración en 2 en lugar de 3 y, por lo tanto, ha dado resultados incorrectos (como 3,9para el caso de prueba en 1,2,3,4,5,6,7,8,9lugar de 3,6,9).
Kevin Cruijssen

1
@Kevin_Cruijssen Vaya, tienes razón. Sin embargo, aún puede guardar un byte utilizando el operador de incremento. Solo tiene que comenzar en -1 ¡ Pruébelo en línea!
PunPun1000

@ PunPun1000 Ah, tienes razón, buena captura. ¡Gracias!
Kevin Cruijssen

2

C #, 126 bytes

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

Si desea un programa completo con el método, sería 175 Bytes :

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

Guardado 7 bytes con la ayuda de TheLethalCoder


Puedes imprimir esos ...
Leaky Nun

@LeakyNun, por supuesto que podría, pero ¿por qué debería hacerlo? Pregunté si es necesario, no lo es, y supondría que serían más bytes.
MetaColon

(int[]i)simplemente ino puede ser necesario para el tipo.
TheLethalCoder

@TheLethalCoder lo actualizó.
MetaColon

@MetaColon Tampoco necesitas las llaves (i).
TheLethalCoder


1

CJam , 16 bytes

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

La salida se muestra como números separados por espacios.

Pruébalo en línea!

Explicación

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 bytes

Esta es una función JS anónima (lambda) válida. Agregue x=al principio e invoque como x([5,4,9,10,5,13]). Salidas como función 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))

El fragmento toma la entrada como una lista de enteros separados por comas.

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>


¿Cuál es el punto de publicar una solución más larga y usar martiny denniscomo id?
Leaky Nun

@LeakyNun Shaggy publicó su solución mientras estaba trabajando en la mía. Pero esa no era razón para no publicar mi solución. En cuanto a usar los nombres como id, pensé que sería divertido.
Arjun

Esto no funciona para [5,4,9,10,5,13].
Shaggy

@Shaggy Ese fue un problema con la implementación del fragmento de caso de prueba; No hay nada malo con la solución. En realidad, el valor del elemento de entrada es siempre una cadena. Entonces, dividir la cadena ,resultó en una serie de cadenas en lugar de números. La solución está perfectamente bien. Solo el fragmento del caso de prueba estaba equivocado. He arreglado eso, ahora. ¡Gracias por señalar eso! :)
Arjun

¡Ah, sí, eso explica el problema! Gracias usted , @Arjun.
Shaggy

1

Perl5.8.9, 73 60 bytes

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

(58 + 2 para la bandera 'n' para leer todo el archivo y a para auto-división). Asume que la entrada es líneas de números separados por espacios

Reducción gracias a Dada. Incluyendo la impresión al final para visibilidad, eso ahorraría 8 bytes si no.


¡Buena esa! ¡Ten tu merecido +1!
Arjun

El formato de salida es bastante flexible, realmente no tiene que poner eso print"\n"al final. Además, puede hacer $b[1]<$b[0]&&print"$b[2] "while@b=splice@a,0,3para guardar 7 bytes. Finalmente, puede usar -aflag en lugar de hacer @a=split(hará lo mismo automáticamente y almacenará el resultado en @Flugar de @a); con Perl 5.8.9, necesitarás, -namientras que con Perls recientes, -aes suficiente. Eso debería llevarte a 47-48 bytes.
Dada

oh, no sabía sobre -a. Todavía creo que debería hacer una línea de salida por línea de entrada, de lo contrario, la salida es bastante incomprensible
Tom Tanner

1

Clojure, 43 bytes

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

Aburrido :/


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.