Jolly Jumper Sequence


15

Una sequenza di n> 0 è chiamata jolly se i valori assoluti della differenza tra elementi successivi assumono tutti i valori da 1 a n-1.

Quindi la sequenza [4,1,2,4] ha differenze assolute [3,1,2] che è equivalente all'insieme [1,2,3] (da 1 a n-1 dove n è la lunghezza della sequenza originale) quindi è quindi un jolly jumper.

Le sequenze hanno lunghezza n> 0.

Supponiamo che n = 1 sia un jolly jumper.

Modalità facile: non preoccuparti di stdin / stdout. Solo una funzione che accetta argomenti e restituisce qualcosa che indica jolly o no

Modalità difficile: input su stdin (spazio separato) e output "Jolly" / "Not jolly". La capitalizzazione conta.

Questo è il codice golf.

EDIT: le sequenze possono contenere numeri interi negativi e l'input su stdin è separato dallo spazio.

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly

1
Come viene data la sequenza? Come una stringa? "4124"?
Steven Rumbalski,

Penso che la separazione spaziale sarebbe la convenzione più comune, quindi lo dirò.
eternalmatt,

6
Dici che l'input è su stdin, ma i tuoi esempi prendono l'input come argomenti della riga di comando. Cosa dovremmo aspettarci?
Gareth,

Risposte:


3

Haskell

4 personaggi facili

Restituisce un elenco di numeri interi jolly se e solo se viene fornito come input un elenco di numeri interi jolly. Questo è legale sulla base di "Solo una funzione che accetta argomenti e restituisce qualcosa che indica jolly o no".

j=id

Soluzione alternativa semplice con 61 caratteri:

Accetta un elenco e restituisce un elenco vuoto se la sequenza è allegra.

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

1
+1 Buone regole per legiferare. Anche se dovrei sottolineare che in GolfScript il programma vuoto sarebbe sufficiente ...
Peter Taylor,

La soluzione alternativa sembra dare risultati errati. [1,3]non è allegro, vero? Immagino che tu debba ripetere length n-1invece.
Rotsor,

2

Rubino, 92 93 caratteri

La versione difficile con input su STDIN.

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

Se lo inizi con -pa(conta come 4) puoi salvare 5 caratteri:

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

Ah, bel miglioramento. Non avevo capito che esisteva un metodo each_cons.
migimaru,

Mi sono appena reso conto che ciò fallisce quando la sequenza è una singola cifra. Dovresti rimanere con f.size invece f [-1].
migimaru,

Oh, puoi anche salvare 5 caratteri se lo esegui con le opzioni -pa.
migimaru,

2

Java (difficile)

Presuppone che l'input sia fornito tramite stdin. (non tramite argomenti della riga di comando come da esempio)

Golfato - 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, modalità facile, 123 caratteri

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}

Per eseguire o testare su 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"))
   }
}

Il nome potrebbe essere j invece di saltare.
utente sconosciuto

@utente sconosciuto Sì, lo so. Mi sono reso conto circa mezz'ora dopo averlo pubblicato che a) potrei accorciare il nome del metodo eb) ho bisogno di usare un elenco invece di un set, altrimenti non funzionerà correttamente. : -S
Gareth

E le regole aggiornate prevedono che i numeri vengano divisi per spazio, 4124 potrebbero essere uno, due, tre o 4 numeri.
utente sconosciuto

@utente sconosciuto Oh fantastico. Un'altra persona che pubblica una domanda e poi cambia le regole a metà.
Gareth,

Ho rimosso il tipo di ritorno booleano, un letterale "ritorno" prima di "falso" e ho cambiato la matematica in matematica. Salvataggio da 137 a 123.
Utente sconosciuto il

2

Golfscript, modalità facile, 21 18 caratteri

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

Accetta gli argomenti come una matrice di ints nello stack, con nient'altro nello stack; lascia 1 in pila se è jolly e 0 altrimenti. Per prendere input su stdin come un elenco di ints separato da spazi, anteporre

~]

e per produrre "Jolly" / "Not jolly" (supponendo che lo stiamo trasformando in un programma) postpend

