Apakah itu berosilasi secara berkala?

19

Tantangan

Diberikan daftar, tentukan apakah mengelompokkan daftar ke dalam elemen yang meningkat dan menurun akan menghasilkan daftar daftar yang berukuran sama.

Dengan kata lain, "titik balik" dari daftar diberi jarak secara merata.

Contoh

Ini sebuah contoh: 0, 3, 7, 5, 2, 3, 6

0, 3, 7meningkat, 7, 5, 2menurun, dan 2, 3, 6meningkat. Karena itu, ini adalah kebenaran.

Contoh lain: 1, 4, 6, 8, 5, 3, 5, 7, 9

1, 4, 6, 8meningkat, 8, 5, 3menurun, dan 3, 5, 7, 9meningkat. Karena itu ini salah.

Aturan dan Spesifikasi

  • Tidak ada elemen yang berdekatan yang akan sama
  • Semua angka dapat diasumsikan berada dalam kisaran angka wajar bahasa Anda
  • Anda dapat mengasumsikan bahwa semua angka adalah bilangan bulat, jika ini membantu Anda memasukkan kiriman Anda
  • Ini , jadi jawaban terpendek menang
  • Input sebagai daftar dalam representasi dan output yang masuk akal sebagai nilai kebenaran / kepalsuan. Kedua nilai harus konsisten.

Uji Kasus

Input -> Output
1, 3, 5, 8, 6, 4, 2, 3, 5, 7, 6, 4, 2, 5, 7, 9, 6, 4, 2 -> True
1, 3, 5, 7, 6, 4, 5, 7, 9, 8, 6, 4, 2, 3, 5 -> False
2, 3, 6, 4, 2, 3, 7, 5, 3, 4, 6 -> True
3, 6, 4, 8, 5, 7, 3, 5, 2 -> True
8 -> True
1, 3, 5, 7 -> True
4, 5, 7, 6, 8, 9 -> False
6, 4, 2, 3, 5, 4, 2 -> True
8, 5, 3, 2, 4, 6, 5, 3, 2, 5, 7 -> False

Catatan : Anda tidak boleh berasumsi bahwa semua angka adalah digit tunggal (kecuali jika hanya itu yang bisa ditangani oleh bahasa Anda); kasus uji mencerminkan bahwa hanya karena lebih mudah bagi saya untuk mengetik kasus dengan cara ini: P Berikut adalah beberapa kasus uji dengan angka di luar kisaran itu:

1, 5, 10, 19, 15, 13, 8, 13, 18, 23, 19, 18, 14 -> True
15, 14, 17, 16, 19, 18 -> True
12, 16, 19, 15, 18, 19 -> False
HyperNeutrino
sumber
Apakah proses pertama akan selalu meningkat, atau dapatkah input dimulai dengan proses yang menurun?
Jordan
@ Jordan bisa mulai menurun. Saya akan menambahkan test case untuk itu.
HyperNeutrino
Apakah kelompok selalu lengkap? Misalnya akan 1, 2, 3, 2menjadi input yang valid, dan jika demikian dianggap benar atau salah? Dalam contoh itu, nilai selanjutnya menjadi 1 akan membuatnya benar, tetapi 3 akan membuatnya salah.
Tom Carpenter
1
@ TomCarpenter Itu dianggap salah. Semuanya harus sama panjang (dan dengan demikian semuanya lengkap).
HyperNeutrino

Jawaban:

9

MATL , 10 9 byte

dZS&Y'da~

Cobalah online!

Disimpan satu byte berkat Luis Mendo!

Penjelasan:

Asumsikan inputnya adalah [0, 3, 7, 5, 2, 3, 6]::

            % Implicit input:                                [0, 3, 7, 5, 2, 3, 6]
d           % Difference between adjacent elements:          [3, 4, -2, -3,  1,  3]
 ZS         % Sign of the differences:                       [1, 1, -1, -1, 1, 1]
   &Y'      % Length of runs of consecutive elements:        [2, 2, 2]
     d      % Difference between the lengths:                [0, 0]
      a     % Any non-zero elements:                         False
       ~    % Negate, to get a truthy value if all are zero: True
Stewie Griffin
sumber
8

