ในการขับขี่ที่เป็นหลุมเป็นบ่อ


18

งานของคุณคือการเขียนโปรแกรมคอมพิวเตอร์หรือฟังก์ชั่นที่ใช้รายการจำนวนเต็มบวกอย่างน้อย 2 ตัวและกำหนดว่าเป็น "ซิกแซก" หรือไม่ ลำดับคือคดเคี้ยวไปมาถ้าหากตัวเลขสลับกันในการมีขนาดใหญ่และเล็กกว่าจำนวนที่มาก่อนพวกเขา ตัวอย่างเช่นและเป็นซิกแซก แต่และไม่ใช่[1,2,0,3,2][ 1 , 2 , 0 , 0 , 3 , 1 ] [ 1 , 2 , 3 , 1 ][4,2,3,0,1][1,2,0,0,3,1][1,2,3,1]

สำหรับการตัดสินใจของคุณคุณควรส่งออกหนึ่งในสองค่าที่สอดคล้องกันที่แตกต่างกันสำหรับแต่ละความเป็นไปได้ (คดเคี้ยวไปมาและไม่ได้คดเคี้ยวไปมา)

จุดรหัสของโปรแกรมหรือฟังก์ชั่นของคุณจะต้องเป็นซิกแซกเอง ซึ่งหมายความว่าเมื่อคุณใช้ลำดับของจุดรหัสควรเป็นซิกแซก

นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยกว่าจะดีกว่า


1
บทลงโทษสำหรับผู้ที่ไม่ได้ซิกแซกแต่ละคนในจุดรหัสอาจเป็นอีกแนวทางหนึ่งที่จะช่วยให้ภาษาที่หลากหลายเข้าร่วมได้มากขึ้น
ngm

5
@ngm ฉันไม่เห็นด้วย การแนะนำโบนัส / บทลงโทษจะทำให้ผู้ใช้มีหลายคำตอบที่เป็นไปได้ (เช่นสั้น ๆ หนึ่ง + โทษยาว + ไม่มีโทษ) ทำให้กระบวนการตอบรับช้าลง นอกจากนี้จำนวนของการลงโทษที่กำหนดจะค่อนข้างสุ่มหมายความว่ากระบวนการให้คะแนนไม่เป็นไปตามวัตถุประสงค์
JungHwan Min

2
เราควรรับโค้ด Unicode หรือคะแนนรหัสของการเข้ารหัสที่เราใช้หรือไม่
Dennis

1
@Dennis จุดรหัสของการเข้ารหัสที่คุณใช้
ข้าวสาลี Wizard

2
@ เดนนิสแน่นอนว่าเป็นเรื่องจริง อย่างไรก็ตามเราได้กำหนดไว้แล้วว่าการให้รางวัลโบนัสสำหรับ code-golf นั้นไม่เหมาะอย่างยิ่งเพราะพวกเขาเบี่ยงเบนความท้าทายหลัก การลงโทษในกรณีนี้จะเป็นโบนัสเชิงลบ
JungHwan Min

คำตอบ:


7

เยลลี่ 5 ไบต์

IṠIỊẸ

ส่งคืน (คดเคี้ยวไปมา) หรือ1 (ไม่ใช่คดเคี้ยวไปมา)01

จุดโค้ดในหน้ารหัสวุ้น[73,205,73,176,174]

ลองออนไลน์!

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

IṠIỊẸ  Main link. Argument: A (array)

I      Increments; compute the forward differences of A.
 Ṡ     Take their signs.
       A is zigzag iff the signs are alternating.
  I    Take the increments again.
       Alternating signs result in an increment of -2 or 2.
       Non-alternating signs result in an increment of -1, 0, or 1.
   Ị   Insignificant; map each increment j to (|j| ≤ 1).
    Ẹ  Any; return 0 if all results are 0, 1 in any other case.

4

Haskell , 87 ไบต์

f(a:b:c:d)|(>)a b,b<c=f$b:c:d |(<)a b,b>c=f$b:c:d |1>0=1>12
f[a ] =1<12
f(a:b:_)= a/= b

ลองออนไลน์!

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


4

MATL , 9 ไบต์

dt?ZSd]pA

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

โปรแกรม MATL ครั้งแรกของฉัน! Penultimate pถูกเพิ่มเข้ามาสำหรับข้อกำหนดซิกแซก

คำอธิบาย:

d    %take the difference between successive elements of input
t    %duplicate that
?    %if that is all non-zero
  ZS %take the sign of those differences (so input is all `-1`s and `1`s now)
  d  %take the difference of that (so if there are successive `1`s or `-1`s, this will have a 0)
]    %end-if
p    %take the product of topmost stack vector (will be 0 if either the original difference or 
     % the difference-of-signs contained a 0)
A    %convert positive products to 1 (since OP specifies "you should output one of two different consistent values for each possibility ")

ขอขอบคุณ! ใช่เช่นฉันกล่าวถึงในคำตอบฉันเพิ่มมันเฉพาะสำหรับความต้องการคดเคี้ยวไปมา (เนื่องจากรหัสตัวเองต้องไปคดเคี้ยวไปมา) ]เห็นได้ชัดว่ามีชีวิตอยู่ระหว่างตัวอักษรและตัวอักษรขนาดเล็กเพื่อdที่จะ]และ]เพื่อAทั้งสองจะได้รับการลดลงซึ่งไม่ได้รับอนุญาต ดังนั้นpส่วนใหญ่อยู่ที่นั่นเพื่อให้มีการเพิ่มขึ้น codepoint ระหว่างทั้งสอง
sundar - Reinstate Monica

1
โอ้ฉันลืมข้อกำหนดทั้งหมดไปโดยสิ้นเชิง นั่นทำให้คำตอบน่าประทับใจมากขึ้น!
Luis Mendo

4

Python 2 , 225 223 161 139 ไบต์

-2 bytes ขอบคุณ Jakob
-62 bytes ขอบคุณ Dennis

e={eval }.pop()
p ="i"+"n"+"p"+"u"+"t ( "
s=e(p +")")
e(p +"` a"+"l"+"l([(x<y>z)+(x>y<z)f"+"o"+"r x,y,z i"+"n zip(s,s [1: ],s [2: ])])` )")

ลองออนไลน์!

เครดิตสำหรับอัลกอริทึมเป็นหลุมเป็นบ่อไปที่คำตอบนี้

input, print, exec, defและlambdaไม่ได้เป็นหลุมเป็นบ่อดังนั้นฉันได้evalซ้ายซึ่งถูกเก็บไว้บนe
มี 2 วิธีหลักในการข้ามข้อ จำกัด วางอยู่"+"หรือระหว่างคู่ที่ไม่เป็นหลุมเป็นบ่อผมเลือกใช้สำหรับอดีต ( สั้นสำหรับการใช้งานแต่ละ แต่ มันจะต้องreplace(' ','')ส่งผลให้ไบต์มากขึ้น)
เนื่องจากprintไม่เป็นหลุมเป็นบ่อฉันไม่สามารถใช้โดยตรงและเนื่องจากไม่ใช่ funcion ฉันไม่สามารถใช้ภายในeval()ดังนั้นฉันต้องใช้input(result)เพื่อผลลัพธ์ผลลัพธ์


ดี คุณสามารถใช้แทนสำหรับ' ' * 0 ' ' [1: ]
Jakob

คุณสามารถใช้input(text)เพื่อเขียนถึง STDOUT
Dennis

4

K (ngn / k) , 23 ไบต์

{*/ 0 >1_ *':1_ -': x }

ลองออนไลน์!


ทำไมต้องมีช่องว่าง
Zacharý

@ Zachary รหัส k ตัวเองจะไม่เป็นหลุมเป็นบ่อโดยที่พวกเขา
NGN

คุณหมายถึงอะไร? เป็นเพียง ngn / k ที่ใกล้กับช่องว่าง
Zacharý

3
@ Zacharýความท้าทายนี้ถูกจำกัด แหล่งที่มาและข้อ จำกัด คือรหัสจะต้องเป็นคดเคี้ยวไปมา
Erik the Outgolfer

อ๊ะลืมเกี่ยวกับเรื่องนั้นด้วย
Zacharý

3

โอห์ม v2 , 5 ไบต์

δyδ½Å

ลองออนไลน์!

[131,121,131,16,165]

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

δyδ½Å - โปรแกรมเต็ม / บล็อกอาร์กิวเมนต์เดียว
δy - สัญญาณของเดลต้าของอินพุต 
  δ - ความแตกต่างของสัญญาณ ผลลัพธ์ในลำดับที่ 2 หรือ -2 สำหรับ
        อาร์เรย์เป็นหลุมเป็นบ่อเป็นสัญญาณสำรองให้ -1-1 = -2 หรือ 1 - (- 1) = 2
    Å - ตรวจสอบว่าองค์ประกอบทั้งหมดให้ผลลัพธ์ที่เป็นจริงเมื่อ ...
   ½ - ลดลงครึ่งหนึ่ง

