Secuencia Jumper Jumper

15

Una secuencia de n> 0 enteros se llama jolly jumper si los valores absolutos de la diferencia entre elementos sucesivos toman todos los valores 1 a n-1.

Entonces, la secuencia [4,1,2,4] tiene diferencias absolutas [3,1,2] que es equivalente al conjunto [1,2,3] (1 a n-1 donde n es la longitud de la secuencia original) Por lo tanto, es un puente alegre.

Las secuencias tienen una longitud n> 0.

Suponga que n = 1 es un puente alegre.

Modo fácil: no se preocupe por stdin / stdout. Sin embargo, solo una función que acepta argumentos y devuelve algo que indica alegre o no

Modo duro: entrada en stdin (espacio separado), y la salida es "Jolly" / "Not jolly". La capitalización importa.

Este es el código de golf.

EDITAR: Las secuencias pueden contener enteros negativos y la entrada en stdin está separada por espacios.

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly
eternalmatt
fuente
1
¿Cómo se da la secuencia? Como una cuerda? "4124"?
Steven Rumbalski
Creo que el espacio separado sería la convención más común, así que lo diré.
eternalmatt
66
Dices que input está en stdin, pero tus ejemplos toman input como argumentos de línea de comando. ¿Qué debemos esperar?
Gareth

Respuestas:

3

Haskell

4 personajes fáciles

Devuelve una lista de enteros alegres si y solo si se proporciona una lista de enteros alegres como entrada. Esto es legal basado en "Solo una función que acepta argumentos y devuelve algo que indica alegre o no".

j=id

Solución alternativa fácil con 61 caracteres:

Toma una lista y devuelve la lista vacía si la secuencia es alegre.

import List
j n=zipWith(\x->abs.(x-))n(tail n)\\[1..length n]
Thomas Eding
fuente
1
+1 Buenas reglas de abogacía. Aunque debería señalar que en GolfScript el programa vacío sería suficiente ...
Peter Taylor
La solución alternativa parece dar un resultado incorrecto. [1,3]no es alegre, ¿verdad? Supongo que debes iterar en su length n-1lugar.
Rotsor
2

Ruby, 92 93 caracteres

La versión dura con entrada en STDIN.

f=gets.split.each_cons(2).map{|a|eval(a*?-).abs}.sort
$><<(f==[*1..f.size]??J:"Not j")+"olly"

Si comienza con -pa(cuenta como 4) puede guardar 5 caracteres:

f=$F.each_cons(2).map{|a|eval(a*?-).abs}.sort
$_=(f==[*1..f.size]??J:"Not j")+"olly"
Howard
fuente
Ah, buena mejora. No me di cuenta de que había un método each_cons.
migimaru
Me acabo de dar cuenta de que esto falla cuando la secuencia es un solo dígito. Tendría que quedarse con f.size en lugar de f [-1].
migimaru
Ah, también puedes guardar 5 caracteres si lo ejecutas con opciones -pa.
migimaru
2

Java (duro)

Asume que la entrada se da a través de stdin. (no a través de argumentos de línea de comando como por ejemplo)

Golfizado - 325

class JollyJumper {
public static void main(String[] args) {
String[] in = new Scanner(System.in).nextLine().split(" ");
int[] j=new int[in.length-1],k=j.clone();
for(int i=0;i<in.length-1;i++){j[i]=Math.abs(Integer.parseInt(in[i])-Integer.parseInt(in[i+1]));k[i]=i+1;}
Arrays.sort(j);System.out.println(Arrays.equals(j, k)?"Jolly":"Not jolly");
}
}

Sin golf

public class JollyJumper {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int[] jolly;
    String[] in;

    in = sc.nextLine().split(" ");
    jolly = new int[in.length-1];

    for (int i = 0; i < in.length-1; i++)
        jolly[i] = Math.abs(Integer.parseInt(in[i]) - Integer.parseInt(in[i+1]));

    Arrays.sort(jolly);

    for (int i = 1; i <= in.length-1; i++) {
        if (jolly[i-1] != i) {
            System.out.println("Not jolly");
            return;
        }
    }
    System.out.println("Jolly");
}
}
josh-fuggle
fuente
2

