ジョリージャンパーシーケンス


15

連続する要素間の差の絶対値が1〜n-1のすべての値をとる場合、n> 0整数のシーケンスはジョリージャンパーと呼ばれます。

したがって、シーケンス[4,1,2,4]には絶対差[3,1,2]があり、これはセット[1,2,3](1からn-1(nは元のシーケンスの長さ)に相当)したがって、それは陽気なジャンパーです。

シーケンスの長さはn> 0です。

n = 1がジョリージャンパーであると仮定します。

イージーモード: stdin / stdoutについて心配する必要はありません。ただし、引数を受け入れ、陽気なかどうを示すものを返す関数

ハードモード:標準入力(スペース区切り)での入力。出力は「Jolly」/「Not jolly」です。大文字は重要です。

これはコードゴルフです。

編集:シーケンスには負の整数を含めることができ、stdinへの入力はスペースで区切られます。

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly

1
シーケンスはどのように与えられますか?文字列として?「4124」?
スティーブンランバルスキー

スペースで区切るのが最も一般的な慣習だと思うので、それを言います。
エターナルマット

6
入力は標準入力にあると言いますが、例ではコマンドライン引数として入力を取ります。どちらを期待すべきですか?
ガレス

回答:


3

ハスケル

簡単な4文字

陽気な整数のリストが入力として与えられた場合にのみ、陽気な整数のリストを返します。これは、「引数を受け入れて、陽気なかどうかを示すものを返すだけの関数」に基づいて正当です。

j=id

61文字の代替の簡単なソリューション:

シーケンスが陽気な場合、リストを取り込んで空のリストを返します。

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

1
+1良いルールの弁護士。私は... GolfScriptに空のプログラムが十分であることを指摘すべきであるが
ピーター・テイラー

代替ソリューションは間違った結果を与えるようです。[1,3]ジョリーではないですか?length n-1代わりに反復する必要があると思います。
ローター

2

ルビー、92 93文字

STDINに入力があるハードバージョン。

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

-pa(4としてカウント)で開始する場合、5文字を保存できます。

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

ああ、すてきな改善。each_consメソッドがあることに気づきませんでした。
みぎまる

シーケンスが1桁の場合、これが失敗することに気付きました。f [-1]の代わりにf.sizeを使用する必要があります。
みぎまる

ああ、optionsで実行すると5文字も保存できます-pa
みぎまる

2

Java(ハード)

入力はstdinを介して与えられると仮定します。(例のようにコマンドライン引数を使用しない)

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

非ゴルフ

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、イージーモード、123文字

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}

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

名前は、ジャンプの代わりにjにすることができます。
ユーザー不明

@user unknownはい、わかりました。投稿してから約30分後、a)メソッド名を短くできること、b)Setの代わりにListを使用する必要があります。そうしないと、正しく機能しません。:-S-
ガレス

そして、更新されたルールは、数字がスペースで分割されることを想定しています。4124は1、2、3、または4の数字です。
ユーザー不明

@ユーザー不明ああ素晴らしい。別の人が質問を投稿し、途中でルールを変更します。
ガレス

「false」の前のリテラル「return」である戻り値の型ブールを削除し、Mathをmathに変更しました。137〜123からの保存
ユーザー不明

2

Golfscript、イージーモード、21 18文字

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

引数をスタック上のintの配列として受け入れますが、スタックには何もありません。陽気な場合はスタックに1を残し、それ以外の場合は0を残します。スペースで区切られたintのリストとしてstdinの入力を取得するには、先頭に追加します

~]

そして、「Jolly」/「Not jolly」を出力する(これをプログラムに変換することを想定しています)

"Not jJ"5/="olly"

私はこれがどのように機能するのだろうと思っていました-「スタック上のintのリスト」を書くとき、あなたは本当にintのリストを意味する(つまり[4 1 2 4]ではない4 1 2 4)ことに気付くのに少し時間がかかりました。
イルマリカロネン

@IlmariKaronen、なぜ「リスト」を書いたのかはわかりません。私はそれをより明確にするために「配列」に編集しました。
ピーターテイラー

2

J(簡単)、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(ハード)、68

2!:55]1!:2&2'olly',~>('Not j';'J'){~(i.@#-:<:/:])|2-/\".@>2}.ARGV_j_
$ jconsole jumper.ijs 2 -1 0 2
ジョリー
$ jconsole jumper.ijs 19 22 24 25
ジョリー
$ jconsole jumper.ijs 2 19 22 24 21
冗談じゃない


1

J、30 26イージーモード、81 76ハードモード

編集: 3より短いリストを処理し、標準入力を修正

最初の行はイージーモードを処理し、2行目はハードモードを追加します。

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

Jは一般に右から左に読み取ります。

2-/\ :リスト内の連続する2つの番号ごとに、差を取る

| : 絶対値

/:~ :昇順で並べ替え

>:@i.@#1〜nn個の数字のリスト

= :ソートされた違いをシーケンスと比較します(J「フォーク」を使用)

*/:すべての要素ごとのブール値を乗算します。すべての比較が1だった場合、それらの積は1なので、それは愉快です


入力を検討してください1 3
ピーターテイラー

ありがとう、@ピーター。修正されましたが、まだGolfscriptと競合していません。よくやった。
-Dチャーネス

1

ルビー、97 102 106(ハード)

同様に、他のみんなもそうだろうから:

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"

stdinでの入力。


あなたは置き換えることができます(1..d.size).to_aによって[*1..d.size]。オペランドの切り替えが可能になり、別のオペランドが節約されます(合計-5文字)。
ハワード

@Howardああ、それがあなたのやり方です!しばらくの間、レンジを配列に変換するゴルフの方法を見つけようとしてきました。ありがとう!
みぎ丸

1

D

簡単(103 83文字)

そうでない場合、Jollyで1..i.lengthの合計を返します(ここにいくつかの規則があります)

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

ハード(142文字)

入力は空白で区切られ、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

グルーヴィー

簡単: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]

ハード: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、ハード、117 126

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

歴史:

  • 2011-11-18 17:54(123、−3)– $null存在しない変数に変更されました
  • 2011-11-18 18:02(117、−6)–すべての変数宣言をインライン化

1

スカラ

素早く刺す-おそらく改善が可能です。

簡単:77

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

ハード:124

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

わかりました-負けました、ルイージは私たちを見つけました!:) CodeGolfへようこそ。すぐに何かを学び始めます。識別子としての疑問符?誰だ-誰がそれを許可したの?:)
ユーザー不明

