Passtimes สุพีเรีย


32

บางครั้งเมื่อฉันเบื่อจริง ๆ ฉันชอบที่จะหาผลรวมของจำนวนเต็มจำนวนเต็มที่ไม่เป็นลบ ฉันจะหาผลรวมของความยาวอาร์เรย์ที่เป็นพลังของสองเท่านั้น น่าเสียดายที่ฉันมักจะทำผิดพลาด โชคดีที่ฉันติดตามงานของฉันเมื่อฉันไปตามวิธีต่อไปนี้:

ฉันเพิ่มคู่ของตัวเลขที่อยู่ติดกันจนกว่าจะเหลือเพียงอันเดียว ตัวอย่างเช่น:

 6 + 18 + 9 + 6 + 6 + 3 + 8 + 10
=  24   +   15  +   9   +   18
=       39      +       27
=               66

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

อินพุต: อาร์เรย์ / รายการ / ฯลฯ ของจำนวนเต็มที่ไม่เป็นลบและอาจมีความยาวของอาร์เรย์นั้นด้วยหากภาษาของคุณต้องการ อาร์เรย์นั้นจะเป็นตัวเลขทั้งหมดที่อ่านจากซ้ายไปขวาจากบนลงล่าง ตัวอย่างเช่นอาร์เรย์ด้านบนจะกลายเป็น:
[[6, 18, 9, 6, 6, 3, 8, 10], [24, 15, 9, 18], [39, 27], [66]]
หรือ
[6, 18, 9, 6, 6, 3, 8, 10, 24, 15, 9, 18, 39, 27, 66]ถ้าคุณต้องการ

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

ตัวอย่างของการสรุปที่ถูกต้อง:

6

5+6
=11

  3 + 2 + 4 + 5
=   5   +   9
=       14

[0, 1, 2, 3, 1, 5, 6]

[[1, 2, 4, 8], [3, 12], [15]]

ตัวอย่างบางส่วนของการสรุปที่ไม่ถูกต้อง:

5+4
=8

4 + 4 + 4 + 4
= 9   +   7
=     16

[[1, 2, 3, 4], [7, 3], [10]]

[3, 4, 5, 6, 7, 8, 9]

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

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม คำตอบที่สั้นที่สุดในแต่ละภาษาเป็นผู้ชนะ คำตอบที่เก่ากว่าจะชนะในกรณีที่เสมอกัน ฉันยังคงมีสิทธิ์ตัดสินใจว่า "ภาษาเดียวกัน" คืออะไร แต่ฉันจะบอกล่วงหน้าว่าไม่สามารถรับจุดได้ทั้งใน Python 2 และ Python 3


1
ยินดีต้อนรับสู่เว็บไซต์! ความท้าทายแรกที่ดี
AdmBorkBork

ทำไมวันที่สิ้นสุด? ภาษาที่ใหม่กว่าความท้าทายจะถูกห้ามโดยค่าเริ่มต้น
Rɪᴋᴇʀ

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

1
ไม่คุณสามารถใช้สิ่งใดก็ได้ที่ทำให้การเล่นกอล์ฟง่ายขึ้น
Bijan

ตัวอย่าง[0,1,2,3,1,5,6]ไม่ถูกต้องเนื่องจาก "อินพุต: อาร์เรย์ / รายการ / ฯลฯ ของจำนวนเต็มบวก"
Ben Frankel

คำตอบ:



9

Python 2 , 51 ไบต์

lambda l:map(sum,zip(*[iter(l)]*2))==l[len(l)/2+1:]

ลองออนไลน์! ขอบคุณ Rod สำหรับกรณีทดสอบ

ทำให้รายการทั้งหมดแบนเป็นอินพุต จัดกลุ่มองค์ประกอบเป็นคู่ที่อยู่ติดกันโดยใช้เคล็ดลับ zip / iterใช้ผลรวมของคู่และตรวจสอบว่าผลลัพธ์เท่ากับครึ่งหลังของรายการ

วิธี recursiveเข้ามาใกล้ที่ 55 ไบต์:

f=lambda l:len(l)<2or l[0]+l[1]==l[len(l)/2+1]*f(l[2:])

สิ่งนี้ใช้ว่าจำนวนเต็มอินพุทเป็นค่าบวกซึ่งนับตั้งแต่มีการเปลี่ยนแปลงข้อมูลจำเพาะ


