มันสั่นไหวเป็นระยะหรือไม่?


19

ท้าทาย

กำหนดรายการให้ตรวจสอบว่าการจัดกลุ่มรายการในการเพิ่มและลดองค์ประกอบจะส่งผลให้รายการของรายการขนาดเท่ากันหรือไม่

กล่าวอีกนัยหนึ่ง "จุดเปลี่ยน" ของรายการนั้นเว้นระยะเท่ากัน

ตัวอย่าง

นี่คือตัวอย่าง: 0, 3, 7, 5, 2, 3, 6

0, 3, 7เพิ่มขึ้น7, 5, 2ลดลงและ2, 3, 6เพิ่มขึ้น ดังนั้นนี่คือความจริง

ตัวอย่างอื่น: 1, 4, 6, 8, 5, 3, 5, 7, 9

1, 4, 6, 8เพิ่มขึ้น8, 5, 3ลดลงและ3, 5, 7, 9เพิ่มขึ้น ดังนั้นนี่เป็นเท็จ

กฎและข้อมูลจำเพาะ

  • องค์ประกอบที่อยู่ติดกันจะไม่เท่ากัน
  • ตัวเลขทั้งหมดสามารถสันนิษฐานได้ว่าอยู่ในช่วงหมายเลขที่เหมาะสมของภาษาของคุณ
  • คุณอาจคิดว่าตัวเลขทั้งหมดเป็นจำนวนเต็มถ้ามันช่วยให้คุณส่งข้อมูลได้
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ
  • ป้อนข้อมูลเป็นรายการในการแสดงและเอาท์พุทที่สมเหตุสมผลเช่นค่าความจริง / เท็จ ค่าทั้งสองจะต้องสอดคล้องกัน

กรณีทดสอบ

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

หมายเหตุ : คุณอาจไม่คิดว่าตัวเลขทั้งหมดเป็นตัวเลขหลักเดียว (ยกเว้นว่าเป็นทุกภาษาของคุณสามารถจัดการได้); กรณีทดสอบสะท้อนให้เห็นว่าเพียงเพราะมันง่ายกว่าสำหรับฉันที่จะพิมพ์เคสด้วยวิธีนี้: P ต่อไปนี้เป็นกรณีทดสอบบางอย่างที่มีตัวเลขอยู่นอกช่วงนั้น:

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

การรันครั้งแรกจะเพิ่มขึ้นตลอดเวลาหรืออินพุตเริ่มต้นด้วยการรันที่ลดลงได้หรือไม่?
Jordan

@Jordan อาจเริ่มลดลง ฉันจะเพิ่มกรณีทดสอบสำหรับสิ่งนั้น
HyperNeutrino

กลุ่มเสร็จสมบูรณ์หรือไม่? ตัวอย่างเช่นจะ1, 2, 3, 2ป้อนข้อมูลที่ถูกต้องและหากถือว่าเป็นจริงหรือเท็จ? ในตัวอย่างนั้นค่าถัดไปที่เป็น 1 จะทำให้เป็นจริง แต่ 3 จะทำให้เป็นเท็จ
Tom Carpenter

1
@TomCarpenter นั่นถือว่าเป็นเท็จ พวกมันจะต้องมีความยาวเท่ากันทั้งหมด
HyperNeutrino

คำตอบ:


9

MATL , 10 9 ไบต์

dZS&Y'da~

ลองออนไลน์!

บันทึกหนึ่งไบต์ขอบคุณ Luis Mendo!

คำอธิบาย:

สมมติว่าอินพุตคือ[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

8

เยลลี่ 6 ไบต์

IṠŒgAE

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณAdnan !

มันทำงานอย่างไร

IṠŒgAE - โปรแกรมเต็มรูปแบบ

I - ส่วนเพิ่ม (Deltas)
 Ṡ - เข้าสู่ระบบของแต่ละคน -1 ถ้าเป็นลบ, 0 ถ้าว่าง, 1 ถ้าเป็นบวก
  Œg - กลุ่มทำงานขององค์ประกอบที่อยู่ติดกัน
    เอ - ค่าสัมบูรณ์ เวกเตอร์ สิ่งนี้แม็พ -1 และ 1 กับค่าเดียวกัน
     E - เท่ากันทั้งหมดหรือไม่

ขณะเล่นกอล์ฟฉันค้นพบทางเลือกที่เจ๋งกว่าและยาวกว่านี้: IṠŒgL€E, IṠŒrṪ€E(ใช้การเข้ารหัสแบบรันไทม์แทน)


ฉันคิดว่าIṠŒgḂEควรบันทึกไบต์
Adnan

@Adnan สามารถทดแทนA(ค่าสัมบูรณ์) หรือมีเคล็ดลับที่ฉันไม่ได้รับเกี่ยวกับ?
Mr. Xcoder

ฟังก์ชั่นใด ๆ ที่รวม1และ-1เข้ากับหมายเลขเดียวกันควรเพียงพอ
Adnan

7

อ็อกเท54 54ไบต์

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

ลองออนไลน์!

คำอธิบาย

@(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

6

ภาษา Wolfram (Mathematica) , 38 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

Equal@@(1^Split@Sign@Differences@#)&สั้นกว่า 2 ไบต์และสั้นกว่าEqual@@Im@Split@Sign@Differences@#&นั้นอีก 1 ไบต์
Misha Lavrov

และตอนนี้ฉันกำลังคิดถึงจำนวนเชิงซ้อน, ใช้ArgแทนการSignบันทึกไบต์อื่น
Misha Lavrov

5

05AB1E , 8 7 ไบต์

¥0.SγaË

ลองออนไลน์!

-1 ขอบคุณ Adnan


¥0.SγaËควรบันทึกไบต์
Adnan

อะไรคือสิ่งที่aฉันไม่สามารถหาได้ในเอกสาร is_letter(a)???
Magic Octopus Urn

ใช่ถูกต้องแล้ว
Adnan

@Adnan ahhh ... ความคิดแปลก ๆ ความคิดที่ดี
Magic Octopus Urn

4

C (gcc) , 143 140 138 136 135 132 ไบต์

  • บันทึกสามไบต์ โดยใช้ตัวแปรในการจัดเก็บของฟังก์ชันบูลีนกลับมาแทนการยกเลิกการใช้rreturn
  • บันทึกสองไบต์ golfing int A[]to int*A(ใช้ตัวชี้แทนอาร์เรย์)
  • ที่บันทึกไว้สองไบต์ขอบคุณที่Steadybox ; การเล่นกอล์ฟไปf(int*A,int a)f(A,a)int*A;
  • บันทึกเป็นไบต์ การเล่นกอล์ฟไปif(d!=...if(d-...
  • บันทึกสามไบต์ การเล่นกอล์ฟไป;j++...j+1;...++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;}

ลองออนไลน์!

กำหนดฟังก์ชั่นfที่ดูทุกองค์ประกอบในรายการ แต่สุดท้ายและกำหนดความสัมพันธ์ขององค์ประกอบนี้กับองค์ประกอบต่อไปในรายการ จำนวนการเปรียบเทียบที่เท่ากันติดต่อกันจะถูกเก็บไว้ในครั้งแรกที่ความสัมพันธ์พลิกกลับการรันใด ๆ หลังจากการเริ่มต้นครั้งแรกที่แตกต่างกันไปตามความยาวที่เก็บไว้ส่งผลให้ผลลัพธ์ที่ผิดพลาด ในตอนท้ายความสัมพันธ์ขององค์ประกอบที่สองถึงครั้งสุดท้ายกับองค์ประกอบสุดท้ายจะถูกมองเพื่อให้ตรงกับส่วนที่เหลือของรายการ


คุณสามารถใช้แทนf(A,a)int*A; f(int*A,int a)
Steadybox



3

Husk , 7 ไบต์

EmLġ±Ẋ-

ลองออนไลน์!

มันทำงานอย่างไร

EmLġ±Ẋ- ~ โปรแกรมเต็มรูปแบบ

     Ẋ ~ แผนที่เหนือคู่ขององค์ประกอบที่อยู่ติดกัน
      - ~ พร้อมการลบ (นี่จะคำนวณเดลตา)
   ġ ~ กลุ่มที่ใช้ภาคแสดงความเท่าเทียมกัน
    ± ~ เครื่องหมาย
 mL ~ รับความยาว
E ~ ทุกคนเท่าเทียมกันเหรอ?

ทางเลือกที่น่ารักบางอย่าง:

εġLġ±Ẋ-
εüLġ±Ẋ-

2

JavaScript (ES6), 81 ไบต์

ดูเหมือนว่านานเกินไป ฉันอาจขาดหายไปบางสิ่งบางอย่างที่นี่ ... ผลตอบแทนอย่างใดอย่างหนึ่งหรือtrueundefined

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)

ค้นหารอบระยะเวลา0 <p <a.lengthซึ่งการเปลี่ยนแปลงทิศทางทั้งหมดเกิดขึ้นทุกองค์ประกอบp

กรณีทดสอบ


2

Python 2 , 96 ไบต์

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

ลองออนไลน์! เอาท์พุทผ่านรหัสทางออก: ความผิดพลาด (1) เป็นเท็จ, ทางออกที่สะอาด (0) เป็นความจริง

Python 2 , 106 ไบต์

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

ลองออนไลน์!


ผมไม่แน่ใจ แต่อาจจะผกผันของ(...)[:l]<d (...)[:l]==d
Jonathan Frech

2

Haskell , 79 78 77 ไบต์

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

ลองออนไลน์!

ได้รับรายชื่อs, zipWith(<)s$tail sการทดสอบสำหรับแต่ละองค์ประกอบไม่ว่าจะมีขนาดเล็กกว่าทายาทเช่นอัตราผลตอบแทนs=[2,3,6,4,2,3,7,5,3] [True,True,False,False,True,True,False,False]จากนั้นgroupเรียกใช้องค์ประกอบเดียวกันเข้าด้วยกัน:[[True,True],[False,False],[True,True],[False,False]] . เพื่อตรวจสอบว่ารายชื่อทุกคนที่มีความยาวเดียวกันเปลี่ยนองค์ประกอบของพวกเขาด้วย1( ดูเคล็ดลับนี้ ) ผลผลิต[[1,1],[1,1],[1,1],[1,1]]และตรวจสอบว่าองค์ประกอบทั้งหมดในหางtของรายการนี้เท่ากับหัว:hall(==h)t

วิธีนี้ใช้ไม่ได้กับรายการซิงเกิล แต่เนื่องจากสิ่งเหล่านี้เป็นจริงเสมอเราจึงสามารถจัดการได้ในกรณีของตนเอง: g[_]=1<3.



1

Japt 15 ไบต์

ä- mg ò¦ mÊä¥ e

ลองออนไลน์!

คำอธิบาย

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

1

R, 36 ไบต์

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

diffคำนวณความแตกต่างอย่างต่อเนื่องแล้วsignบีบลงไปที่± 1 rleจากนั้นรันความยาวเข้ารหัสพวกเขา องค์ประกอบทั้งหมดของสิ่งนี้rleควรเหมือนกันนั่นคือเวกเตอร์มีค่าเบี่ยงเบนมาตรฐานเป็นศูนย์ !จากนั้นสร้างเอาต์พุตตรรกะที่ถูกต้อง


1

Haskell (แลมบ์บ็อต), 59 ไบต์

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

ตามคำตอบของ @ Laikoni


เยี่ยมมากฉันไม่รู้ว่า Lamdabot เปิดใช้งาน ViewPatterns แล้ว g_=1<3มีพื้นที่ที่หายไปคือ
Laikoni

@Laikoni ฉันไม่ได้ แต่จริงๆแล้วฉันไป #haskell และทดสอบมัน
BlackCap


0

Clojure 70 ไบต์

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

ส่งคืนค่า1เป็นจริงและnil(AKA null) เป็นเท็จ


0

Java (OpenJDK 8) , 135 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.