"Not jJ"5/="olly"

Mi chiedevo come avrebbe potuto funzionare: mi ci è voluto un attimo per capire che quando scrivi "un elenco di ints nello stack", intendi davvero un elenco di ints (cioè [4 1 2 4], non 4 1 2 4).
Ilmari Karonen,

@IlmariKaronen, non sono sicuro ora perché ho scritto "elenco". Ho modificato in "array" per renderlo più chiaro.
Peter Taylor,

2

J (facile), 18

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

J (difficile), 68

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


1

J, 30 26 modalità facile, 81 76 modalità difficile

modifica: gestire elenchi più brevi di 3, correggere la lettura dello stdin

La prima riga si occupa della modalità facile, la seconda aggiunge la modalità difficile.

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

J legge generalmente da destra a sinistra:

2-/\ : per ogni due numeri successivi nell'elenco, prendi la differenza

| : valore assoluto

/:~ : ordina in ordine crescente

>:@i.@#: Da 1 a n , per un elenco di n numeri

= : confronta le differenze ordinate con la sequenza (usando una "forcella" J)

*/: moltiplica tutti i booleani in termini di elementi; se tutti i confronti sono stati 1, il loro prodotto è 1, quindi è allegro


Considera l'input 1 3.
Peter Taylor,

Grazie @Peter. Risolto ... e ancora non competitivo con il tuo Golfscript. Molto bene.
DCharness,

1

Ruby, 97 102 106 (difficile)

Potrebbe anche, dal momento che tutti gli altri sono:

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"

Input preso su stdin.


Puoi sostituirlo (1..d.size).to_acon [*1..d.size]. La commutazione degli operandi è ora possibile, ne salva un altro (totale -5 caratteri).
Howard,

@Howard Oh, ecco come lo fai! Da un po 'di tempo cerco di trovare un modo di golf per convertire i range in array. Grazie!
migimaru,

1

D

facile ( 103 83 caratteri)

restituisce la somma di 1..i.lunghezza su Jolly un altro numero in caso contrario (un po 'di regole che stratificano qui)

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

difficile (142 caratteri)

l'input è delimitato da spazi bianchi e termina con 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

Facile: 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]

Difficile: 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, duro, 117 126

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

Storia:

  • 18-11-2011 17:54 ( 123 , −3) - Modificato $nullin una variabile inesistente
  • 18-11-2011 18:02 ( 117 , −6): tutte le dichiarazioni delle variabili sono state incorporate

1

Scala

Una rapida pugnalata: probabilmente ci sono miglioramenti possibili.

Facile: 77

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

Difficile: 124

val? =args.map(_.toInt)toSeq;print(if((?tail,?).zipped.map(_-_).map(math.abs).sorted==(1 to?.size-1))"Jolly"else"Not jolly")

Ok - ci siamo persi, Luigi ci ha trovato! :) Benvenuto su CodeGolf. Immediatamente inizio a imparare qualcosa. Punto interrogativo come identificativo? Whooo - chi lo ha permesso? :)
utente sconosciuto

Sì, e tutto per radere via 1 personaggio! È la differenza tra caratteri alfanumerici e caratteri operatore (vedi stackoverflow.com/q/7656937/770361 ), il che significa che a volte puoi omettere spazi (ma a volte ne servono altri) e punti. Il code golf è ottimo per l'apprendimento, un po 'come le acrobazie aeree per volare.
Luigi Plinge,

1

Q, 64 (difficile), 30 (facile)

difficile

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

facile

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

1

J (facile), 19 caratteri

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

Uso:

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

Varia in modo simile alla risposta di DCharness e l'avrei appena aggiunta come commento, ma per il fatto che non ha visitato dal 23 febbraio.

2-/\ prende la differenza tra coppie successive di numeri,

| ottiene il valore assoluto di ogni numero,

/:~ ordina in ordine crescente,

<: decrementa ogni numero di 1,