Jelly , 6 byte

IṠŒgAE

Cobalah online!

Disimpan 1 byte berkat Adnan !

Bagaimana itu bekerja

IṠŒgAE - Program lengkap.

I - Penambahan (Delta).
 Ṡ - Tanda masing-masing. -1 jika negatif, 0 jika nol, 1 jika positif.
  Œg - Grup menjalankan elemen yang berdekatan.
    A - Nilai absolut. Vectorizes. Ini memetakan -1 dan 1 dengan nilai yang sama.
     E - Apakah semua sama?

Sementara bermain golf, saya menemukan beberapa keren, alternatif lagi: IṠŒgL€E, IṠŒrṪ€E(menggunakan run-length-encode sebagai gantinya).

Tuan Xcoder
sumber
Saya pikir IṠŒgḂEharus menyimpan byte
Adnan
@Adnan Can A(nilai absolut) menggantikan atau ada trik yang tidak saya ketahui ?
Tn. Xcoder
Fungsi apa pun yang menyatukan 1 dan -1 ke nomor yang sama harus mencukupi
Adnan
7

Oktaf , 54 50 byte

@(x)nnz(unique(diff(find([diff(diff(x)>0) 1]))))<2

Cobalah online!

Penjelasan

@(x)nnz(unique(diff(find([diff(diff(x)>0) 1]))))<2

@(x)                                                % Define anonymous function    
                               diff(x)              % Deltas (consecutive differences)
                                      >0            % Positive? Gives signs
                          diff(         )           % Deltas between signs
                         [                1]        % Append 1 to "close" last group
                    find(                   )       % Indices of nonzeros
               diff(                         )      % Deltas. Gives group lengths
        unique(                               )     % Remove duplicates
    nnz(                                       )    % Number of nonzeros. Gives length
                                                <2  % If 1 or 0: input is periodic
Luis Mendo
sumber
6

Bahasa Wolfram (Mathematica) , 38 byte

