Jolly Jumper Sequence


15

Последовательность из n> 0 целых чисел называется веселой перемычкой, если абсолютные значения разности между последовательными элементами принимают все значения от 1 до n-1.

Таким образом, последовательность [4,1,2,4] имеет абсолютные различия [3,1,2], что эквивалентно набору [1,2,3] (от 1 до n-1, где n - длина исходной последовательности) так что это веселый джемпер.

Последовательности имеют длину n> 0.

Предположим, что n = 1 - веселая перемычка.

Простой режим: не беспокойтесь о stdin / stdout. Просто функция, которая принимает аргументы и возвращает что-то, что указывает на веселье или нет

Жесткий режим: ввод в stdin (через пробел) и вывод «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"?
Стивен Румбальски

Я думаю, что разделение пробелами будет самым распространенным соглашением, поэтому я скажу это.
Eternalmatt

6
Вы говорите, что ввод в stdin, но ваши примеры принимают ввод в качестве аргументов командной строки. Чего нам ожидать?
Гарет

Ответы:


3

Haskell

Легко 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вместо.
Rotsor

2

Ruby, 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.
Мигимару

Я просто понял, что это терпит неудачу, когда последовательность представляет собой одну цифру. Вы должны придерживаться f.size вместо f [-1].
Мигимару

О, вы также можете сохранить 5 символов, если вы запускаете его с опциями -pa.
Мигимару

2

Java (Hard)

Предполагается, что ввод осуществляется через стандартный ввод. (не через аргументы командной строки, как в примере)

Гольф - 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, легкий режим, 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 вместо прыжка.
пользователь неизвестен

@ пользователь неизвестен Да, я знаю. Примерно через полчаса после публикации я понял, что а) я могу сократить имя метода и б) мне нужно использовать список вместо набора, иначе он не будет работать должным образом. : -S
Гарет

И обновленные правила предполагают, что числа будут разделены пробелами, 4124 может быть одним, двумя, тремя или 4 числами.
пользователь неизвестен

@ пользователь неизвестен Другой человек задает вопрос, а затем меняет правила на полпути.
Гарет

Я удалил тип возвращаемого значения Boolean, буквальный «return» перед «false» и изменил Math на math. Экономия от 137 до 123.
пользователь неизвестен

2

Golfscript, легкий режим, 21 18 символов

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

Принимает аргументы как массив целых чисел в стеке, а в стеке ничего больше; оставляет 1 в стеке, если это весело, и 0 в противном случае. Чтобы взять ввод в stdin как список целых, разделенных пробелами, добавьте

~]

и вывести «Jolly» / «Not Jolly» (при условии, что мы превращаем это в программу) postpend

"Not jJ"5/="olly"

Мне было интересно, как это могло бы сработать - мне потребовалось время, чтобы понять, что когда вы пишете «список целых чисел в стеке», вы действительно подразумеваете список целых чисел (то есть [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, исправить чтение стандартного ввода

Первая строка отвечает за простой режим, вторая добавляет жесткий режим.

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

J обычно читает справа налево:

2-/\ : для каждых двух последовательных чисел в списке возьмите разницу

| : абсолютная величина

/:~ : сортировка по возрастанию

>:@i.@#: От 1 до n , для списка из n чисел

= : сравнить отсортированные различия с последовательностью (используя J "fork")

*/: умножить все элементарные логические значения; если все сравнения были 1, их продукт равен 1, так что это весело


Рассмотрим ввод 1 3.
Питер Тейлор

Спасибо, @Peter. Исправлено ... и все еще не конкурирует с вашим Golfscript. Отлично сработано.
DCharness

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"

Ввод принят на стандартный ввод.


Вы можете заменить (1..d.size).to_aна [*1..d.size]. Переключение операндов теперь возможно, сохраняется еще один (всего -5 символов).
Говард

@ Говард Ох, вот как ты это делаешь! Я уже некоторое время пытаюсь найти способ конвертировать диапазоны в массивы в гольфе. Благодарность!
Мигимару

1

D

легкий ( 103 83 символа)

возвращает сумму 1..i.length на Jolly, если это не так, если это не так (здесь немного правил)

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

Groovy

Легко: 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

Scala

Быстрый удар - возможно, возможны улучшения.

Легко: 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 в , и я бы только добавил его в качестве комментария , но тот факт , что он не посетил с 23 февраля.

2-/\ принимает разницу между последовательными парами чисел,

| получает абсолютное значение каждого числа,

/:~ сортирует по возрастанию,

<: уменьшает каждое число на 1,

(=i.@#)J крюк , который генерирует последовательность чисел от 0 до длины списка разностей - 1 ( i.@#) и сравнивает его с этим списком =.

*/умножает список 1s и 0s, сгенерированных предыдущим глаголом.


Не понял, пока я не представил свой ответ: мы использовали тот же подход, но я использовал x-:yвместо того, */x=yчтобы сохранить персонажа.
ephemient

1

Scala easy: 138, 153, 170 (был ошибочным, улучшился позже)

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
}

Идея заключается в том, что мы строим второй вывод:

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 (был ошибочным / улучшен):

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. Тем не менее, мне так и не удалось обойти эту левую складку ...
Гарет

О да, я нашел свою ошибку. Нужно исправить это.
пользователь неизвестен

readLineпринимает данные с консоли, а не с STDIN ... (но вы можете использовать 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$

Попробуйте онлайн!

Принимает ввод в виде разделенных запятыми чисел в первом аргументе. Ничего не возвращает, если список представляет собой последовательность веселых перемычек, и что-то если это не так.

Добавление этой строки позволяет работать со сложными спецификациями:

Желе , 27 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ṀȥƘạ»
Линн

@ Линн Спасибо, это намного лучше! Умный трюк с одноиндексным переносом, и я также узнал больше об атоме, который удобен для сравнения только частей списков.
Гарри



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

Стыдно, причина, когда исправлена ​​неправильная версия, забыл поменять выходы; (
Андрей Ломакин

Добро пожаловать в PPCG!
Луис Фелипе Де Иисус Муньос

0

JavaScript: 105 (простой режим)

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-golfed:

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 (хард)

86 символов кода + 3 для запуска с -pопцией

@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, Easy, 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

Hard :

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, так что я так и думаю). Количество символов, которое я дал, - это число, которое дает пользовательский скрипт . Вы могли бы сократить первый уровень отступа до одного пробела, чтобы сохранить здесь несколько символов.
Гарет

0

С, 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.