(=i.@#)un hook J che genera la sequenza di numeri da 0 alla lunghezza dell'elenco delle differenze - 1 ( i.@#) e lo confronta con quell'elenco =.

*/multipli l'elenco di 1s e 0s generata dal verbo precedente.


Non me ne sono reso conto fino a quando non ho inviato la mia risposta: abbiamo adottato lo stesso approccio, ma ho usato x-:yinvece di */x=ysalvare un personaggio.
effimero

1

Scala facile: 138 153, 170 (era erroneo, migliorato in seguito)

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
}

L'idea è che costruiamo la seconda derivazione:

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 dura 172182 , 205 (era erroneo / migliorato):

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

più o meno come sopra.


L'ingresso 4 1 2 5restituisce vero. Comunque non sono ancora riuscito a farmi girare la testa a sinistra ...
Gareth,

Oh sì, ho trovato il mio errore. È necessario correggerlo.
utente sconosciuto

readLineprende input dalla console, non dallo stdin ... (ma puoi usare argsinvece)
Luigi Plinge,

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

Perdono - come definisci la differenza tra stdin e "input dalla console"?
utente sconosciuto

1

PHP, facile, 129

Per un determinato array $sdi numeri interi:

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 versione ungolfed:

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

Gelatina , 7 6 byte (facile)

IAṢ⁼J$

Provalo 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

Accetta input come numeri separati da virgola nel primo argomento. Restituisce 1 se la sequenza è jolly e 0 se non lo è!

Soluzione a 7 byte:

LRṖḟIA$

Provalo online!

Accetta input come numeri separati da virgola nel primo argomento. Non restituisce nulla se l'elenco è una sequenza jolly jumper e qualcosa in caso contrario.

L'aggiunta di questa linea lo fa funzionare con le specifiche difficili:

Jelly , 27 22 byte (difficile, feedback di benvenuto!)

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

Provalo 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!

Soluzione a 27 byte (difficile):

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

Provalo online!

Accetta numeri separati da spazi stdin e genera "Jolly" o "Non jolly".

Spiegazione:

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

Qualsiasi feedback molto apprezzato!


1
LRlo è J. Se scrivi qualcosa del genere IAṢ⁼J$ottieni un bel risultato 1/0, e puoi usarlo per indicizzare in “Not jolly“Jolly”:ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
Lynn,

@Lynn Grazie, va molto meglio! Trucchetto intelligente con l'avvolgimento a un indice, e ho imparato anche di più sull'atomo, utile per confrontare solo parti di elenchi.
Harry,

1

Haskell , 59 57 byte

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

Modalità facile, restituisce allegria come un valore booleano. Grazie a @Laikoni per due byte.

Provalo online!



1

Python 3, 117 (difficile)

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

Provalo online!


Si è verificato un errore nel tuo programma. Provalo online
mbomb007

Questo dà la risposta sbagliata per il primo caso di test. Controlla il tuo programma per i casi di test contenuti nella domanda.
mbomb007

Provare vergogna, perché una volta risolta la versione sbagliata si è dimenticata di invertire le uscite; (
Андрей Ломакин

Benvenuti in PPCG !!
Luis felipe De jesus Munoz,

0

JavaScript: 105 (modalità facile)

golfed:

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}

Un-giocato a 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
}

0

Perl, 89 (difficile)

86 caratteri di codice + 3 per l'esecuzione con l' -popzione

@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
Ciao Giovanni e benvenuto. L'idea del codice golf è di ridurre le dimensioni il più possibile. Non sono un pitone, ma "Enter Numbers" è decisamente superfluo.
utente sconosciuto

0

R, Facile, 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 (facile), 114 (difficile)

Facile:

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

Difficile :

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 caratteri

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

Ho aggiunto il nome della lingua e il conteggio dei caratteri alla tua risposta (funziona come Python, quindi è quello che presumo sia). Il conteggio dei personaggi che ho dato è quello dato dallo script utente . Probabilmente potresti ridurre il primo livello di rientro in uno spazio per salvare alcuni personaggi qui.
Gareth,

0

C, 119 (difficile), 97 (facile)

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 soluzione semplice legge l'input dagli argomenti e restituisce uno 0 come codice di uscita se l'input è una sequenza jolly jumper:

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

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

Facile (24):

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

La funzione accetta un array e restituisce 0 o 1.

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.