Equal@@(1^Differences@#~SplitBy~Sign)&

Cobalah online!

Penjelasan

Equal@@(1^Differences@#~SplitBy~Sign)&  (* Input:                {3, 6, 4, 8, 5, 7, 3, 5, 2} *)

          Differences@#                 (* Take differences:     {3, -2, 4, -3, 2, -4, 2, -3} *)
                       ~SplitBy~Sign    (* Split by sign:        {{3}, {-2}, {4}, {-3}, {2}, {-4}, {2}, {-3}} *)
        1^                              (* Raise to power of 1:  {{1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}} *)
Equal@@                                 (* Check equal:          True *)
JungHwan Min
sumber
Equal@@(1^Split@Sign@Differences@#)&2 byte lebih pendek, dan Equal@@Im@Split@Sign@Differences@#&1 byte lebih pendek dari itu.
Misha Lavrov
Dan sekarang saya berpikir tentang bilangan kompleks, menggunakan Argbukannya Signmenyimpan byte lain.
Misha Lavrov
5

05AB1E , 8 7 byte

¥0.SγaË

Cobalah online!

-1 terima kasih kepada Adnan.

Guci Gurita Ajaib
sumber
¥0.SγaËharus menyimpan byte
Adnan
Apa yang asaya tidak dapat menemukannya di dokumen. is_letter(a)???
Magic Gurita Guci
ya, itu benar
Adnan
@ Adnan ahhh ... ide aneh, ide bagus.
Magic Gurita Guci
4

C (gcc) , 143 140 138 136 135 132 byte

  • Disimpan tiga byte; menggunakan variabel runtuk menyimpan boolean fungsi kembali bukannya mengakhiri menggunakan return.
  • Disimpan dua byte; bermain golf int A[]ke int*A(menggunakan pointer bukan array).
  • Disimpan dua byte berkat Steadybox ; bermain golf f(int*A,int a)untuk f(A,a)int*A;.
  • Disimpan satu byte; bermain golf if(d!=...untuk if(d-....
  • Disimpan tiga byte; bermain golf ;j++...j+1untuk ;...++j.
j,d,e,l,m,r;f(A,a)int*A;{for(d=A[0]>A[1],r=1,j=m=l=0;j-~-a;){l++;if(d-(e=A[j]>A[++j]))d=e,j--,r*=l>=(m=!m?l:m),l=0;}r*=-~l==m||m<1;}

Cobalah online!

Menentukan fungsi fyang melihat setiap elemen dalam daftar tetapi yang terakhir dan menentukan hubungan elemen ini dengan elemen berikutnya dalam daftar. Jumlah perbandingan yang sama berturut-turut disimpan saat pertama kali hubungan terbalik, setiap berjalan setelah menjalankan awal yang berbeda panjangnya dengan panjang yang disimpan menghasilkan output palsu. Pada akhirnya, hubungan elemen kedua-terakhir dengan elemen terakhir dilihat sehingga cocok dengan sisa daftar.

Jonathan Frech
sumber
Anda bisa menggunakan f(A,a)int*A;bukan f(int*A,int a).
Steadybox
3

Python 2 , 107 105 103 97 96 94 91 byte

lambda l:len({sum(g)**2for k,g in groupby(map(cmp,l[:-1],l[1:]))})<2
from itertools import*

Cobalah online!

Python 3 , 102 100 97 byte

lambda l:len({len([*g])for k,g in groupby(x>y for x,y in zip(l,l[1:]))})<2
from itertools import*

Cobalah online!

TFeld
sumber
Anda dapat menggunakan {...}sebagai gantinya set(...)untuk menyimpan 3 byte
Rod
3

Sekam , 7 byte

EmLġ±Ẋ-

Cobalah online!

Bagaimana ini bekerja?

EMLġ ± Ẋ- ~ Program lengkap.

     Ẋ ~ Memetakan pasangan elemen yang berdekatan.
      - ~ Dengan pengurangan (ini menghitung delta)
   ġ ~ Grup menggunakan predikat kesetaraan.
    ± ~ Masuk.
 mL ~ Dapatkan panjangnya.
E ~ Apakah semua sama?

Beberapa alternatif lucu:

εġLġ±Ẋ-
εüLġ±Ẋ-
Tuan Xcoder
sumber
2

JavaScript (ES6), 81 byte

Ini sepertinya terlalu lama. Saya mungkin melewatkan sesuatu di sini ... Mengembalikan salah satu trueatau undefined.

f=(a,p=1)=>a.every((n,i)=>!i|!(1/(y=a[i+1]))|!(i%p)^y>n^a[i-1]>n)||a[p]&&f(a,p+1)

Mencari periode 0 <p <a. Panjang sedemikian rupa sehingga semua perubahan arah terjadi setiap elemen p .

Uji kasus

Arnauld
sumber
2

Python 2 , 96 byte

import re
def f(x):exec"x=map(cmp,x[1:],x[:-1]);"*2;re.match('.([^1]*)(-?1, \\1)*9',`x+[9]`)<0<_

Cobalah online! Keluaran melalui kode keluar: crash (1) falsey, clean exit (0) benar.

Python 2 , 106 byte

def f(x):d=map(cmp,x[1:],x[:-1]);l=len(d);s=(d+[0])[0];k=(d+[-s]).index(-s);print((k*[s]+k*[-s])*l)[:l]==d

Cobalah online!

Lynn
sumber
Saya tidak yakin, meskipun (...)[:l]<dmungkin kebalikan dari (...)[:l]==d.
Jonathan Frech
2

Haskell , 79 78 77 byte

import Data.List
g s|h:t<-(1<$)<$>group(zipWith(<)s$tail s)=all(==h)t
g _=1<3

Cobalah online!

Diberikan daftar s, zipWith(<)s$tail stes untuk setiap elemen apakah lebih kecil dari penggantinya, misalnya s=[2,3,6,4,2,3,7,5,3]hasil [True,True,False,False,True,True,False,False]. Kemudian groupberjalan dari elemen yang sama bersama-sama: [[True,True],[False,False],[True,True],[False,False]]. Untuk memeriksa apakah semua daftar tersebut memiliki panjang yang sama, menggantikan elemen mereka dengan 1( lihat tip ini ) menghasilkan [[1,1],[1,1],[1,1],[1,1]]dan memeriksa apakah semua elemen di ekor tdari daftar ini sama kepala h: all(==h)t.

Pendekatan ini tidak bekerja untuk daftar tunggal, tetapi karena mereka adalah selalu benar, kita dapat menangani mereka dalam kasus mereka sendiri: g[_]=1<3.

Laikoni
sumber
1

Japt , 15 byte

ä- mg ò¦ mÊä¥ e

Cobalah online!

Penjelasan

ä- mg ò¦ mÊä¥ e                                                  [0,3,7,5,2,3,6]
ä-                // Difference between neighboring elements     [-3,-4,2,3,-1,-3]
   mg             // Get the sign of each element                [-1,-1,1,1,-1,-1]
      ò¦          // Partition between different elements        [[-1,-1],[1,1],[-1,-1]]
         mÊ       // Get the length of each element              [2,2,2]
           ä¥     // Check for uniqueness                        [true,true]
              e   // Return true if all elements are truthy      true
Oliver
sumber
1

R, 36 byte

function(n)!sd(rle(sign(diff(n)))$l)

diffmenghitung perbedaan berturut-turut, lalu signmengecilkannya menjadi ± 1. rlekemudian jalankan-panjang mengkodekan mereka. Semua elemen ini rleharus sama, yaitu vektor memiliki standar deviasi nol. !kemudian menghasilkan output logis yang benar.

JDL
sumber
1

Haskell (Lambdabot), 59 byte

g(map(1<$).group.ap(zipWith(<))tail->h:t)=all(==h)t;g _=1<3

Berdasarkan jawaban @ Laikoni

BlackCap
sumber
Bagus, saya tidak tahu Lamdabot mengaktifkan ViewPatterns. Ada ruang yang hilang di g_=1<3.
Laikoni
@Laikoni Me juga, tapi aku benar-benar pergi ke #haskell dan mengujinya
BlackCap
0

Java (OpenJDK 8) , 437 302 256 188 byte

a->{int i=0,g=0,x=0,l=0;String d="";for(;i<~-a.length;d+=a[0].compare(a[i+1],a[i++])+1);for(String s:d.split("(?<=(.))(?!\\1)"))if(g++<1)x=s.length();else if(s.length()!=x)l++;return l<1;}

Cobalah online!

Roberto Graham
sumber
0

Clojure, 70 byte

#({0 1 1 1}(count(set(map count(partition-by pos?(map -(rest %)%))))))

Mengembalikan 1sebagai kebenaran dan nil(AKA nol) sebagai falsy.

NikoNyrh
sumber
0

Java (OpenJDK 8) , 135 byte

a->{Integer i=0,c,d=0,p=0,r=0;for(;++i<a.length;)d+=(i<2|(c=i.signum(a[i-1]-a[i]))<0?d<0:d>0)?c:p==0|p==-d?c-(p=d):1-(r=1);return r<1;}

Cobalah online!

Penjelasan

a->{                    // int array
 Integer i=0,c,d=0,p=0,r=0;
                        // variable definitions, use Integer to abuse static calls
 for(;++i<a.length;)    // Loop from 1 till length - 1
  d+=                   // Change d
   (i<2                 // First iteration?
     |(c=i.signum(a[i-1]-a[i]))<0?d<0:d>0
   )                    // Or do c and d have the same sign?
    ?c                  // then increase the magnitude of d.
    :p==0|p==-d         // else we're in a u-turn. Is it the first? Or is the magnitude the same as previously?
     ?c-(p=d)           // assign the new magnitude with sign to p and reset d to -1 (if was positive) or 1 (if was negative)
     :1-(r=1);          // else just do r=1 (technically: "add 1-1=0 to d" as well)
 return r<1;            // return whether there were wrong amplitudes.
}
Olivier Grégoire
sumber
0

Python 2 , 110 99 byte

-11 byte terima kasih kepada @Lynn

d=input()
exec"d=map(cmp,d[:-1],d[1:]);"*2
x=[i+1for i,e in enumerate(d)if e]
for i in x:i%x[0]>0<q

Cobalah online!

ovs
sumber
Anda dapat menyimpan beberapa byte dengan menghitung perbedaan ganda sebagaiexec"d=map(cmp,d[:-1],d[1:]);"*2
Lynn