はい、すべて1文字オフにします!これは、英数字と演算子文字stackoverflow.com/q/7656937/770361を参照)の違いです。つまり、スペース(場合によっては余分なスペース)とドットを省略できることがあります。コードゴルフは学習に最適ですが、飛行の曲技飛行のようなものです。
ルイージプリンジ

1

Q、64(ハード)、30(簡単)

ハード

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

かんたん

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

1

J(簡単)、19文字

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

使用法:

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

DCharnessの回答と同様に変化しますが、コメントとして追加したのですが、彼が2月23日以降に訪問していないという事実のためです。

2-/\ 連続する数字のペアの差を取ります。

| 各数値の絶対値を取得し、

/:~ 昇順で並べ替え、

<: 各数値を1ずつ減らす

(=i.@#)0から差分リスト-1()の長さまでの数字のシーケンスを生成し、それをそのリストと比較するJフックi.@#=

*/前の動詞によって生成された1sと0sのリストを倍にします。


私が答えを提出するまで気づかなかった:私たちは同じアプローチをとったが、x-:y代わりに*/x=yキャラクターを救うために使った。
一時的な

1

スカラ容易:138 153、170(errornousた後に改善)

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}

なし:

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
}

考え方は、2番目の派生を構築することです。

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

スカラハード172 182、205(errornous /改善されました)。

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

上記とほぼ同じです。


入力4 1 2 5はtrueを返します。それでも、左の折り目で頭を動かすことができませんでし
Gareth

そうそう、エラーが見つかりました。修正する必要があります。
ユーザー不明

readLine標準入力ではなく、コンソールから入力をargs
取得し

そしてj("1")スローUnsupportedOperationException: empty.max
ルイージプリンジ

恩赦-標準入力と「コンソールからの入力」の違いをどのように定義しますか?
ユーザー不明

1

PHP、簡単、129

指定された$s整数の配列の場合:

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

改変されていないバージョン:

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

ゼリー7 6バイト(簡単)

IAṢ⁼J$

オンラインでお試しください!

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

最初の引数で入力をコンマ区切りの数値として受け取ります。シーケンスが陽気な場合は1を返し、そうでない場合は0を返します!

7バイトソリューション:

LRṖḟIA$

オンラインでお試しください!

最初の引数で入力をコンマ区切りの数値として受け取ります。リストがジョリージャンパーシーケンスの場合は何も返さず、そうでない場合は何かを返します。

この行を追加すると、ハード仕様で動作します:

Jelly27 22バイト(ハード、フィードバック歓迎!)

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

オンラインでお試しください!

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

27バイト(ハード)ソリューション:

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

オンラインでお試しください!

スペースで区切られた数字を取得します stdinを受け取り、「Jolly」または「Not jolly」を出力します。

説明:

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

フィードバックは大歓迎です!


1
LRですJ。あなたのような何かを書く場合はIAṢ⁼J$、あなたが素敵1/0結果を取得し、あなたはへのインデックスにそれを使用することができます“Not jolly“Jolly”ɠḲVIAṢ⁼J$ị“¢⁼D“¡KṀȥƘạ»
リン・

@Lynnありがとう、それはずっと良い!インデックスが1つだけあるラップの巧妙なトリック。アトムについても詳しく学びました。リストの一部だけを比較するのに便利です。
ハリー



1

Python 3、117(ハード)

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

オンラインでお試しください!


プログラムにエラーがあります。オンラインで試してください
mbomb007

これにより、最初のテストケースの答えが間違っています。質問に含まれるテストケースについては、プログラムを確認してください。
mbomb007

恥ずかしい
思いをし


0

JavaScript:105(イージーモード)

ゴルフ:

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}

ゴルフをしていない:

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(ハード)

-pオプションで実行するためのコード86文字+ 3

@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
こんにちはジョン、ようこそ。コードゴルフのアイデアは、できるだけサイズを小さくすることです。私はピトーニアンではありませんが、「数字を入力」は間違いなくスーパーフロースです。
ユーザー不明

0

R、イージー、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)}

使用法:

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(簡単)、114(ハード)

簡単:

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

ハード

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文字

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

私はあなたの答えに言語名と文字数を追加しました(Pythonとして実行されるので、それがそうだと思います)。私が与えた文字数userscriptによって与えられたものです。ここでいくつかの文字を保存するために、おそらく最初のインデントレベルを1つのスペースに減らすことができます。
ガレス

0

C、119(ハード)、97(簡単)

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

簡単な解決策は、引数から入力を読み取り、入力がジョリージャンパーシーケンスの場合、終了コードとして0を返します。

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、ハード)

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

簡単(24):

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

この関数は配列を受け取り、0または1を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.