Scala, modo fácil, 123 caracteres

def j(s:String)={var a=s.sliding(2,1).map(x=>math.abs(x(0)-x(1))).toList
for(c<-1 to a.size)
if(!a.contains(c))false
true}

Para ejecutar o probar en ideone.com:

object Main
{
   def main(args:Array[String])
   {
      def j(s:String):Boolean=
      {
         var a=s.sliding(2,1).map(x=>math.abs(x(0)-x(1))).toList
         for(c<-1 to a.size)
            if(!a.contains(c)) false
         true
      }
      println(j("4124"))
   }
}
Gareth
fuente
El nombre podría ser j en lugar de jump.
Usuario desconocido
@usuario desconocido Sí, lo sé. Me di cuenta de aproximadamente media hora después de que lo publiqué que a) podría acortar el nombre del método, yb) necesito usar una Lista en lugar de un Conjunto, o no funcionará correctamente. : -S
Gareth
Y las reglas actualizadas esperan que los números se dividan por espacio, 4124 podría ser uno, dos, tres o 4 números.
Usuario desconocido
@usuario desconocido Oh genial. Otra persona publica una pregunta y luego cambia las reglas a la mitad.
Gareth
Eliminé el tipo de retorno Boolean, un literal 'return' antes de 'false' y cambié Math a math. Ahorro de 137 a 123.
usuario desconocido
2

Golfscript, modo fácil, 21 18 caracteres

{.@-abs\}*;0]$.,,=

Acepta argumentos como una matriz de entradas en la pila, sin nada más en la pila; deja 1 en la pila si es alegre y 0 en caso contrario. Para tomar entrada en stdin como una lista de entradas separadas por espacios, anteponga

~]

y para mostrar "Jolly" / "Not jolly" (asumiendo que estamos convirtiendo esto en un programa) postpend

"Not jJ"5/="olly"
Peter Taylor
fuente
Me preguntaba cómo podría funcionar esto: me llevó un momento darme cuenta de que cuando escribes "una lista de entradas en la pila", realmente te refieres a una lista de entradas (es decir [4 1 2 4], no 4 1 2 4).
Ilmari Karonen
@IlmariKaronen, no estoy seguro ahora por qué escribí "lista". Lo he editado en "array" para hacerlo más claro.
Peter Taylor
2

J (fácil), 18

