บทนำ :
เคยใช้ Dropbox กับคนอื่นบ้างและคุณทั้งคู่ก็แก้ไขไฟล์เดียวกันหรือไม่? เคยมีแอปพลิเคชั่นที่มีผู้ใช้หลายคนพร้อมฐานข้อมูลเชิงสัมพันธ์และมีคนสองคนกำลังดัดแปลง (หรือแย่กว่านั้นอีกคนหนึ่งกำลังลบและอีกคนกำลังแก้ไขวัตถุเดียวกัน) ลองจำลองด้วยความท้าทายนี้ (เรียงลำดับจาก)
เพื่อความท้าทายนี้เรามีเพียงผู้ใช้สองคนและไฟล์ที่เกี่ยวข้องหนึ่งหรือสองไฟล์ ผู้ใช้ทั้งสองมีสิทธิ์ทั่วไปในการCRUD (สร้าง, อ่าน, อัพเดตและลบ)ไฟล์ทั้งหมด
ท้าทาย:
การป้อนข้อมูล:
เราจะมีอินพุตเล็กน้อย (รูปแบบอินพุตมีความยืดหยุ่นและอนุญาตรูปแบบที่เหมาะสม):
1) โหมดล็อค (เปิด / ปิด) : Kinda ความแตกต่างระหว่างในแง่ดีและแง่ร้ายล็อคเห็นพ้องด้วย
ผู้ใช้ทั้งสองคนได้รับอนุญาตให้ CRUD (สร้างอ่านอัปเดตและลบ) ทุกอย่าง แต่บางครั้งข้อผิดพลาดหรือปัญหาอาจเกิดขึ้นได้ ปัญหาขึ้นอยู่กับโหมดล็อคเมื่อปิดอาจเป็นข้อผิดพลาดเมื่อเปิด นี่คือคำอธิบายด้านล่างในส่วนเอาท์พุท
2 & 3) การกระทำของผู้ใช้สองรายการ การกระทำเหล่านี้ประกอบด้วยสองสิ่งเสมอ: สิ่งที่ผู้ใช้ทำ (สร้างอ่านอัปเดตหรือลบ) และไฟล์ใด
เอาท์พุท:
เราจะมีเอาต์พุตที่เป็นไปได้สามแบบ:
- ใช้ได้ : การกระทำทั้งสองอย่างของผู้ใช้ทั้งสองสามารถทำได้พร้อมกันโดยไม่มีปัญหาใด ๆ เกิดขึ้น
- ข้อผิดพลาด : การกระทำทั้งสองอย่างของผู้ใช้ทั้งสองไม่สามารถทำได้พร้อมกันและทำให้เกิดข้อผิดพลาดสำหรับผู้ใช้คนใดคนหนึ่ง (ผู้ใช้คนใดที่ไม่เกี่ยวข้องกับความท้าทายนี้) สิ่งนี้สามารถเกิดขึ้นได้เมื่อ:
- ผู้ใช้รายหนึ่งอ่านหรืออัปเดตไฟล์ซึ่งผู้ใช้รายอื่นลบ
- ผู้ใช้ทั้งสองอัพเดตไฟล์เดียวกันโดยเปิดโหมดล็อค
- ผู้ใช้สร้างไฟล์ซึ่งผู้ใช้รายอื่นอ่าน / อัปเดต / ลบ (ซึ่งหมายความว่าไฟล์มีอยู่แล้วดังนั้นจึงไม่สามารถสร้างได้)
- ผู้ใช้ทั้งสองสร้างไฟล์เดียวกัน
- ปัญหา : การกระทำทั้งสองอย่างของผู้ใช้ทั้งสองสามารถทำได้พร้อมกัน แต่อาจทำให้เกิดปัญหาที่ไม่คาดคิด สิ่งนี้สามารถเกิดขึ้นได้เมื่อ:
- ผู้ใช้ทั้งสองอัปเดตไฟล์เมื่อปิดโหมดล็อค
- ผู้ใช้หนึ่งอัปเดตไฟล์ซึ่งผู้ใช้คนอื่นอ่าน;
- ผู้ใช้ทั้งสองลบไฟล์เดียวกัน (ในทางปฏิบัติจะทำให้เกิดข้อผิดพลาดสำหรับผู้ใช้คนที่สอง แต่เนื่องจากมันจะยังคงถูกลบเหมือนที่ผู้ใช้ต้องการมันจะเป็นปัญหาแทนที่จะเป็นข้อผิดพลาดเพื่อความท้าทายนี้)
กฏท้าทาย:
- อินพุตและเอาต์พุตทั้งหมดมีความยืดหยุ่นและทุกคนควรระบุว่าใช้คำตอบแบบใด!
ตัวอย่างอินพุต:0
/1
สำหรับโหมดล็อค &31
(การกระทำที่สาม: อัปเดตไฟล์: 1) &21
(การกระทำที่สอง: อ่าน; ไฟล์: 1);true
/false
สำหรับโหมดการล็อก &['C','A']
(การกระทำ: สร้างไฟล์: A) &['D','B']
(การกระทำ: ลบ; ไฟล์: B); เป็นต้น
ตัวอย่างผลลัพธ์:null
/true
/false
(null = ถูกต้อง; จริง = ข้อผิดพลาด; เท็จ = ปัญหา);-1
/0
/1
(-1 = ข้อผิดพลาด 0 = ปัญหา 1 = ถูกต้อง); อย่างไรก็ตามเอาต์พุตที่เป็นไปได้ทั้งสามนั้นต้องไม่ซ้ำกันและแตกต่างสำหรับทั้งสามประเภทเอาต์พุต - สิ่งที่เรียกว่าไฟล์นั้นไม่เกี่ยวข้องซึ่งสามารถดูได้จากตัวอย่างอินพุตด้านบน ดังนั้นอย่าลังเลที่จะใช้ชื่อไฟล์ประเภทใดก็ได้ในคำตอบของคุณซึ่งประกอบด้วยตัวอักษร (ASCII) เดียวหรือตัวเลข อย่างไรก็ตามต้องสอดคล้องกันในทุกกรณีทดสอบของคุณดังนั้นคุณจึงไม่สามารถใช้
A
/B
ในกรณีทดสอบหนึ่งและ1
/2
ในอีกกรณีหนึ่ง - การกระทำสี่อย่างสำหรับ CRUD นั้นจะต้องเป็นค่าที่ไม่ซ้ำใครและสอดคล้องกันเช่นกัน ดังนั้นคุณไม่สามารถใช้
'D'
/'C'
ในกรณีทดสอบหนึ่งกรณีและ4
/1
ในกรณีทดสอบอื่น - คุณสามารถสันนิษฐานได้ว่าไฟล์ที่ผู้ใช้เลือกนั้นมีอยู่เสมอเมื่อพวกเขาต้องการอ่านอัปเดตหรือลบ
กฎทั่วไป:
- นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ ' - กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O ที่เป็นค่าเริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีพร้อมพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
- ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
- หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
- นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ
กรณีทดสอบที่เป็นไปได้ทั้งหมด (ซึ่งการดำเนินการสามารถเป็นได้ทั้งในคำสั่งซื้อ† ):
† : คุณควรสนับสนุนรูปแบบการทดสอบด้านล่าง (สูงสุดถึงสี่) ด้านล่าง ดังนั้นหากรัฐกรณีทดสอบกรณีaction1: Create file A; action2: Update file B
ทดสอบนั้นควรเก็บผลลัพธ์เดียวกันสำหรับaction1: Create file B; action2: Update file A
; action1: Update file B; action2: Create file A
; action1: Update file A; action2: Create file B
และ
Valid use-cases:
locking mode: either; action1: Create file A; action2: Create file B
locking mode: either; action1: Create file A; action2: Read file B
locking mode: either; action1: Create file A; action2: Update file B
locking mode: either; action1: Create file A; action2: Delete file B
locking mode: either; action1: Read file A; action2: Read file A
locking mode: either; action1: Read file A; action2: Read file B
locking mode: either; action1: Read file A; action2: Update file B
locking mode: either; action1: Read file A; action2: Delete file B
locking mode: either; action1: Update file A; action2: Update file B
locking mode: either; action1: Update file A; action2: Delete file B
locking mode: either; action1: Delete file A; action2: Delete file B
Error use-cases:
locking mode: either; action1: Create file A; action2: Create file A
locking mode: either; action1: Create file A; action2: Read file A
locking mode: either; action1: Create file A; action2: Update file A
locking mode: either; action1: Create file A; action2: Delete file A
locking mode: either; action1: Read file A; action2: Delete file A
locking mode: on; action1: Update file A; action2: Update file A
locking mode: either; action1: Update file A; action2: Delete file A
Problem use-cases:
locking mode: either; action1: Read file A; action2: Update file A
locking mode: off; action1: Update file A; action2: Update file A
locking mode: either; action1: Delete file A; action2: Delete file A
B/B
กรณีในการนับของฉันA/A
ตั้งแต่ผมถือว่าพวกเขาเช่นเดียวกับ นั่นคือสิ่งที่แตกต่างมาจาก แต่ผมคิดว่าความคิดที่ไม่ถูกต้องคือถ้าคุณมีค่าเฉพาะสำหรับไฟล์ ..