Jolly Jumper Sequence


15

Uma sequência de n> 0 inteiros é chamada jumper jolly se os valores absolutos da diferença entre elementos sucessivos assumirem todos os valores de 1 a n-1.

Portanto, a sequência [4,1,2,4] possui diferenças absolutas [3,1,2], o que equivale ao conjunto [1,2,3] (1 a n-1 onde n é o comprimento da sequência original) portanto, é um jumper alegre.

Sequências têm comprimento n> 0.

Suponha que n = 1 é um jumper alegre.

Modo Fácil: Não se preocupe com stdin / stdout. Apenas uma função que aceita argumentos no entanto e retorna algo que indica alegre ou não

Modo Hard: Entrada em stdin (espaço separado) e a saída é "Jolly" / "Not jolly". Problemas de capitalização.

Isso é código de golfe.

EDIT: As seqüências podem conter números inteiros negativos e a entrada no stdin é separada por espaço.

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly

1
Como é dada a sequência? Como uma corda? "4124"?
Steven Rumbalski 01/09/11

Eu acho que o espaço separado seria a convenção mais comum, então vou dizer isso.
Eternalmatt 01/09

6
Você diz que a entrada está no stdin, mas seus exemplos aceitam a entrada como argumentos de linha de comando. O que devemos esperar?
Gareth

Respostas:


3

Haskell

Fácil 4 caracteres

Retorna uma lista de inteiros alegres se e somente se uma lista de inteiros alegres for fornecida como entrada. Isso é legal com base em "Apenas uma função que aceita argumentos e retorna algo que indica alegre ou não".

j=id

Solução fácil alternativa com 61 caracteres:

Pega uma lista e retorna a lista vazia se a sequência for alegre.

import List
j n=zipWith(\x->abs.(x-))n(tail n)\\[1..length n]

1
+1 Boas regras de advocacia. Embora gostaria de salientar que, em GolfScript o programa vazio seria suficiente ...
Peter Taylor

A solução alternativa parece dar resultado errado. [1,3]não é alegre, é? Eu acho que você deve iterar length n-1.
Rotsor

2

Ruby, 92 93 caracteres

A versão hard com entrada no STDIN.

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

Se você iniciá-lo com -pa(conta como 4), poderá salvar 5 caracteres:

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

Ah, boa melhoria. Não sabia que havia um método each_cons.
migimaru 02/09/11

Acabei de perceber que isso falha quando a sequência é de um único dígito. Você teria que usar f.size em vez de f [-1].
migimaru 4/09/11

Ah, você também pode salvar 5 caracteres se executá-lo com opções -pa.
migimaru 5/09/11

2

Java (rígido)

Assume que a entrada é fornecida através do stdin. (não através de argumentos de linha de comando, como por exemplo)

Golfe - 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");
}
}

Un-Golfed

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

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 executar ou testar em 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"))
   }
}

O nome pode ser j em vez de pular.
usuário desconhecido

@ usuário desconhecido Sim, eu sei. Percebi cerca de meia hora depois que o publiquei que: a) eu poderia encurtar o nome do método eb) eu precisava usar uma lista em vez de um conjunto, ou ele não funcionaria corretamente. : -S
Gareth

E as regras atualizadas esperam que os números sejam divididos por espaço, 4124 pode ser um, dois, três ou 4 números.
usuário desconhecido

@ usuário desconhecido Oh, ótimo. Outra pessoa postando uma pergunta e depois alterando as regras no meio.
Gareth