(i.@#-:<:/:])|2-/\
   (i. @ # -: <: /:]) | 2 - / \ 2 _1 0 2
1
   (i. @ # -: <: /:]) | 2 - / \ 19 22 24 25
1
   (i. @ # -: <: /:]) | 2 - / \ 19 22 24 21
0 0

J (duro), 68

2!:55]1!:2&2'olly',~>('Not j';'J'){~(i.@#-:<:/:])|2-/\".@>2}.ARGV_j_
$ jconsole jumper.ijs 2 -1 0 2
Alegre
$ jconsole jumper.ijs 19 22 24 25
Alegre
$ jconsole jumper.ijs 2 19 22 24 21
No alegre
efímero
fuente
2

Brachylog , 11 bytes (fácil)

s₂ᶠ-ᵐȧᵐo~⟦₁

Pruébalo en línea!

s₂ᶠ-ᵐ - Diferencias consecutivas

ȧᵐ - Valores absolutos

o - Ordenar

~⟦₁ - ¿El resultado es el rango 1 a algo?

sundar - Restablecer a Monica
fuente
1

J, 30 26 modo fácil, 81 76 modo difícil

editar: manejar listas de menos de 3, corregir la lectura de stdin

La primera línea se encarga del modo fácil, la segunda agrega el modo difícil.

j=:[:*/[:(>:@i.@#=/:~)[:|2-/\]
exit('olly',~[:>('Not j';'J'){~[:j 0".}:)&.stdin''

J lee generalmente de derecha a izquierda:

2-/\ : por cada dos números sucesivos en la lista, tome la diferencia

| : valor absoluto

/:~ : ordenar en orden ascendente

>:@i.@#: 1 a n , para una lista de n números

= : compara las diferencias ordenadas con la secuencia (usando una "bifurcación" J)

*/: multiplica todos los booleanos de elementos sabios; si todas las comparaciones fueran 1, su producto es 1, entonces es alegre

DCharness
fuente
Considere la entrada 1 3.
Peter Taylor
Gracias @Peter. Solucionado ... y todavía no es competitivo con su Golfscript. Bien hecho.
DCharness
1

Ruby, 97 102 106 (duro)

También podría, ya que todos los demás son:

h,*t=gets.split
d=t.map{|i|h,i=i,h;eval(i+?-+h).abs}.sort
$><<(d==[*1..d.size]??J:"Not j")+"olly"

Entrada tomada en stdin.

migimaru
fuente
Puedes reemplazar (1..d.size).to_apor [*1..d.size]. Ahora es posible cambiar operandos, guarda otro (total -5 caracteres).
Howard
@Howard ¡Oh, así es como lo haces! He estado tratando de encontrar una forma de golf para convertir rangos en matrices por un tiempo. ¡Gracias!
migimaru
1

re

fácil ( 103 83 caracteres)

devuelve la suma de 1..i.length en Jolly algún otro número si no (un poco de reglas que caen aquí)

import std.math;auto jolly(I)(I i){int t,l;foreach(r;i){t+=abs(l-r);l=r;}return t;}

duro (142 caracteres)

la entrada está delimitada por espacios en blanco y termina en EOF

import std.stdio;import std.math; void main(){int i,j,l,t;while(readf("%d ",&i)>0){t+=abs(l-i);l=i;j++;}write(t==j*++j/2?"J":"Not j","olly");}
monstruo de trinquete
fuente
1

Maravilloso

Fácil: 78

j={m=[];it[1..-1].inject(it[0]){p,n->m<<p-n;n};m*.abs().sort()==1..<it.size()}

assert [[2, -1, 0, 2,], [19, 22, 24, 25], [19, 22, 24, 21]].collect { j(it) } == [true, true, false]

Difícil: 151

j={m=[];it[1..-1].inject(it[0]){p,n->m<<p-n;n};m*.abs().sort()==1..<it.size()};System.in.eachLine{println "${j(it.split()*.toLong())?'J':'Not j'}olly"}
Armand
fuente
1

PowerShell, duro, 117 117126

('Not j','J')["$(($a=-split$input)|%{if($x-ne$0){[math]::abs($x-$_)}$x=$_}|sort)"-eq"$(1..($a.Count-1)|sort)"]+'olly'

Historia:

  • 2011-11-18 17:54 ( 123 , −3) - Cambiado $nulla una variable inexistente
  • 2011-11-18 18:02 ( 117 , −6) - en línea todas las declaraciones de variables
Joey
fuente
1

Scala

Una puñalada rápida: probablemente haya posibles mejoras.

Fácil: 77

def j(? :Int*)=(?tail,?).zipped.map(_-_).map(math.abs).sorted==(1 to?.size-1)

Difícil: 124

val? =args.map(_.toInt)toSeq;print(if((?tail,?).zipped.map(_-_).map(math.abs).sorted==(1 to?.size-1))"Jolly"else"Not jolly")
Luigi Plinge
fuente
Ok, estamos perdidos, ¡Luigi nos encontró! :) Bienvenido en CodeGolf. Inmediatamente empiezo a aprender algo. Signo de interrogación como identificador? Whooo, ¿quién permitió eso? :)
usuario desconocido
Sí, ¡y todo para afeitar a 1 personaje! Es la diferencia entre los caracteres alfanuméricos y los caracteres del operador (consulte stackoverflow.com/q/7656937/770361 ), lo que significa que a veces puede omitir espacios (pero a veces necesita más) y puntos. Sin embargo, el código de golf es ideal para aprender, un poco como las acrobacias aéreas para volar.
Luigi Plinge
1

Q, 64 (difícil), 30 (fácil)

difícil

{$[(1_(!)(#)x)~asc abs 1_(-':)x;(-1"Jolly";);(-1"Not jolly";)];}

fácil

{(1_(!)(#)x)~asc abs 1_(-':)x}
tmartin
fuente
1

J (fácil), 19 caracteres

*/(=i.@#)<:/:~|2-/\

Uso:

    */(=i.@#)<:/:~|2-/\4 2 1 4
1

Varía de manera similar a la respuesta de DCharness , y lo habría agregado como un comentario si no hubiera visitado desde el 23 de febrero.

2-/\ toma la diferencia entre pares de números sucesivos,

| obtiene el valor absoluto de cada número,

/:~ se ordena en orden ascendente,

<: disminuye cada número en 1,

(=i.@#)un gancho J que genera la secuencia de números desde 0 hasta la longitud de la lista de diferencias - 1 ( i.@#) y la compara con esa lista= .

*/multiplica la lista de 1sys 0generada por el verbo anterior.

Gareth
fuente
No me di cuenta hasta después de que envié mi respuesta: tomamos el mismo enfoque, pero usé en x-:ylugar de */x=yguardar un personaje.
Ephemient 01 de
1

Scala fácil: 138153, 170 (fue erróneo, mejoró más tarde)

def j(i:String)={
def a(s:Seq[Int])=(s zip s.tail).map(x=>(x._2-x._1))
a(a(i.split(" ").map(_.toInt)).map(math.abs).sorted).toSet.size==1}

sin golf:

def jolly (input: String) = { 
      val list = input.split (" ").map (_.toInt)

      def stepsize (s: Seq[Int]) = 
        (s zip s.tail).map (x=> (x._2 - x._1))

      val first = stepsize (input.split (" ").map (_.toInt))
      val pos = first.map (math.abs)
      val unique = stepsize (pos.sorted).toSet
      (unique.size) == 1
}

La idea es que construyamos la segunda derivación:

Original: 4 1 2 4
Stepsize:  -3 1 2 (first)
     abs:   3 1 2
  sorted:   1 2 3 
Stepsize:     1 1 
  to Set:       1 
    size:       1

Scala hard 172182 , 205 (fue erróneo / mejorado):

def j{
def a(s:Seq[Int])=(s zip s.tail).map(x=>(x._2-x._1))
println((if(a(a(readLine.split(" ").map(_.toInt)).map(math.abs).sorted).toSet.size==1)"J"else"Not j")+"olly")}
j

más o menos lo mismo que arriba.

usuario desconocido
fuente
La entrada 4 1 2 5devuelve verdadero. Sin embargo, todavía no he logrado entender ese pliegue izquierdo ...
Gareth
Oh sí, encontré mi error. Necesito corregirlo.
usuario desconocido
readLinetoma entrada de la consola, no del stdin ... (pero puedes usarlo argsen su lugar)
Luigi Plinge
Y j("1")lanzaUnsupportedOperationException: empty.max
Luigi Plinge
Perdón: ¿cómo define la diferencia entre stdin y "entrada desde la consola"?
usuario desconocido el
1

PHP, fácil, 129

Para un conjunto dado $sde enteros:

for($i=1;$i<count($s);$i++)$a[abs($s[$i]-$s[$i-1])]=1;
for($i=1;$i<count($s);$i++)if(!isset($a[$i]))die('Not Jolly');echo 'Jolly';

La versión sin golf:

for( $i=1; $i<count( $s ); $i++ )
    $a[ abs( $s[$i] - $s[$i-1] ) ] = 1;

for( $i=1; $i < count($s); $i++ )
    if( !isset( $a[$i] ) )
        die( 'Not Jolly' );

echo "Jolly";        
Barry O'Donovan
fuente
1

jalea , 7 6 bytes (fácil)

IAṢ⁼J$

Pruébalo en línea!

IAṢ⁼J$    jolly function on N:
IAṢ       the increment list: get all the Increments, take their Absolute values, and Ṣort them
   ⁼      compare that to...
    J$    range from 1 to len(N) -- this has an extra number, but that's fine because...
          ...the increment list is one shorter, and ⁼ will only compare that many values

Toma la entrada como números separados por comas en el primer argumento. ¡Devuelve 1 si la secuencia es alegre y 0 si no lo es!

Solución de 7 bytes:

LRṖḟIA$

Pruébalo en línea!

Toma la entrada como números separados por comas en el primer argumento. No devuelve nada si la lista es una secuencia de jolly jumper, y algo si no lo es.

Agregar esta línea hace que funcione con la especificación rígida:

Jelly , 27 22 bytes (¡duro, comentarios bienvenidos!)

ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»

Pruébalo en línea!

ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
ɠḲV                     read a line, split on spaces and eValuate the numbers
   IAṢ⁼J$               jolly function: see above!
         ị              ịndex the result into (remember Jelly is one-indexed, so 0 wraps around to the back):
          “¢⁼D“          "Jolly" compressed if true,
              ¡KṀȥƘạ»   or, "Not jolly" compressed if false!

Solución de 27 bytes (dura):

LRṖḟIA$
ɠḲVÇ“¡KṀȥƘạ»“¢⁼D»L?

Pruébalo en línea!

Toma números separados por espacios en stdin y genera "Jolly" o "Not jolly".

Explicación:

LRṖḟIA$               jolly function:
LRP                   make a range (R) from 1 to the input length (L), popping off (P) the last number to make it 1 to N-1.
   ḟ                  reverse filter: remove all the elements from that range that are members of...
    IA$               the increment list: get all the increments, take their absolute values (expressed as one monad via '$').
ɠḲVÇ“¡KṀȥƘạ»“¢⁼D»L?    i/o main function:
ɠḲV                   read a line from stdin, split it on spaces and have Python parse each number (handling negative signs)
   Ç             ?    run the above, and use the result on the following conditional:
                L?    if the length of the result is truthy (non-empty):
    “¡KṀȥƘạ»          then, return Jelly compressed string "Not jolly",
            “¢⁼D»     else, return Jelly compressed string "Jolly".

Cualquier comentario muy apreciado!

Harry
fuente
1
LRes J. Si escribe algo así IAṢ⁼J$, obtiene un buen resultado 1/0, y puede usarlo para indexar “Not jolly“Jolly”:ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
Lynn
@ Lynn ¡Gracias, eso está mucho mejor! Truco inteligente con la envoltura de un índice, y también aprendí más sobre el átomo, útil para comparar solo partes de listas.
Harry
1

Haskell , 59 57 bytes

f n=all(`elem`map abs(zipWith(-)n$tail n))[1..length n-1]

Modo fácil, devuelve la alegría como un booleano. Gracias a @Laikoni por dos bytes.

Pruébalo en línea!

Angs
fuente
1

Japt , 32 30 bytes duro

-2 bytes de @Shaggy

`not jo¥y`s4*Näa n äa e¥1
hUÎu

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
1
30 bytes . Solo noté el requisito de capitalización en el último segundo, por lo que probablemente pueda mejorar aún más.
Shaggy
1

Python 3, 117 (duro)

l=[*map(int,input().split())]
print(["Not j","J"][{abs(a-b)for a,b in zip(l[1:],l[:-1])}=={*range(1,len(l))}]+"olly")

Pruébalo en línea!

Андрей Ломакин
fuente
Hay un error en su programa. Pruébelo en línea
mbomb007
Esto da la respuesta incorrecta para el primer caso de prueba. Verifique su programa para ver los casos de prueba contenidos en la pregunta.
mbomb007
Sentirse avergonzado, porque cuando la versión incorrecta corregida olvidó invertir las salidas; (
Андрей Ломакин
Bienvenido a PPCG !!
Luis felipe De jesus Munoz
0

JavaScript: 105 (modo fácil)

Golfizado:

function a(l){for(r=i=1;i<(m=l.length);i++){for(j=t=0;j+1<m;)t+=(d=l[j]-l[++j])*d==i*i;t||(r=0)}return r}

Sin golf:

function isJolly(list){
    //Iterate over i to list.length-1
    for(r=i=1;i<(length=list.length);i++){
        //Check the differences between all consecutive elements squared minus i squared.  Set t to true if one was found.
        for(j=t=0;j+1<length;)t+=(diff=list[j]-list[++j])*diff==i*i;

        //if t is not true, return value is 0
        t||(r=0)
    }
    return r
}
Briguy37
fuente
0

Perl, 89 (duro)

86 caracteres de código + 3 para ejecutar con la -popción

@a=0;$a[abs($1-$2)]=1while s/(\S+) (\S+)/$2/;$_='Jolly';(grep{!defined}@a)&&s/J/Not j/
DCharness
fuente
0

Javascript (duro): 138

a=prompt().split(" ")
i=0;b=[];c=[]
while(b[i]=Math.abs(a[i]-a[++i]),c[i-1]=i,i<a.length-1);b.sort()
alert(b+""==c+""?"Jolly":"Not jolly")
Peter Olson
fuente
0
    #!/usr/bin/env python

def main():
    pass

if __name__ == '__main__':
    main()

numbers = []
jolly_list = []

numbers = raw_input("Enter Numbers: ").split()
for count in range ( len(numbers)-1 ) :
    jolly_list.append ( abs( int(numbers[count]) - int(numbers[count+1]) ) )

jolly_list = sorted(jolly_list)
for count in range(len(jolly_list)) :
    flag = 0
    if count+1 == jolly_list[count] :
        flag = 1
    else :
        flag = 0
        print "Not Jolly"
        break
if flag == 1:
    print "Jolly"
John Miller
fuente
2
Hola John y bienvenido. La idea del código de golf es reducir el tamaño lo más posible. No soy un pitoniano, pero "Enter Numbers" es definitivamente superfluo.
usuario desconocido
0

R, fácil, 110

f=function(s){p=NULL;l=length;for (i in 2:l(s))p=c(p,abs(s[i]-s[i-1]));ifelse(all(sort(p)==(1:(l(s)-1))),1,0)}

Uso:

f(c(2, -1, 0, 2))
[1] 1
f(c(19, 22, 24, 25))
[1] 1
f(c(19, 22, 24, 21))
[1] 0
Paolo
fuente
0

Python, 72 (fácil), 114 (difícil)

Fácil:

def f(a):return len(set(map(lambda x,y:abs(x-y),a[1:],a[:-1])))>len(a)-2

Duro :

a=map(int,raw_input().split())
print('Not j','J')[len(set(map(lambda x,y:abs(x-y),a[1:],a[:-1])))>len(a)-2]+'olly'
hallvabo
fuente
0

Python, 255 caracteres

r=[19,22,24,25]
i=0
k=[ i+1 for i in range(len(r)-1)]
def jolly(a):
    p=[]
    i=0
    while i<len(a)-1: 
       p.append(abs(a[i+1]-a[i]))
       i+=1
    p.sort() 
    if p==k:
       return 'jolly'
    else:
       return 'Not jolly'

print(jolly(r))
Ashwini Chaudhary
fuente
He agregado el nombre del idioma y el recuento de caracteres a su respuesta (se ejecuta como Python, así que eso es lo que supongo que es). El recuento de caracteres que he dado es el que da el script de usuario . Probablemente podría reducir el primer nivel de sangría a un espacio para guardar algunos caracteres aquí.
Gareth
0

C, 119 (duro), 97 (fácil)

b,c,a[];main(k){while(~scanf("%d",a+c))k=c++;for(c=k;b<c*c;)k-abs(a[b%c]-a[b++%c+1])?:k--;puts(k?"Not jolly":"Jolly");}

La solución fácil lee la entrada de los argumentos y devuelve un 0 como código de salida si la entrada es una secuencia de puente alegre:

i,k;main(int c,char**a){for(k=c-=2,a++;i<c*c;)k-abs(atoi(a[i%c])-atoi(a[i++%c+1]))?:k--;exit(k);}
cuasimodo
fuente
0

APL ( 50 49 47, duro)

'Not jolly' 'Jolly'[1+K[⍋K←¯1↓|Z-1⌽Z]≡¯1↓⍳⍴Z←⎕]

Fácil (24):

{K[⍋K←¯1↓|⍵-1⌽⍵]≡¯1↓⍳⍴⍵}

La función toma una matriz y devuelve 0 o 1.

marinus
fuente