Послідовність веселих стрибків


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 веселий". Капіталізація має значення.

Це код гольфу.

EDIT: Послідовності можуть містити від’ємні цілі числа, а вхід на stdin розділено пробілом.

$ jolly 2 -1 0 2
Jolly

$ jolly 19 22 24 25
Jolly

$ jolly 19 22 24 21
Not jolly

1
Як дається послідовність? Як струна? "4124"?
Стівен Румбальський

Я думаю, що розділення космосу було б найпоширенішою умовою, тому я скажу це.
forevermatt

6
Ви кажете, що введення знаходиться на stdin, але ваші приклади беруть дані як аргументи командного рядка. Чого слід очікувати?
Гарет

Відповіді:


3

Хаскелл

Легко 4 символи

Повертає список цілих чисел jolly тоді і лише тоді, коли в якості введення вводиться список цілих чисел jolly. Це легально на основі "Просто функції, яка приймає аргументи, однак повертає щось, що вказує на веселий чи ні".

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"

Ах, приємне поліпшення. Не зрозумів, що існує метод every_cons.
migimaru

Я щойно зрозумів, що це не вдається, коли послідовність є одноцифровою. Вам доведеться дотримуватися f.size замість f [-1].
migimaru

О, ви також можете зберегти 5 символів, якщо запустити його з параметрами -pa.
migimaru

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 невідомо Так, я знаю. Я зрозумів приблизно через півгодини після того, як я опублікував це, що: а) я можу скоротити ім'я методу; б) мені потрібно використовувати Список замість набору, інакше він не працюватиме належним чином. : -S
Гарет

Оновлені правила очікують, що номери поділяться на пробіли, 4124 може бути одним, двома, трьома або 4 числами.
користувач невідомий

@ користувач невідомий Чудово. Інша людина розміщує запитання, а потім змінює правила на півдорозі.
Гарет

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

2

Гольфскрипт, простий режим, 21 18 символів

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

Приймає аргументи як масив ints у стеку, при цьому нічого іншого немає в стеку; залишає 1 на стеку, якщо він веселий, а 0 в іншому випадку. Щоб взяти вкладку на stdin як список пробілів, розділених пробілом, передбачте

~]

і для виводу "Jolly" / "Not jolly" (припускаючи, що ми перетворюємо це на програму) відкласти

"Not jJ"5/="olly"

Мені було цікаво, як це могло б працювати - мені знадобилося хвилина, щоб зрозуміти, що, коли ви пишете "список вкладень на стеку", ви насправді маєте на увазі список 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, виправити читання stdin

Перший рядок дбає про легкий режим, другий додає жорсткий режим.

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

J читає, як правило, справа наліво:

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

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

/:~ : сортувати у порядку зростання

>:@i.@#: Від 1 до n , для списку з n чисел

= : порівняйте відсортовані відмінності з послідовністю (використовуючи J "виделку")

*/: помножити всі стильові булеви; якщо всі порівняння були 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"

Введення прийнято на stdin.


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

@Howard О, значить, так ви робите! Я вже деякий час намагаюся з'ясувати спосіб гольфу для перетворення діапазонів у масиви. Спасибі!
migimaru

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

Скала

Швидкий удар - можливо, можливі поліпшення.

Легко: 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. Відразу я починаю щось вивчати. Знак питання як ідентифікатор? Whooo - хто це дозволив? :)
користувач невідомий

Так, і все, щоб поголити 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щоб зберегти персонажа.
ефеміент

1

Скала проста: 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}

неозорений:

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повертає істинне. Досі мені не вдалося обхопити цю ліву складку ...
Гарет

О так, я виявив свою помилку. Потрібно це виправити.
користувач невідомий

readLineбере вхід з консолі, а не з stdin ... (але можна використовувати argsзамість цього)
Luigi Plinge

І j("1")кидкиUnsupportedOperationException: empty.max
Луїджі Плінг

Пробачте - як ви визначаєте різницю між stdin та "входом з консолі"?
користувач невідомий

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 і виводить "Веселий" або "Не веселий".

Пояснення:

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

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 !!
Luis felipe De jesus Munoz

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 (важко)

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

Пітон, 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))

I've added the language name and character count to your answer (it runs as Python so that's what I assume it is). The character count I've given is the one give by the userscript. You could probably cut down the first indentation level to one space to save some characters here.
Gareth

0

C, 119(hard), 97(easy)

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

The easy solution reads the input from the arguments and returns a 0 as exit code if the input is a jolly jumper sequence:

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

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

Easy (24):

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

The function takes an array and returns 0 or 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.