[0,0,1,1,1,1,1]เนื่องจากเงื่อนไขของคำถามในขณะนี้ช่วยให้รายการที่ไม่ใช่เชิงลบวิธีการเวียนเกิดของคุณจะให้บวกเท็จ
Ben Frankel

7

Röda , 40 ไบต์

{[0]if{|x|[[x()|[_+_]]=y]if tryPeek y}_}

ลองออนไลน์!

มันเป็นฟังก์ชั่นนิรนามที่ส่งคืน0หากไม่มีข้อผิดพลาดและไม่มีอะไรหากมีข้อผิดพลาด

คำอธิบาย:

{[0]if{|x|[[x()|[_+_]]=y]if tryPeek y}_}
{                                      } /* Anonymous function */
      {|x|                           }_  /* Loop over lists in the stream */
                         if tryPeek y    /* If there are lists left after this */
            x()                          /* Push values in list x to the stream */
               |[_+_]                    /* Sum every pair of numbers in x */
           [         ]                   /* Create a list of sums */
                      =y                 /* If the list equals to the next list */
          [             ]                /* Push the result */
    if                                   /* If all results are TRUE */
 [0]                                     /* Return 0 */
                                         /* Otherwise return nothing */

นี่คือรุ่นที่สั้นกว่า (35 ไบต์) แต่ขัดกับกฎ (ฉันคิดว่า):

{{|x|[[x()|[_+_]]=y]if tryPeek y}_}

ลองออนไลน์!

มันเป็นฟังก์ชั่นนิรนามที่อ่านค่าจากกระแสและผลักTRUEหรือFALSEสำหรับแต่ละบรรทัดที่ถูกต้อง

ฉันไม่แน่ใจว่ายอมรับกฎนี้หรือไม่ นี่คือการป้องกันของฉัน: ในRödaเงื่อนไขifและwhileบล็อกไม่ใช่ค่าบูลีน แต่เป็นลำธาร สตรีม "ความจริง" อาจว่างเปล่าหรือมีเพียงTRUEสตรีมและสตรีม "เท็จ" มีอย่างน้อยหนึ่งFALSEรายการ ด้วยวิธีนี้ฟังก์ชั่นนี้จะส่งกลับค่า "บูลีน" และสามารถใช้เป็นเงื่อนไขของifคำสั่งโดยไม่มีการลดการดำเนินการ ฯลฯ


ฉันไม่แน่ใจว่ามีค่าหรือไม่ แต่สำหรับตอนนี้คุณมีโซลูชัน Roda เพียงตัวเดียวดังนั้นจึงยากที่จะพูดจนกว่าจะมีคนอื่นเข้ามา ฉันคิดว่าควรจะดี แต่ฉันไม่ชอบความคิดของการปรับแต่งกฎหลังจากคำถามเกิดขึ้น แม้ว่าบางทีใคร ๆ ก็สามารถสร้างมันขึ้นมาได้เพราะมันไม่ใช่การเปลี่ยนแปลงในกฎเกณฑ์
Bijan

2
@Bijan มีภาษาอื่นที่มีโครงสร้างคล้ายกัน ใน MATL ตัวอย่างเช่นอาร์เรย์ทั้งหมดจะเท็จถ้ามีหนึ่ง0ในนั้น ฉันไม่แน่ใจว่าRödaจัดการอย่างไร แต่ก็ไม่เคยได้ยินมาก่อน
AdmBorkBork

1
@Bijan คำจำกัดความของความจริง / ความเท็จของเราขึ้นอยู่กับภาษาที่ใช้ทำifเงื่อนไข หากนี่คือวิธีการทำงานของRödaมันจะเป็นไปตามกฎของเราเว้นแต่ข้อมูลจำเพาะของการท้าทายจะแทนที่ค่าเริ่มต้นอย่างชัดเจน
Dennis

@Dennis ดูเหมือนว่า OP ได้ห้ามสิ่งนี้: "อินพุตทั้งหมดที่ความผิดพลาดถูกส่งคืน / พิมพ์ผลลัพธ์เหมือนกันและอินพุตทั้งหมดที่ไม่มีข้อผิดพลาดส่งคืน / พิมพ์ผลลัพธ์เหมือนกัน" รูปแบบที่สั้นกว่าของโปรแกรมมีจำนวนผลลัพธ์ไม่ จำกัด
fergusq

@fergusq โอ้ใช่ฉันมองข้ามไปแล้ว
Dennis


5

Mathematica ขนาด 36 ไบต์

