Jolly Jumper Sequence


15

Urutan bilangan bulat n> 0 disebut jolly jumper jika nilai absolut dari perbedaan antara elemen berturut-turut mengambil semua nilai 1 hingga n-1.

Jadi urutan [4,1,2,4] memiliki perbedaan absolut [3,1,2] yang setara dengan himpunan [1,2,3] (1 hingga n-1 di mana n adalah panjang urutan asli) jadi karena itu pelompat riang.

Urutan memiliki panjang n> 0.

Asumsikan n = 1 adalah pelompat riang.

Mode mudah: Jangan khawatir tentang stdin / stdout. Namun, hanya fungsi yang menerima argumen dan mengembalikan sesuatu yang menunjukkan riang atau tidak

Hard mode: Input pada stdin (dipisahkan ruang), dan outputnya "Jolly" / "Not jolly". Huruf besar penting.

Ini golf kode.

EDIT: Urutan dapat berisi bilangan bulat negatif dan input pada stdin dipisahkan oleh ruang.

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly

1
Bagaimana urutannya diberikan? Sebagai string? "4124"?
Steven Rumbalski

Saya pikir dipisahkan oleh ruang akan menjadi konvensi yang paling umum, jadi saya akan mengatakan itu.
eternalmatt

6
Anda mengatakan input ada di stdin, tetapi contoh Anda mengambil input sebagai argumen baris perintah. Yang mana yang harus kita harapkan?
Gareth

Jawaban:


3

Haskell

Mudah 4 karakter

Mengembalikan daftar integer riang jika dan hanya jika daftar integer riang diberikan sebagai input. Ini legal berdasarkan pada "Hanya fungsi yang menerima argumen namun mengembalikan sesuatu yang menunjukkan riang atau tidak".

j=id

Solusi mudah alternatif dengan 61 karakter:

Mengambil daftar dan mengembalikan daftar kosong jika urutannya riang.

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

1
+1 Pengacara aturan yang baik. Meskipun saya harus menunjukkan bahwa dalam GolfScript program kosong sudah cukup ...
Peter Taylor

Solusi alternatif tampaknya memberikan hasil yang salah. [1,3]bukan riang, kan? Saya kira Anda harus mengulanginya length n-1sebagai gantinya.
Rotsor

2

Ruby, 92 93 karakter

Versi sulit dengan input pada STDIN.

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

Jika Anda memulainya dengan -pa(dihitung sebagai 4), Anda dapat menyimpan 5 karakter:

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

Ah, peningkatan yang bagus. Tidak menyadari ada metode Each_cons.
migimaru

Saya baru menyadari bahwa ini gagal ketika urutannya adalah satu digit. Anda harus tetap menggunakan f.size sebagai gantinya f [-1].
migimaru

Oh, Anda juga dapat menyimpan 5 karakter jika Anda menjalankannya dengan opsi -pa.
migimaru

2

Jawa (Keras)

Asumsikan bahwa input diberikan melalui stdin. (tidak melalui argumen baris perintah seperti contoh)

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

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

2

Scala, mode mudah, 123 karakter

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}

Untuk menjalankan atau menguji di 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"))
   }
}

Nama bisa j bukan melompat.
pengguna tidak diketahui

@ pengguna tidak diketahui Ya, saya tahu. Saya menyadari sekitar setengah jam setelah saya mempostingnya bahwa a) saya dapat mempersingkat nama metode, dan b) saya perlu menggunakan Daftar daripada Set, atau itu tidak akan berfungsi dengan baik. : -S
Gareth

Dan aturan yang diperbarui mengharapkan angka untuk dibagi dengan ruang, 4124 bisa menjadi satu, dua, tiga atau 4 angka.
pengguna tidak diketahui

@ pengguna tidak diketahui Oh, bagus. Orang lain memposting pertanyaan dan kemudian mengubah aturan setengah jalan.
Gareth