2

Japt -! , 16 14 ไบต์

นี่มันไม่สวย แต่ฉันมีความสุขที่ได้ผล!

เอาต์พุตtrueสำหรับ zig-zag หรือfalseไม่

ä'- m'g ä'a èÍ

ลองมัน

Codepoints นั้น[228,39,45,32,109,39,103,32,228,39,97,32,232,205]รวมอยู่ในการทดสอบในลิงก์ด้านบน


คำอธิบาย

                   :Implicit input of array
ä'-                :Consecutive differences
    m'g            :Map signs
        ä'a        :Consecutive absolute differences
             Í     :Subtract each from 2
            è      :Count the truthy (non-zero) elements
                   :Implicitly negate and output resulting boolean.

@KamilDrakari ปกติแล้วคุณจะพูดถูก แต่น่าเสียดายที่พวกเขาจำเป็นต้องปฏิบัติตามข้อกำหนดที่จำกัด แหล่งที่มาของความท้าทาย มิฉะนั้นอาจเป็น10 ไบต์ไบต์
Shaggy

โอ้ฉันไม่เห็นว่านี่เป็นแหล่งที่ถูก จำกัด ความผิดฉันเอง
Kamil Drakari

@ KamilDrakari ไม่ต้องกังวล ดูเหมือนว่าคุณไม่ใช่คนเดียว
Shaggy


1

Perl 6 , 61 bytes

{ [*] ($_[{1…*} ] Z<@$_)Z+^ ($_[{1…*} ] Z>@$_[{2…*} ])}

ลองออนไลน์!

จุดรหัสคือ:

(123 32 91 42 93 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 60 64 36 95 41 90 43 94 32 40 36 95 91 123 49 8230 42 125 32 93 32 90 62 64 36 95 91 123 50 8230 42 125 32 93 41 125)

และใช่นั่นคือตัวอักษร Unicode ในนั้น นี่เป็นโซลูชันดั้งเดิมของฉันมากกว่าหรือน้อยกว่าโดยมีช่องว่างและเครื่องหมายปีกกาสองสามตัวผสมกัน


1

05AB1E , 10 ไบต์

¥DÄ/¥(Ä2QP

ลองออนไลน์!

คำอธิบาย

¥           # calculate deltas of input
 DÄ/        # divide each by its absolute value
    ¥       # calculate deltas
     (      # negate each
      Ä     # absolute value of each
       2Q   # equals 2
         P  # product

คะแนนรหัสคือ: [165, 68, 196, 47, 165, 40, 196, 50, 81, 80]


1

JavaScript (ES6), 62 60 ไบต์

a=> a.map(n=> e&=!~(p | q)| q <(q=p)^ p <(p=n), e=p=q=~ 0)|e

ลองออนไลน์!

คะแนนรหัส:

61 3d 3e 20 61 2e 6d 61 70 28 6e 3d 3e 20 65 26
3d 21 7e 28 70 20 7c 20 71 29 7c 20 71 20 3c 28
71 3d 70 29 5e 20 70 20 3c 28 70 3d 6e 29 2c 20
65 3d 70 3d 71 3d 7e 20 30 29 7c

2
โชคดีที่mapคดเคี้ยวไปมา!
Neil

0

05AB1E , 8 ไบต์

¥.±¥Ä2/P

ส่งคืน1.0สำหรับคดเคี้ยวไปมาและ0.0สำหรับลำดับที่ไม่คดเคี้ยวไปมา

จุดโค้ด[164,108,176,164,195,2,109,25]ในหน้ารหัส 05AB1E

ลองออนไลน์

คำอธิบาย:

¥           # Take the deltas of the (implicit) input-list
            #  i.e. [1,2,0,3,2,3] → [1,-2,3,-1,1]
          # Calculate the sign for each of them (-1 if a<0; 0 if 0; 1 if a>0)
            #  i.e. [1,-2,3,-1,1] → [1,-1,1,-1,1]
   ¥        # Calculate the deltas of those
            #  i.e. [1,-1,1,-1,1] → [-2,2,-2,2]
    Ä       # Take the absolute value of each
            #  i.e. [-2,2,-2,2] → [2,2,2,2]
     2/     # Divide them by 2
            #  i.e. [2,2,2,2] → [1.0,1.0,1.0,1.0]
            # (`;` {halve} would have been shorter, but doesn't comply to the challenge)
       P    # Take the product of the list resulting in either 1.0 or 0.0
            #  i.e. [1.0,1.0,1.0,1.0] → 1.0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.