พาร์ติชันที่ปรับปรุงแล้ว


19

พิจารณาอาร์เรย์ของจำนวนเต็ม:

[1, 0, 9, 1, 3, 8]

มีหลายวิธีในการแบ่งรายการนี้เป็นรายการย่อยที่ต่อเนื่องกัน ที่นี่มีสาม:

A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]

เราจะเรียกพาร์ติชั่นYและการปรับแต่งพาร์ติชั่นXอีกอันถ้าXสามารถหาได้จากYโดยการรวมกลุ่มย่อยของมันเข้าด้วยกัน

ดังนั้นBเป็นการปรับแต่งของA: Aถ้าเราเข้าร่วมครั้งแรกที่สองและทั้งสองรายการย่อยสุดท้ายกลับมารวมกันเราได้รับ แต่Cเป็นไม่ได้ปรับแต่งของAเราจะต้องแยกขึ้น9และ1เพื่อที่จะกู้คืนAจากมัน นอกจากนี้พาร์ติชันใด ๆ ก็มีการปรับแต่งเล็กน้อย

โปรดทราบว่าเราไม่ได้รับอนุญาตให้จัดเรียงรายการย่อยหรือองค์ประกอบใหม่อีกครั้ง

ความท้าทาย

ป.ร. ให้ไว้สองพาร์ทิชัน (รายชื่อของรายการของจำนวนเต็ม) XและYตรวจสอบว่าเป็นการปรับแต่งของYX

คุณอาจคิดว่าพาร์ติชั่นจะมีจำนวนเต็มตั้งแต่0ถึง9รวม คุณต้องไม่สมมติXและYเป็นพาร์ทิชันของรายการเดียวกัน (ถ้าไม่ใช่พวกเขาจะไม่ปรับแต่งซึ่งกันและกัน) Xและ / หรือYอาจว่างเปล่า แต่จะไม่มีรายการย่อยที่ว่างเปล่า

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

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

ผลลัพธ์ควรเป็นจริงหากYมีการปรับแต่งXและเป็นเท็จอย่างอื่น

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

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

X Yกรณีทดสอบแต่ละคนอยู่บนเส้นของตัวเองเขียนเป็น ฉันใช้สัญลักษณ์อาร์เรย์ GolfScript / CJam เพื่อประหยัดพื้นที่แนวนอน:

Truthy:

[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

Falsy:

[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>

ความท้าทายที่เกี่ยวข้อง


จะ[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]หรือ[["109" "138"] ["1" "09" "13" "8"]]จะเป็นรูปแบบการป้อนยอมรับ?
Dennis

@Dennis การตัดอินพุตทั้งหมดในอาร์เรย์ดูเหมือนว่าแปลก ฉันไม่ทราบว่าเป็นแบบฝึกหัดมาตรฐาน แต่อาจคุ้มค่ากับคำถามเมตา หากไม่มีวงเล็บนอกมันก็ใช้ได้ดี
Martin Ender

ฉันจะพยายามเขียนคำถามเมตา
Dennis

คำตอบ:


6

CJam, 13 10 9 ไบต์

lr.-F-U-!

ลองใช้ออนไลน์ในล่าม CJam

ขอขอบคุณที่ @ MartinBüttnerสำหรับการแนะนำ@ edc65 ของรูปแบบการป้อนแยบยล

ขอบคุณ @ jimmy23013 สำหรับการปรับปรุงรูปแบบการป้อนข้อมูลและการเล่นกอล์ฟ 3 ไบต์เพิ่มเติม

I / O

อินพุต

รายการย่อยจะถูกคั่นด้วย;และจากซึ่งกันและกันโดย,:

1;0;9,1;3;8
1,0;9,1;3,8

เอาท์พุต

1

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

lr e# Read line and a whitespace-separated token from STDIN.
.- e# Vectorized difference. Pushes the differences of corresponding code points.
F- e# Remove all occurrences of 15 (';' - ',') from the array.
U- e# Remove all occurrences of 0 from the array.
!  e# Push 1 if the resulting array is empty and 0 if not.

สำหรับสตริงที่มีความยาวต่างกัน.-จะทำให้อักขระอยู่ในอาร์เรย์ซึ่งไม่สามารถเท่ากับจำนวนเต็ม 0 หรือ 15


หากคุณสามารถใช้;เป็นตัวคั่น ll.m27m0-!...
jimmy23013

@ jimmy23013: ฉันไม่เห็นว่าทำไม ,และ;เป็นทั้งไวยากรณ์อาร์เรย์ทั่วไป (และไม่มีการใช้ CJam) ขอบคุณ!
Dennis

9

Pyth, 19 ไบต์

&gF_m{.u+NYdYQqFsMQ

ลองใช้งานออนไลน์: การสาธิตหรือชุดทดสอบ

ฉันกำลังใช้รูปแบบ tuple / list ของ Pyth เป็นอินพุต เพียงแทนที่ช่องว่างของกรณีทดสอบด้วยเครื่องหมายจุลภาค

คำอธิบาย:

                     implicit: Q is the evaluated input
    m        Q       map each input list d to:
      .u   dY          reduce with intermediate states over d, initial value = []
        +NY              update initial value N with sum of N and Y (current element of d)
     {                 generate a set
   _                 invert
 gF                  check, if the first element is >= (superset) than the second
&                    and
                sMQ  check, if the joined lists of the input
              qF     are equal

เนื่องจากรหัสหลอกยังคงสับสนเล็กน้อยฉันจะสาธิตอัลกอริทึมโดยใช้ตัวอย่างอินพุต

Input: [[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]

.u+NYdYส่วนคำนวณรายการย่อยอย่างต่อเนื่องทุกที่มีองค์ประกอบแรก

[[1,0,9],[1,3,8]]     => [[], [1,0,9], [1,0,9,1,3,8]]
[[1],[0,9],[1,3],[8]] => [[], [1], [1,0,9], [1,0,9,1,3], [1,0,9,1,3,8]]

Bคือการปรับแต่งของAiff แต่ละรายการย่อยอย่างต่อเนื่องของAยังเป็นรายการย่อยอย่างต่อเนื่องของB(มีเพียงข้อยกเว้นเดียว)

ดังนั้นฉันก็แค่ตรวจสอบว่าชุดAย่อยของรายการย่อยอย่างต่อเนื่องของเป็นเซตย่อยของชุดรายการย่อยต่อเนื่องของB( gF_m.u+NYdYQ) หรือไม่

ข้อยกเว้นเพียงอย่างเดียวคือถ้ารายการอินพุตแรกมีองค์ประกอบน้อยกว่ารายการอินพุตที่สอง ยกตัวอย่างเช่น<Fm.u+YdYQจะกลับมาสำหรับการป้อนข้อมูลTrue[[1]],[[1],[2]]

ดังนั้นฉันจึงตรวจสอบว่ารายการที่เข้าร่วมนั้นเท่ากัน&...qFsMQหรือไม่


7

JavaScript ( ES6 ), 67 70

แก้ไข 3 ไบต์บันทึก thx @apsillers

เรียกใช้ตัวอย่างข้อมูลด้านล่างใน Firefox เพื่อทดสอบ

f=(a,b)=>a+''==b // same values in the lists ?
&![...a.join(' ')].some((c,p)=>c<','&b.join(c)[p]>c) // splits in a are present in b?

// TEST

out=x=>O.innerHTML += x+'\n';

OK=[
[[],[]],
[[[0]],[[0]]],
[[[1,0,9,1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9,1,3,8]],[[1,0,9,1,3],[8]]],
[[[1,0,9,1,3,8]],[[1],[0],[9],[1],[3],[8]]],
[[[1,0,9],[1,3,8]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1],[0,9],[1,3],[8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5],[1,4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

KO=[
[[[0]],[]],
[[[0]],[[1]]],
[[[1,0,9]],[[1,0,9],[1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9,1,3,8]]],
[[[1,0,9],[1,3,8]],[[1,0,9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9]]],
[[[1,0,9],[1,3,8]],[[1,0],[9,1],[3,8]]],
[[[1],[0,9],[1,3],[8]],[[1,0,9],[1,3,8]]],
[[[9,8,8,5,8,2,7],[5],[1,4],[2,0,0,6,0,8,4,2,6,4,2,3,7,8,7,3,9,5,7,9,8,2,9,5],[3,9,8],[7,1,4,9,7,4,5,9],[3,3,3],[9,0,7,8],[3,9,4,7,2,7,8,0,3,0],[8,2,2,7,3,9,3,2],[2,9,0,8,5,4,1,8,5,5,6,2,0,9,2,7,7,9,2,7],[3,6],[1,2,7,7,4,4,2,9]],[[9,8],[8],[5,8,2],[7],[5,1],[4],[2],[0,0,6],[0],[8,4,2],[6,4],[2],[3],[7,8],[7,3],[9],[5,7,9],[8,2],[9,5],[3],[9,8],[7,1,4],[9,7],[4,5,9],[3,3],[3],[9,0],[7,8],[3],[9],[4],[7,2],[7,8],[0],[3,0],[8,2],[2],[7,3],[9,3],[2],[2],[9],[0],[8,5,4],[1,8],[5,5],[6],[2,0],[9],[2],[7,7,9],[2,7],[3,6],[1,2],[7,7],[4,4,2],[9]]]
];

dump=l=>l.map(x=>'['+x+']').join(',');

out('YES');
OK.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
out('NO');
KO.forEach(l=>out(f(l[0],l[1])+' a['+dump(l[0])+'] b['+dump(l[1])+']'));
<pre id=O></pre>


วันหนึ่งฉันจะต้องดาวน์โหลด Firefox เพื่อดูวิธีแก้ปัญหาที่ยอดเยี่ยมของคุณ :)
Alex A.

@AlexA คุณจะอยู่โดยปราศจากมันได้อย่างไร
edc65

ใช้ repl.it ฉันคิดว่ารองรับ ES6: D
Mark K Cowan

ผมชอบวิธีการที่คุณตั้งชื่อตัวแปรและOK KO
rr-

7

C, 69 75

ฟังก์ชันที่มีพารามิเตอร์สตริง 2 ตัวส่งคืน 0 หรือ 1

รูปแบบพารามิเตอร์: รายการย่อยคั่นด้วยช่องว่าง ('') องค์ประกอบรายการคั่นด้วยเครื่องหมายจุลภาค

ตัวอย่าง: "1,0,9 1,3,8" "1,0 9,1,3,8"

f(char*a,char*b){for(;*a-44?*a&&*b==*a:*b<48;a++)b++;return!(*b|*a);}

น้อย golfed

int f(char *a, char *b)
{
    // expected in a,b: digit,separator,digit... with separator being ' ' or ','
    for(; *a; a++,b++)
       // ' ' or digit in a must be the same in b
       // comma in a must be comma or space in b
       if (*a != ',' ? *b != *a : *b > *a) return 0;
    return !*b; // must have a null in *b too
}

ทดสอบ Ideone (ล้าสมัย)


1
ตัวเลือกที่ชาญฉลาดของรูปแบบอินพุต ฉันยืมมาเพื่อคำตอบอื่นของ Haskell
nimi

ฉันคัดลอกความคิดของคุณสำหรับการป้อนข้อมูลสำหรับคำตอบ JS ของฉันและกลายเป็นหนึ่งไบต์ที่ยาวกว่ารุ่น C ของคุณจนกว่าฉันจะอัปเกรดเป็น ES6 ... ใครจะคาดหวังว่า ...
Mark K Cowan

6

Haskell, 76 ไบต์

[]#[]=1<2
[x]#[y]=x==y
x@(a:b)#(c:d:e)|a==c=b#(d:e)|1<2=x#((c++d):e)
_#_=2<1

ผลตอบแทนหรือTrue Falseตัวอย่างการใช้งาน: ->[[1,0,9],[1,3,8]] # [[1,0],[9]]False

วิธีเรียกซ้ำง่าย ๆ : ถ้าองค์ประกอบแรกจับคู่กันให้ดำเนินการต่อไปโดยเริ่มจากส่วนอื่น ๆ เริ่มต้นใหม่ แต่ต่อสององค์ประกอบเข้าด้วยกันที่ด้านหน้าของรายการที่สอง กรณีพื้นฐานคือ: ทั้งสองรายการว่างเปล่า -> True; ทั้งสองรายการมีองค์ประกอบเดียว -> เปรียบเทียบ เพียงหนึ่งรายการที่ว่างเปล่า False->


6

CJam, 19 ไบต์

q~]{_,,\f>:sS.+}/-!

ลองออนไลน์

I / O

อินพุต

[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]

เอาท์พุต

1

ความคิด

แต่ละพาร์ติชันสามารถระบุได้โดยไม่ซ้ำกันโดยสังเกตคุณสมบัติสองอย่างต่อไปนี้:

  • รายการที่เกิดขึ้นจากการเชื่อมรายการย่อยทั้งหมด

  • "จุดตัด" รวมถึงสุดขั้วของรายการ

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

ในการตรวจสอบว่าพาร์ติชั่นที่ได้รับนั้นดีกว่าพาร์ติชั่นอื่นเราต้องตรวจสอบว่าพาร์ติชั่น coarser ที่แสดงด้านบนเป็นเซตย่อยของปลีกย่อยหนึ่งพาร์ติชั่นและรายการที่ใหญ่ที่สุดของทั้งสองพาร์ติชั่นตรงกัน

รหัส

q~]   e# Read from STDIN and evaluate.
{     e# For each array P from the input:
  _,, e#   Push [0 ... L], where L == length(P) - 1.
  \f> e#   Push [P[0:] ... P[L]].
  :s  e#   Stringify each P[k:] (flattens).
  S.+ e#   Vectorized concatenation. This appends a space to the first element.
}/    e#
-!    e# Push the logical NOT of the difference A-B to check if A is a subset of B.

สำหรับรูปแบบอินพุตตัวอย่าง I / O สแต็กจะถือ

["109138 " "138"] ["109138 " "09138" "138" "8"]

-!ก่อนที่จะดำเนิน

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


5

CJam, 24 ไบต์

l~L\{+_a2$1<={;1>L}&}/+!

ขั้นตอนวิธี

ที่นี่เราใช้อัลกอริทึมโลภเพื่อดูว่าNรายการย่อยแรกของรายการที่สองสามารถรวมเข้าด้วยกันเพื่อสร้างรายการย่อยแรกของรายการแรก เมื่อNพบเช่นนี้เราจะลบรายการNย่อยแรกออกจากรายการที่สองและรายการย่อยแรกจากรายการแรกและทำซ้ำกระบวนการ

หากว่ารายการที่สองเป็นการปรับแต่งครั้งแรกเราควรปล่อยให้มี 2 รายการที่ว่างอยู่บนสแต็ก เราเพียงตรวจสอบสิ่งนั้นและพิมพ์1หากเป็นกรณีนี้ ในการรวมกันอื่น ๆ หลังจากวนซ้ำอย่างสมบูรณ์ในรายการย่อยของรายการที่สองเราจะไม่จบลงด้วย 2 รายการที่ว่างเปล่า ดังนั้น0จะพิมพ์สำหรับกรณีดังกล่าว

การขยายรหัส

l~L\{+_a2$1<={;1>L}&}/+!
l~L\                       e# Read the line, evaluate the two lists and put an empty list
                           e# between them
    {               }/     e# Iterate over all sub-lists of the second list
     +                     e# Append the current sub-list to whatever is on stack. Originally
                           e# an empty array, but eventually the sum of first N sub-lists
      _a                   e# Copy this and wrap it in an array
        2$                 e# Copy the first list on top of stack
          1<               e# Get only its first element wrapped in an array. This approach
                           e# is exception safe in case the array was already 0 length
            ={    }&       e# If we have a match, remove both first sub-lists
              ;            e# Remove the first N sub-lists array
               1>          e# Remove the first element from the first array
                 L         e# Put an empty array on stack to repeat the process
                      +!   e# If we are left with two empty arrays, sum them and do logical
                           e# not to get 1. If any of the arrays is non-empty, logical not
                           e# gives 0

ลองออนไลน์ได้ที่นี่หรือเรียกใช้ชุดทดสอบที่สมบูรณ์ที่นี่


3

C, 120 114 ไบต์

#define C(x),x+=(*x/93)*(1+!!x[1])|1
o;R(char*s,char*t){for(o=1;*s;o&=*s==t[2*(*t==93&&93>*s)]C(s)C(t));return o;}

ฉันไม่ได้เล่นกอล์ฟมากนักเมื่อเร็ว ๆ นี้ดังนั้นฉันคิดว่าฉันจะลองตัวนี้

เรากำหนดฟังก์ชั่นR(char* s, char* t)ซึ่งจะส่งคืน1ถ้าtเป็นพาร์ติชันที่ผ่านการกลั่นกรองsและ0อื่น ๆ sและtคาดว่าจะอยู่ในรูปแบบ[DDDD...][DDDD...]...ที่แต่ละDองค์ประกอบอื่นเป็นตัวเลขหลักเดียว

รหัสการทดสอบ:

#include "stdio.h"

int main(int argc, char** argv) {
    char* str1, *str2;
    str1 = "[109][138]";
    str2 = "[1][09][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[1][19][13][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));

    str1 = "[109][138]";
    str2 = "[10][91][3][8]";
    printf("Input: %s, %s --> %d\n", str1, str2, R(str1, str2));
}

ด้านบนพิมพ์ดังต่อไปนี้:

Input: [109][138], [1][09][13][8] --> 1
Input: [109][138], [1][19][13][8] --> 0
Input: [109][138], [10][91][3][8] --> 0

ดูเหมือนว่าจะทำงานอย่างน้อย


3

Haskell, 52 50 53 ไบต์

x#y=and$zipWith(\a b->a==b||a==',')(x++"..")(y++"..")

สมบูรณ์แตกต่างจากของฉันวิธีการแก้ปัญหาอื่นใช้รูปแบบการป้อนข้อมูลเดียวกันฉลาดเป็นคำตอบ @ edc65 ขององค์ประกอบคือมีการแยกด้วยและรายการที่มี,

ตัวอย่างการใช้งาน: ->"1,0,9,1,3,8" # "1,0,9 1,3,8"True

,พารามิเตอร์ที่สองคือการปรับแต่งในครั้งแรกถ้าพวกเขามีองค์ประกอบอย่างใดอย่างหนึ่งที่เท่าเทียมกันทุกตำแหน่งหรือคนแรกคือ ฉันต้องผนวกท้ายโทเค็นที่ไม่ซ้ำกัน (-> ..) พารามิเตอร์ทั้งเพราะzipWithตัดทอนพารามิเตอร์อีกต่อไปและเช่นนี้ยังจะเป็น"1,2,3" # "1,2"True


1
(\a b->a==b||a>b)(>=)เป็นเพียง
alephalpha

จะไม่เพิ่มแค่ทำงาน"."แทน".."เหรอ?
ภูมิใจ Haskeller

สิ่งนี้ล้มเหลว"2"#"1"เนื่องจากฟังก์ชั่นตรวจสอบเฉพาะค่าที่ใหญ่กว่าไม่เท่ากัน
ภูมิใจ haskeller

@alephalpha: โอ้ที่รักโง่ของฉันที่จะมองข้ามว่า แต่มันก็ผิดอยู่ดี ดูความคิดเห็นอื่น
nimi

@proudhaskeller: การแก้ไขในนาทีสุดท้าย ใช่นี่เป็นข้อผิดพลาด ซ่อมมัน. ขอขอบคุณที่ค้นพบ BTW, จุดเดียว"."จะไม่ทำงานเพราะมันจะให้บวกเท็จ "2,1" # "2"ซึ่งเป็นครั้งแรกจะขยายตัวออกไป"2,1." # "2."แล้วถูกตัดทอนลงโดยการzipWith "2," # "2."เครื่องหมายจุลภาคในสตริงแรกตรงกับทุกอย่าง
nimi

2

Mathematica, 65 ไบต์

f@__=1<0;{}~f~{}=1>0;{a_,b___}~f~{c__,d___}/;a==Join@c:={b}~f~{d}

1
ทางออกที่ดี FYI ฉันมีโซลูชัน 59- ไบต์ที่ไม่ใช้การเรียกซ้ำ (หรือหลายคำจำกัดความ)
Martin Ender

2

คณิตศาสตร์ที่มีการแสดงออกปกติคือความสนุก!

ES6 Javascript, 53 ตัวอักษร

(a,b)=>RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

จาวาสคริปต์โบราณ, 70 ตัวอักษร

function f(a,b){return RegExp('^'+a.replace(/,/g,'[ ,]')+'$').test(b)

ใช้รูปแบบการป้อนข้อมูลเช่นเดียวกับคำตอบของ edc65

ตัวอย่างเต็มรูปแบบรวมถึงกรณีทดสอบทั้งหมดที่นี่


ฉลาด! อย่าคิดเกี่ยวกับนิพจน์ทั่วไปสำหรับงานนี้
edc65

ฉันเขียนโปรแกรม perl ที่เป็นตัวคูณจำนวนเต็มโดยใช้ฟังก์ชันแบบเรียกซ้ำซึ่งพบว่ามีปัจจัยสำคัญที่ใช้การแสดงออกย้อนรอยปกติ ... พวกมันไม่สวยและไม่เร็วแน่นอน แต่พวกเขาสามารถทำสิ่งดีๆได้!
Mark K Cowan

ฉันยังเขียนตัวแยกวิเคราะห์ซึ่งแปลงข้อกำหนดภาษาเป็นนิพจน์ทั่วไปและจากนั้นนิพจน์ทั่วไปนั้นสามารถใช้ในการแยกวิเคราะห์นิพจน์ในภาษาที่ระบุ โดยพื้นฐานแล้ว "รวบรวม" สเป็คภาษาที่มนุษย์สามารถอ่านได้เพื่อการแสดงออกปกติ "ปฏิบัติการ" github.com/battlesnake/d-slap นิพจน์ทั่วไปที่สร้างขึ้นสำหรับการแยกวิเคราะห์นิพจน์เชิงเข้าใจ AngularJS มีความยาวประมาณ 400-500 ตัวอักษร ...
Mark K Cowan

2

Mathematica, 55 ไบต์

Equal@@Join@@@#&&SubsetQ@@(Accumulate[Length/@#]&)/@##&

ฟังก์ชันนี้กำหนดฟังก์ชันที่ไม่มีชื่อโดยใช้สองพาร์ติชันในรายการเดียวตามลำดับย้อนกลับ (เช่นที่Yหนึ่งXที่สอง)

คำอธิบาย

Equal@@Join@@@#

ตรวจสอบว่าทั้งสองพาร์ติชั่นนั้นเป็นพาร์ติชั่นจริงของรายการเดียวกัน

SubsetQ@@(Accumulate[Length/@#]&)/@##

นี่เป็นรูปแบบการตีกอล์ฟของฉันในคำถามนี้เกี่ยวกับ Mathematica.SEซึ่งเป็นแรงบันดาลใจให้กับความท้าทายนี้ โดยทั่วไปพาร์ติชันจะถูกกำหนดเป็นดัชนีจำนวนหนึ่งที่มีการแทรกการแยกและการตรวจสอบนี้จะระบุตำแหน่งการแยกทั้งหมดXในYโดยการสะสมความยาวของรายการย่อย


2

Python 2, 68 51 bytes

ขอบคุณ xnor สำหรับการประหยัดจำนวนไบต์!

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวลาสองสายในรูปแบบ"1,0,9 1,3,8"(นำมาจากedc65 ของคำตอบ C ) และผลตอบแทนหรือTrue Falseเวอร์ชั่นใหม่ที่ใช้งานmap(None)ไม่ได้ใน Python 3 อีกต่อไป

lambda a,b:all(i in[j,","]for i,j in map(None,a,b))

ชุดทดสอบ:

>>> def runTests(f):
    assert f("1,0,9 1,3,8","1 0,9 1,3 8")
    assert not f("1,0,9 1,3,8","1,0 9,1 3,8")
    assert f("1 0,9 1,3 8","1 0,9 1,3 8")
    assert not f("1 0,9 1,3 8","1,0,9 1,3,8")
    assert not f("1 0,9 1,3 8","1 0,9 1,3")
    assert not f("1 0,9 1,3,8","1 0,9 1,3")
    print("All tests pass.")


>>> runTests(lambda a,b:all(i in[j,","]for i,j in map(None,a,b)))
All tests pass.

โซลูชัน 92- ไบต์ก่อนหน้านี้ที่รับอินพุตเป็น"109 138":

def R(a,b):
 r=1
 for i in b.split():r&=a.find(i)==0;a=a[len(i):].strip()
 return r and""==a

ฉันคิดว่าคุณสามารถหลีกเลี่ยงการทำการตรวจสอบความยาวอย่างชัดเจนโดยการทำแผนที่ไม่มี กรณีเมื่อหนึ่งรายการยาวกว่าอีกรายการหนึ่งถูกปฏิเสธโดยที่หนึ่งรายการมีNoneแต่ดัชนีอื่นมีตัวเลขเนื่องจากi==j or"0">i>jไม่สามารถเก็บได้
xnor

การทดสอบครั้งที่สองจะเป็นi==','ไปได้ถ้าหากฉันไม่มีอะไรหายไป วิธีนี้ช่วยให้คุณรวมการทดสอบตามที่i in[',',j]เราไม่สามารถทำได้i in ','+jเพราะjอาจเป็นNoneเช่นนั้น
xnor

@xnor ว้าวขอบคุณ # 1 ไม่ได้เกิดขึ้นกับฉันเพราะตอนนี้ฉันค่อนข้างคุ้นเคยกับ Python 3 อยู่แล้ว # 2 ไม่ได้เกิดขึ้นกับฉันเพราะ "เกิดอะไรขึ้นถ้าbมีตัวเลขตรงจุดนั้น" ... ลืมว่าด้วยรูปแบบอินพุตนี้มันเป็นไปไม่ได้
DLosc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.