Saya menghapus kembali tipe Boolean, 'kembali' literal sebelum `salah 'dan mengubah Matematika menjadi matematika. Menyimpan dari 137 hingga 123.
pengguna tidak dikenal

2

Skrip golf, mode mudah, 21 18 karakter

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

Menerima argumen sebagai array int pada stack, dengan tidak ada yang lain pada stack; meninggalkan 1 pada tumpukan jika itu riang dan 0 sebaliknya. Untuk mengambil input pada stdin sebagai daftar int yang dipisahkan ruang, tambahkan dulu

~]

dan untuk menampilkan "Jolly" / "Tidak riang" (dengan asumsi bahwa kita mengubah ini menjadi sebuah program) postpend

"Not jJ"5/="olly"

Saya bertanya-tanya bagaimana ini bisa bekerja - butuh beberapa saat untuk menyadari bahwa ketika Anda menulis "daftar int di stack", Anda benar-benar berarti daftar int (yaitu [4 1 2 4], tidak 4 1 2 4).
Ilmari Karonen

@IlmariKaronen, tidak yakin sekarang mengapa saya menulis "daftar". Saya telah mengedit ke "array" untuk membuatnya lebih jelas.
Peter Taylor

2

J (mudah), 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 (keras), 68

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


1

J, 30 26 mode mudah, mode 81 76 hard

sunting: menangani daftar yang lebih pendek dari 3, perbaiki stdin membaca

Baris pertama menangani mode mudah, kedua menambahkan mode keras.

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

J umumnya berbunyi kanan-ke-kiri:

2-/\ : untuk setiap dua nomor berurutan dalam daftar, ambil perbedaannya

| : nilai mutlak

/:~ : urutkan dalam urutan menaik

>:@i.@#: 1 hingga n , untuk daftar n angka

= : bandingkan perbedaan yang diurutkan dengan urutan (menggunakan J "garpu")

*/: kalikan semua boolean elemen-bijaksana; jika semua perbandingan adalah 1, produk mereka adalah 1, jadi itu periang


Pertimbangkan input 1 3.
Peter Taylor

Terima kasih, @Peter. Diperbaiki ... dan masih belum kompetitif dengan Golfscript Anda. Sudah selesai dilakukan dengan baik.
DCharness

1

Ruby, 97 102 106 (sulit)

Mungkin juga, karena semua orang adalah:

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"

Masukan diambil pada stdin.


Anda bisa menggantinya (1..d.size).to_adengan [*1..d.size]. Switching operan sekarang mungkin, simpan yang lain (total -5 karakter).
Howard

@ Bagaimana Oh, jadi begitulah cara Anda melakukannya! Saya sudah mencoba mencari cara golf untuk mengubah rentang menjadi array untuk sementara waktu sekarang. Terima kasih!
migimaru

1

D

mudah ( 103 83 karakter)

mengembalikan jumlah 1..i.panjang pada Jolly beberapa nomor lain jika tidak (sedikit aturan laywering di sini)

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

hard (142 chars)

input dibatasi oleh spasi dan berakhir pada 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

Asyik

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

Keras: 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, keras, 117 126

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

Sejarah:

  • 2011-11-18 17:54 ( 123 , −3) - Berubah $nullmenjadi variabel yang tidak ada
  • 2011-11-18 18:02 ( 117 , −6) - inline semua deklarasi variabel

1

Scala

Tusukan cepat - mungkin ada perbaikan yang mungkin dilakukan.

Mudah: 77

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

Keras: 124

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

Oke - kita tersesat, Luigi menemukan kita! :) Selamat datang di CodeGolf. Segera saya mulai belajar sesuatu. Tanda tanya sebagai pengidentifikasi? Whooo - siapa yang mengizinkan itu? :)
pengguna tidak dikenal

Ya, dan semuanya untuk mencukur 1 karakter! Ini adalah perbedaan antara karakter alfanumerik dan karakter operator (lihat stackoverflow.com/q/7656937/770361 ) yang berarti Anda terkadang dapat menghilangkan spasi (tetapi terkadang membutuhkan yang ekstra) dan titik. Code golf sangat bagus untuk belajar - agak seperti aerobatik untuk terbang.
Luigi Plinge

1

Q, 64 (sulit), 30 (mudah)

keras

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

mudah

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

1

J (mudah), 19 karakter

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

Pemakaian:

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

Berbeda dengan jawaban DCharness , dan saya hanya akan menambahkannya sebagai komentar tetapi karena dia belum pernah berkunjung sejak tanggal 23 Februari.

2-/\ mengambil perbedaan antara pasangan angka yang berurutan,

| mendapatkan nilai absolut dari setiap angka,

/:~ mengurutkan dalam urutan menaik,

<: mengurangi setiap angka dengan 1,

(=i.@#)sebuah kait J yang menghasilkan urutan angka 0 dengan panjang daftar perbedaan - 1 ( i.@#) dan membandingkannya dengan daftar yang =.

*/mengalikan daftar 1s dan 0s yang dihasilkan oleh kata kerja sebelumnya.


Tidak menyadari sampai setelah saya mengirimkan jawaban saya: kami mengambil pendekatan yang sama, tetapi saya menggunakan x-:ybukannya */x=ymenyimpan karakter.
ephemient

1

Scala mudah: 138 153, 170 (keliru, diperbaiki nanti)

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
}

Idenya adalah, kita membangun derivasi kedua:

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 (salah / ditingkatkan):

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

kurang lebih sama dengan di atas.


Input 4 1 2 5mengembalikan true. Masih belum berhasil mendapatkan kepalaku di sekitar lipatan kiri ...
Gareth

Oh ya, saya menemukan kesalahan saya. Perlu memperbaikinya.
pengguna tidak diketahui

readLinemengambil input dari konsol, bukan stdin ... (tetapi Anda dapat menggunakannya argssebagai gantinya)
Luigi Plinge

Dan j("1")melemparUnsupportedOperationException: empty.max
Luigi Plinge

Maaf - bagaimana Anda mendefinisikan perbedaan antara stdin dan "input dari konsol"?
pengguna tidak diketahui

1

PHP, mudah, 129

Untuk array $sbilangan bulat yang diberikan :

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

Versi 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

Jelly , 7 6 byte (mudah)

IAṢ⁼J$

Cobalah 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

Mengambil input sebagai angka yang dipisahkan koma dalam argumen pertama. Mengembalikan 1 jika urutannya riang, dan 0 jika tidak!

Solusi 7-byte:

LRṖḟIA$

Cobalah online!

Mengambil input sebagai angka yang dipisahkan koma dalam argumen pertama. Tidak menghasilkan apa-apa jika daftar adalah urutan jolly jumper, dan sesuatu jika tidak.

Menambahkan baris ini membuatnya bekerja dengan spesifikasi keras:

Jelly , 27 22 byte (sulit, umpan balik selamat datang!)

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

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

Solusi 27-byte (keras):

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

Cobalah online!

Menghidupkan nomor yang dipisahkan ruang stdin, dan menampilkan "Jolly" atau "Not jolly".

Penjelasan:

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

Umpan balik sangat dihargai!


1
LRadalah J. Jika Anda menulis sesuatu seperti IAṢ⁼J$Anda mendapatkan hasil 1/0 yang bagus, dan Anda dapat menggunakannya untuk mengindeks ke “Not jolly“Jolly”:ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
Lynn

@ Lynn Terima kasih, itu jauh lebih baik! Trik cerdas dengan membungkus satu-indeks, dan saya belajar lebih banyak tentang atom, berguna untuk membandingkan hanya bagian dari daftar.
Harry

1

Haskell , 59 57 byte

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

Mode mudah, mengembalikan keceriaan sebagai boolean. Terima kasih kepada @Laikoni untuk dua byte.

Cobalah online!



1

Python 3, 117 (sulit)

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

Cobalah online!


Ada kesalahan dalam program Anda. Cobalah online
mbomb007

Ini memberikan jawaban yang salah untuk test case pertama. Silakan periksa program Anda untuk test case yang terkandung dalam pertanyaan.
mbomb007

Merasa malu, karena ketika versi yang salah diperbaiki lupa untuk membalikkan output; (
Андрей Ломакин

Selamat datang di PPCG !!
Luis felipe De jesus Munoz

0

JavaScript: 105 (mode mudah)

Golf:

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}

Tidak 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 (sulit)

Kode 86 karakter + 3 untuk berjalan dengan -popsi

@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
Halo John dan selamat datang. Gagasan golf kode adalah, untuk mengurangi ukuran sejauh yang Anda bisa. Saya bukan orang pyhtonian, tapi "Masukkan Angka" jelas sangat berlebihan.
pengguna tidak diketahui

0

R, Mudah, 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)}

Pemakaian:

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 (mudah), 114 (sulit)

Mudah:

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

Sulit :

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 karakter

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

Saya telah menambahkan nama bahasa dan jumlah karakter ke jawaban Anda (ini berjalan sebagai Python sehingga saya menganggapnya). Hitungan karakter yang saya berikan adalah yang diberikan oleh naskah pengguna . Anda mungkin dapat mengurangi level indentasi pertama ke satu ruang untuk menyimpan beberapa karakter di sini.
Gareth

0

C, 119 (sulit), 97 (mudah)

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

Solusi mudah membaca input dari argumen dan mengembalikan 0 sebagai kode keluar jika inputnya adalah urutan 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, sulit)

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

Mudah (24):

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

Fungsi ini mengambil array dan mengembalikan 0 atau 1.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.