Most[Tr/@#~Partition~2&/@#]==Rest@#&

ฟังก์ชั่นเพียวการรายการที่ซ้อนกันเป็น input และกลับมาหรือTrue Falseฟังก์ชั่นTr/@#~Partition~2&จะใช้ผลรวมจำนวนคู่ของรายการซึ่งจะนำไปใช้ ( /@#) กับแต่ละรายการย่อยของรายการอินพุต รายการย่อยแรก, ที่สอง, ... ในรายการผลลัพธ์ควรจะเท่ากับรายการย่อยที่สอง, ที่สาม, ... ในอินพุตต้นฉบับ Most[...]==Rest@#ทดสอบคุณสมบัตินี้


4

Python 2 , 80 ไบต์

lambda l:all(l[i+1]==map(sum,zip(l[i][::2],l[i][1::2]))for i in range(len(l)-1))

ลองออนไลน์!

ไม่ค่อยดีเท่าคำตอบของงูหลามอื่น ๆ แต่ฉันรู้สึกเหมือนโพสต์อยู่ดี นี่เป็นเพียงการแสดงว่าทำไมฉันถึงเล่นกอล์ฟไม่เก่งในภาษาปกติ



3

05AB1E , 15 12 ไบต์

¬svyQy2ôO}\P

ลองออนไลน์!

คำอธิบาย

¬             # get the first element from input without popping
 sv      }    # for each element y in input
   yQ         # compare y to the top of the stack 
              # leaves 1 on the stack if equal and otherwise 0
     y2ô      # split y in pieces of 2
        O     # sum each pair in the list
          \   # discard the top of the stack (the left over final element of the list)
           P  # product of stack (all the 1's and/or 0's from the comparisons)

3

Haskell , 82 79 65 ไบต์

-14 ไบต์ขอบคุณ nimi!

p(x:y:z)=x+y:p z
f x=and.zipWith(==)(drop(length x`div`2+1)x)$p x

ทำงานโดยการเปรียบเทียบผลรวมของแต่ละคู่ขององค์ประกอบกับองค์ประกอบที่เกี่ยวข้องในบรรทัดถัดไปลง บางไบต์อาจจะเล่นกอล์ฟได้fแต่ฉันไม่สามารถหาได้


คุณสามารถเพิ่มค่าทั้งสองโดยตรงในฟังก์ชั่นp: p(x:y:z)=x+y:p zแล้วใช้zipWith(==)แทนzipและรวมรายการBoolกับ:and f x=and.zipWith(==)(drop(length x`div`2+1)x)$p x
nimi

2

Python 3 , 69 68 ไบต์