Eu removi o tipo de retorno Boolean, um literal 'return' antes de `false 'e alterei Math para math. Salvando de 137 a 123.
user unknown

2

Golfscript, modo fácil, 21 18 caracteres

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

Aceita argumentos como uma matriz de entradas na pilha, com mais nada na pilha; deixa 1 na pilha se for alegre e 0 em caso contrário. Para receber a entrada no stdin como uma lista de entradas separada por espaço, preencha

~]

e para produzir "Jolly" / "Not jolly" (assumindo que estamos transformando isso em um programa)

"Not jJ"5/="olly"

Fiquei me perguntando como isso poderia funcionar - levei um momento para perceber que, quando você escreve "uma lista de entradas na pilha", realmente significa uma lista de entradas (ou seja [4 1 2 4], não 4 1 2 4).
Ilmari Karonen 26/03

@IlmariKaronen, agora não sei por que escrevi "lista". Eu editei para "array" para torná-lo mais 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 (difícil), 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
Não alegre


1

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

edit: manipula listas menores que 3, corrige a leitura stdin

A primeira linha cuida do modo fácil, a segunda adiciona o modo difícil.

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

J lê geralmente da direita para a esquerda:

2-/\ : para cada dois números sucessivos na lista, faça a diferença

| : valor absoluto

/:~ : classificar em ordem crescente

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

= : compare as diferenças classificadas com a sequência (usando um "garfo" J)

*/: multiplique todos os booleanos em termos de elementos; se todas as comparações foram 1, o produto deles é 1, então é alegre


Considere entrada 1 3.
Peter Taylor

Obrigado, Peter. Corrigido ... e ainda não competitivo com o seu Golfscript. Bem feito.
DCharness 02/09/11

1

Ruby, 97 102 106 (difícil)

Pode ser, já que todo mundo é:

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 tirada no stdin.


Você pode substituir (1..d.size).to_apor [*1..d.size]. Agora é possível trocar operandos, salva outro (total de -5 caracteres).
Howard

@ Howard Oh, então é assim que você faz! Eu tenho tentado descobrir uma maneira de golfe para converter intervalos em matrizes por um tempo agora. Obrigado!
migimaru 02/09/11

1

D

fácil ( 103 83 caracteres)

retorna soma de 1..i.length em Jolly algum outro número, se não (um pouco de regras aqui)

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

difícil (142 caracteres)

entrada é delimitada por espaço em branco e termina no 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");}

1

Groovy

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"}

1

PowerShell, rígido, 117 126

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

História:

  • 18/11/2011 17:54 ( 123 , −3) - Alterado $nullpara uma variável inexistente
  • 18/11/2011 18:02 ( 117 , −6) - destacou todas as declarações de variáveis

1

Scala

Uma facada rápida - provavelmente há melhorias possíveis.

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

Ok - estamos perdidos, Luigi nos encontrou! :) Bem-vindo ao CodeGolf. Imediatamente começo a aprender alguma coisa. Ponto de interrogação como identificador? Whooo - quem permitiu isso? :)
usuário desconhecido

Sim, e tudo para raspar 1 personagem! É a diferença entre caracteres alfanuméricos e caracteres de operador (consulte stackoverflow.com/q/7656937/770361 ), o que significa que às vezes você pode omitir espaços (mas às vezes precisa de caracteres extras) e pontos. O código de golfe é ótimo para aprender - um pouco como acrobacias para voar.
Luigi Plinge 26/03/12

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}

1

J (fácil), 19 caracteres

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

Uso:

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

Variam de maneira semelhante à resposta de DCharness , e eu apenas a adicionaria como comentário, mas pelo fato de ele não ter visitado desde 23 de fevereiro.

2-/\ leva a diferença entre pares sucessivos de números,

| obtém o valor absoluto de cada número,

/:~ classifica em ordem crescente,

<: diminui cada número em 1,

(=i.@#)um gancho J que gera a sequência de números de 0 ao comprimento da lista de diferenças - 1 ( i.@#) e a compara com essa lista= .

*/múltiplos da lista de 1s e 0s gerado pelo verbo anterior.


Só percebi depois que enviei minha resposta: adotamos a mesma abordagem, mas eu usei em x-:yvez de */x=ysalvar um personagem.
ephemient

1

Scala easy: 138 153, 170 (foi incorreta, melhorou mais 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}

ungolfed:

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
}

A idéia é que construamos a segunda derivação:

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 172 182, 205 (foi incorreto / aprimorado):

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

mais ou menos o mesmo que acima.


A entrada 4 1 2 5retorna verdadeira. Ainda não consegui me conformar com isso deixou vezes embora ...
Gareth

Oh sim, encontrei o meu erro. Precisa corrigi-lo.
usuário desconhecido

readLineleva entrada do console, e não o stdin ... (mas você pode usar argsem vez)
Luigi Plinge

E j("1")jogaUnsupportedOperationException: empty.max
Luigi Plinge

Perdão - como você define a diferença entre stdin e "input from the console"?
usuário desconhecido

1

PHP, fácil, 129

Para uma determinada matriz $sde números inteiros:

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';

A versão não destruída:

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";        

1

Geléia , 7 6 bytes (fácil)

IAṢ⁼J$

Experimente online!

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

Recebe entrada como números separados por vírgula no primeiro argumento. Retorna 1 se a sequência for alegre e 0 se não for!

Solução de 7 bytes:

LRṖḟIA$

Experimente online!

Recebe entrada como números separados por vírgula no primeiro argumento. Não retorna nada se a lista for uma sequência de jumper alegre e algo se não for.

A adição desta linha faz com que ela funcione com as especificações rígidas:

Geléia , 27 22 bytes (muito, feedback bem-vindo!)

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

Experimente online!

ɠḲ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!

Solução de 27 bytes (difícil):

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

Experimente online!

Coloca em números separados por espaço stdin e gera "Jolly" ou "Not jolly".

Explicação:

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".

Qualquer feedback muito apreciado!


1
LRé J. Se você escrever algo como IAṢ⁼J$você obtém um bom resultado 1/0, e pode usá-lo para indexar em “Not jolly“Jolly”:ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
Lynn

@ Lynn Obrigado, isso é muito melhor! Truque inteligente com o empacotamento de um índice, e eu aprendi mais sobre o átomo também, útil para comparar apenas 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, retorna a alegria como um booleano. Obrigado a @Laikoni por dois bytes.

Experimente online!



1

Python 3, 117 (difícil)

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

Experimente online!


Há um erro no seu programa. Experimente online #
mbomb007

Isso fornece a resposta errada para o primeiro caso de teste. Verifique seu programa para os casos de teste contidos na pergunta.
mbomb007

Sinta-se envergonhado, porque quando a versão errada corrigida esqueceu de inverter as saídas; (
Андрей Ломакин

Bem-vindo ao PPCG !!
Luis felipe De jesus Munoz

0

JavaScript: 105 (modo fácil)

Golfe:

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}

Sem golfe:

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
}

0

Perl, 89 (difícil)

86 caracteres de código + 3 para execução com a -popção

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


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"

2
Olá John e bem vindo. A idéia do código de golfe é reduzir o tamanho o máximo possível. Eu não sou um pyhtonian, mas "Enter Numbers" é definitivamente supérfluo.
desconhecido utilizador

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

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

Difícil :

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'

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

Eu adicionei o nome do idioma e a contagem de caracteres à sua resposta (ele roda como Python e é isso que eu assumo). A contagem de caracteres que dei é a que é fornecida pelo script de usuário . Você provavelmente poderia reduzir o primeiro nível de recuo para um espaço para salvar alguns caracteres aqui.
27512 Gareth

0

C, 119 (difícil), 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");}

A solução fácil lê a entrada dos argumentos e retorna um 0 como código de saída se a entrada for uma sequência de jumper 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);}

0

APL ( 50 49 47, difícil)

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

Fácil (24):

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

A função pega uma matriz e retorna 0 ou 1.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.