ผู้ใช้หลายคน CRUD: ถูกต้องปัญหาหรือข้อผิดพลาด?


13

บทนำ :

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

เพื่อความท้าทายนี้เรามีเพียงผู้ใช้สองคนและไฟล์ที่เกี่ยวข้องหนึ่งหรือสองไฟล์ ผู้ใช้ทั้งสองมีสิทธิ์ทั่วไปในการCRUD (สร้าง, อ่าน, อัพเดตและลบ)ไฟล์ทั้งหมด

ท้าทาย:

การป้อนข้อมูล:

เราจะมีอินพุตเล็กน้อย (รูปแบบอินพุตมีความยืดหยุ่นและอนุญาตรูปแบบที่เหมาะสม):

1) โหมดล็อค (เปิด / ปิด) : Kinda ความแตกต่างระหว่างในแง่ดีและแง่ร้ายล็อคเห็นพ้องด้วย
ผู้ใช้ทั้งสองคนได้รับอนุญาตให้ CRUD (สร้างอ่านอัปเดตและลบ) ทุกอย่าง แต่บางครั้งข้อผิดพลาดหรือปัญหาอาจเกิดขึ้นได้ ปัญหาขึ้นอยู่กับโหมดล็อคเมื่อปิดอาจเป็นข้อผิดพลาดเมื่อเปิด นี่คือคำอธิบายด้านล่างในส่วนเอาท์พุท

2 & 3) การกระทำของผู้ใช้สองรายการ การกระทำเหล่านี้ประกอบด้วยสองสิ่งเสมอ: สิ่งที่ผู้ใช้ทำ (สร้างอ่านอัปเดตหรือลบ) และไฟล์ใด

เอาท์พุท:

เราจะมีเอาต์พุตที่เป็นไปได้สามแบบ:

  1. ใช้ได้ : การกระทำทั้งสองอย่างของผู้ใช้ทั้งสองสามารถทำได้พร้อมกันโดยไม่มีปัญหาใด ๆ เกิดขึ้น
  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ในกรณีทดสอบอื่น
  • คุณสามารถสันนิษฐานได้ว่าไฟล์ที่ผู้ใช้เลือกนั้นมีอยู่เสมอเมื่อพวกเขาต้องการอ่านอัปเดตหรือลบ

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ 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

2
ฉันรู้สึกเหมือนว่าจะมีวิธีแก้ปัญหา 1 ไบต์ถ้าฉันสามารถหาวิธีอินพุต / เอาท์พุตที่ถูกต้อง (อาจเป็น bit bit masking)
ข้อมูลหมดอายุ

2
@ExpiredData แก้ไขบางส่วนของผลลัพธ์ที่เป็นไปได้ว่าพวกเขาจะต้องสอดคล้อง แต่ไม่จำเป็นต้องซ้ำกัน และยังต้องป้อนข้อมูลให้สอดคล้องกัน
Kevin Cruijssen

1
@Arnauld อาผมได้รับการยกเว้นทุกB/BกรณีในการนับของฉันA/Aตั้งแต่ผมถือว่าพวกเขาเช่นเดียวกับ นั่นคือสิ่งที่แตกต่างมาจาก แต่ผมคิดว่าความคิดที่ไม่ถูกต้องคือถ้าคุณมีค่าเฉพาะสำหรับไฟล์ ..
เควิน Cruijssen

คำตอบ:


8

JavaScript (ES6), 36 ไบต์

ไม่มีตารางการค้นหา

(m,a,f,A,F)=>f-F?2:a^A?a*A&8:a&4?m:a

ลองออนไลน์!

I / O

  • ม.08
  • aA0248
  • F
  • 028

อย่างไร?

2

หากไฟล์เหมือนกันเราต้องคืนค่า:

  • 2
  • 8
  • ม.
  • 0

4×4

a ^ AaA? ? a * A & 8 : & 4อัปเดต? ? ม.:a

RยูD024800000R20280ยู408ม.0D80008


JavaScript (ES6),  46 45  40 ไบต์

ด้วยตารางการค้นหา

(m,a,f,A,F)=>f-F?0:[m,1,1,0][a*2+A*9&23]

ลองออนไลน์!

I / O

  • 1
  • 0123
  • ไฟล์: จำนวนเต็มใด ๆ
  • 01

4

เรติน่า 0.8.2 , 53 ไบต์

^(.)(?!\1).+|..RR.
V
..DD.
P
..UUL
E
.+[CD].+
E
..+
P

ลองออนไลน์! ลิงค์มีชุดทดสอบ ใช้อินพุตเป็นสตริง 5 อักขระอักขระสองตัวที่แสดงชื่อไฟล์จากนั้นอักขระสองตัวจากCRUDนั้นLหรือU(ล็อค / ปลดล็อก) และเอาต์พุตหนึ่งในVPE(ใช้ได้ / ปัญหา / ข้อผิดพลาด) คำอธิบาย:

^(.)(?!\1).+|..RR.
V

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

..DD.
P

การลบสองรายการเป็นปัญหาเสมอ

..UUL
E

การอัพเดตที่ถูกล็อคสองรายการเป็นข้อผิดพลาด

.+[CD].+
E

การสร้างหรือลบอื่น ๆ เป็นข้อผิดพลาด

..+
P

ทุกสิ่งทุกอย่างเป็นปัญหา


3

ระดับเสียงคู่ , 96 ไบต์

@(a,b,c)[a(1)!=b(1)|a(2)+b(2)==20,mod((m=a+b+c)(2),10010)<1|mod(m(2),1020000)<1|mod(m(2),200)<1]

ลองออนไลน์!

จะสั้นลงได้อย่างแน่นอน แต่ฉันไม่มีเวลาทำเช่นนั้น

File 1 = 0
File 2 = 1
Read = 10
Delete = 100
Create = 1000 
Update = 10000
Lock on = 100000
Lock off = 1000000

Valid Values: 
[1 0] 

Problem Values: 
[0 1]


Invalid Values: 
[0 0]

อินพุตเป็น = [file, action], b = [file2, action2], c = lock

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