lambda v:any(x+v[i-1]-v[(len(v)+i)//2]for i,x in enumerate(v)if i%2)

ฉันรู้ว่ามีคำตอบหลามอีกสองคำตอบอยู่แล้ว ... แต่อันนี้เป็นงูหลาม 3 ดังนั้นมันแปลกใหม่

สิ่งนี้ใช้ได้กับอินพุตที่แบน

ผลผลิต :

False หากไม่มีข้อผิดพลาด

True หากมีข้อผิดพลาด


2

Ruby, 50 ไบต์

->x{a=b=0;b&&=x[a/2]==x[a]+x[a-1]while x[-a-=2];b}

ย้อนกลับอาร์เรย์องค์ประกอบใด ๆ ของครึ่งแรก (ตำแหน่ง n) ต้องเป็นผลรวมขององค์ประกอบในตำแหน่ง n * 2 และ n * 2 + 1


2

Brachylog , 16 13 ไบต์

s₂ᵘ{{ġ₂+ᵐ}ᵈ}ᵐ

ลองออนไลน์!

นี่มันนานมาก! ต้องมีวิธีที่จะไม่ทำรังแบบอินไลน์ที่นี่

เพรดิเคตสำเร็จ (การพิมพ์true.เป็นโปรแกรม) หากไม่มีข้อผิดพลาดเกิดขึ้นและล้มเหลว (การพิมพ์false.เป็นโปรแกรม) เป็นอย่างอื่น

s₂ᵘ              Every length 2 substring of the input
   {       }ᵐ    for every element satisfies the following:
    {ġ₂          the pairs of elements of the input
       +ᵐ        when each pair is summed is the output
         }ᵈ      where the input is the first item and the output is the second.

1

Python 2 , 64 ไบต์

lambda a:[map(int.__add__,x[::2],x[1::2])for x in a[:-1]]==a[1:]

ลองออนไลน์!

ฟังก์ชันที่ไม่มีชื่อที่รับรายการ (หนึ่งรายการต่อหนึ่งบรรทัดของการทำงานเหมือนเดิม) และส่งกลับค่า True หากไม่มีข้อผิดพลาดเกิดขึ้นและเท็จเป็นอย่างอื่น

มันทำงานโดยใช้อินพุตที่ไม่มีรายการสุดท้ายa[:-1]เพื่อจัดรูปแบบอินพุตที่ไม่มีรายการแรกควรตรวจสอบว่าเป็นอินพุต==a[1:]อะไร

การก่อตัวนี้ทำได้โดยการทำแผนที่ฟังก์ชั่นการเพิ่มประเภทจำนวนเต็มint.__add__, เหนือคู่ของตัวเลขที่ให้ผลโดย "สไลซ์" สองส่วนหนึ่งชิ้นเป็นไอเท็มอื่นทุกรายการเริ่มต้นที่ดัชนี 0 x[::2], ชิ้นอื่น ๆ ดัชนี, x[1::2].


1

Pip , 20 19 ไบต์

$*{{b=$+*Ya<>2}MPa}

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้อาร์กิวเมนต์หนึ่งรายการของรายการ (เช่น[[1 2 3 4] [3 7] [10]]) ตรวจสอบกรณีทดสอบทั้งหมด: ลองออนไลน์!

คำอธิบาย

ในฟังก์ชั่น Pip ทั้งสองมีปากเสียงแรกที่ได้รับมอบหมายให้และab

  {               }  Anonymous function:
   {          }MPa    To each pair of sublists from a, map this helper function:
          a<>2         Group the 1st member of the pair into 2-item sublists
         Y             Yank that value (no-op used to override precedence order)
      $+*              Map (*) the fold ($) on addition (+) operator
    b=                 If the 2nd member of the pair is = to the result, 1; else 0
$*                   Modify the outside function by folding its return value on *
                     (makes a list containing all 1's into 1 and any 0's into 0)

ตัวอย่างเช่น:

a
[[1 2 3 4] [7 3] [10]]

{...}MP
a:[1 2 3 4] b:[7 3]
a:[7 3]     b:[10]

a<>2
[[1 2] [3 4]]
[[7 3]]

$+*
[3 7]
[10]

b=
0
1

Final result of {...}MPa
[0 1]

$*
0

1

PHP, 96 95 ไบต์:

ใช้ builtins:

function f($a){return!$a[1]||array_pop($a)==array_map(array_sum,array_chunk(end($a),2))&f($a);}
// or
function f($a){return!$a[1]||array_map(array_sum,array_chunk(array_shift($a),2))==$a[0]&f($a);}

ฟังก์ชั่น recursive กลับหรือtruefalse

รายละเอียดสำหรับฟังก์ชั่นแรก:

function f($a){
    return!$a[1]||      // true if array has no two rows ... or
    array_pop($a)==     // remove last row, true if equal to
    array_map(array_sum,    // 3. sum up every chunk
        array_chunk(        // 2. split to chunks of 2
            end($a)         // 1. new last row
        ,2))
    &f($a);             // and recursion returns true
}

โซลูชันที่เก่ากว่า (แต่ละ 96 ไบต์) โดยใช้ลูป:

function f($a){foreach($a[0]as$k=>$v)$b[$k/2]+=$v;return$b==$a[1]&&!$a[2]|f(array_slice($a,1));}
//or
function f($a,$y=0){foreach($a[$y]as$k=>$v)$b[$k/2]+=$v;return$b==$a[++$y]&&!$a[$y+1]|f($a,$y);}

รายละเอียดสำหรับฟังก์ชั่นที่ผ่านมา:

function f($a,$y=0){
    foreach($a[$y]as$k=>$v)$b[$k/2]+=$v;    // build $b with correct sums from current row
    return$b==$a[++$y]                      // true if $b equals next row
    &&!$a[$y+1]                             // and (finished
        |f($a,$y);                          //      or recursion returns true)
}

ตัวอย่างแบบวนซ้ำ, 81 ไบต์

for(;$a[1];)if(array_pop($a)!=array_map(array_sum,array_chunk(end($a),2)))die(1);
for(;$a[1];)if(array_map(array_sum,array_chunk(array_shift($a),2))!=$a[0])die(1);
for(;$a[++$y];$b=[]){foreach($a[$y-1]as$k=>$v)$b[$k/2]+=$v;if($a[$y]!=$b)die(1);}

สมมติอาร์เรย์ที่กำหนดไว้ล่วงหน้าใน$a; ออกโดยมีข้อผิดพลาดหากไม่ถูกต้อง


1

C, 54 ไบต์:

f(int*s,int*e){return e-s>1?*s+s[1]-*e||f(s+2,e+1):0;}

Ungolfed:

int f(int*s,int*e) {
    if(e-s>1) {
        return *s+s[1] != *e || f(s+2,e+1);
    } else {
        return 0;
    }
}

ทดสอบด้วย

#include <assert.h>
int main() {
    int input1[15] = {6, 18, 9, 6, 6, 3, 8, 10, 24, 15, 9, 18, 39, 27, 66};
    assert(!f(input1, input1+8));

    int input2[7] = {3, 4, 5, 6, 7, 8, 9};
    assert(f(input2, input2+4));
}

ตามที่เห็นแล้วf()จะคืนค่าจริงสำหรับอินพุตที่ไม่ถูกต้องและ false (= 0) สำหรับอินพุตที่ถูกต้อง

เช่นเคยการเรียกซ้ำมีค่าน้อยกว่าการวนซ้ำดังนั้นจึงf()เรียกซ้ำได้แม้ว่าจะใช้ตัววนซ้ำสองตัวเป็นอาร์กิวเมนต์ มันทำงานโดยการเปรียบเทียบผลรวมของจำนวนเต็มสองจำนวนที่sหนึ่งกับจำนวนเต็มeโดยไม่สนใจขอบเขตของระดับและดำเนินต่อไปจนกระทั่งตัววนซ้ำทั้งสองพบกัน ฉันยังใช้บูลีนเซนร่วมกับความจริงที่ว่าค่าจำนวนเต็มใด ๆ ที่ไม่เป็นศูนย์ถือว่าเป็นจริงใน C เพื่อย่อรหัสให้สั้นลง


1

R, 92 77 ไบต์

ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้ลำดับตัวเลขแบบแบนเป็นอินพุต ส่งคืนTRUEหรือFALSEตามความเหมาะสม ใช้วิธีการเดียวกันกับที่เป็นแนวคิดในการตอบหลามของ xnor

function(x,l=sum(1|x)/2)all(rowSums(cbind(x[1:l*2-1],x[1:l*2]))==tail(x,l-1))

วิธีแก้ไขปัญหาก่อนหน้าโดยใช้rollapplyฟังก์ชั่นจากzooแพ็คเกจและรับอินพุตเป็นรายการเช่นlist(c(6, 18, 9, 6, 6, 3, 8, 10), c(24, 15, 9, 18), c(39, 27), c(66)):

function(l,T=1){for(i in 2:length(l))T=T&all(zoo::rollapply(l[[i-1]],2,sum,by=2)==l[[i]]);T}

1

JavaScript (ES6), 46 44 ไบต์

รับอินพุตเป็นอาเรย์แบบแบน ส่งคืนNaNค่าที่ถูกต้องหรือ0ไม่ถูกต้อง

f=([a,b,...c])=>a+b==c[c.length>>1]?f(c):b-b

ทดสอบ


0

PHP, 102 ไบต์

อินพุตพารามิเตอร์ als url ในรูปแบบ?0=[1,2,3]&1=[3,3]&2=[6] นี้ใช้อินพุตนี้[[int,int],[int]]

<?$r=[$_GET[0]];for(;count(end($r))>1;)$r[]=array_map(array_sum,array_chunk(end($r),2));echo$r==$_GET;

ทำให้พังถล่ม

$r=[$_GET[0]]; # Set the first item of the input in the result array 
for(;count(end($r))>1;) # till the last item in the result array has only one int
$r[]=array_map(array_sum,array_chunk(end($r),2));# add the next item to the result array
echo$r==$_GET; # compare the input array with the result array

0

Japt, 10 ไบต์

รับอินพุตเป็นอาร์เรย์ 2 มิติ

äÏeXò mxÃe

ลองมัน

äÏeXò mxÃe     :Implicit input of 2-D array
ä              :Reduce each consecutive pair of sub-arrays
 Ï             :By passing them through the following function as X & Y, respectively
  e            :  Test Y for equality with
   Xò          :    Split X on every 2nd element
      m        :    Map
       x       :      Reduce by addition
        Ã      :End function
         e     :All true?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.