Giới thiệu :
Bạn đã từng sử dụng Dropbox với một số người khác và cả hai bạn đã sửa đổi cùng một tệp? Đã bao giờ có một ứng dụng nhiều người dùng với cơ sở dữ liệu quan hệ và hai người đang sửa đổi (hoặc tệ hơn, một người đang xóa và người kia sửa đổi) cùng một đối tượng? Chà, hãy mô phỏng điều đó với thử thách này (sắp xếp).
Vì lợi ích của thử thách này, chúng tôi chỉ có hai người dùng và một hoặc hai tệp có liên quan. Cả hai người dùng đều có các đặc quyền chung đối với CRUD (Tạo, Đọc, Cập nhật và Xóa) tất cả các tệp.
Thử thách:
Đầu vào:
Chúng tôi sẽ có một vài đầu vào (định dạng đầu vào là linh hoạt và bất kỳ định dạng hợp lý nào đều được phép):
1) Chế độ khóa (bật / tắt) : Loại sự khác biệt giữa khóa đồng thời lạc quan và bi quan .
Cả hai người dùng đều được phép CRUD (Tạo, Đọc, Cập nhật và Xóa) mọi thứ, nhưng đôi khi có thể xảy ra lỗi hoặc sự cố. Tùy thuộc vào chế độ khóa, sự cố khi tắt, có thể là lỗi khi bật. Điều này được giải thích dưới đây trong phần đầu ra .
2 & 3) Hai hành động của người dùng . Những hành động này luôn bao gồm hai điều: Người dùng làm gì (Tạo, Đọc, Cập nhật hoặc Xóa) và cho tệp nào.
Đầu ra:
Chúng tôi sẽ có ba đầu ra có thể:
- Hợp lệ : Cả hai hành động của cả hai người dùng đều có thể được thực hiện đồng thời mà không có sự cố nào xảy ra.
- Lỗi : Cả hai hành động của cả hai người dùng đều không thể được thực hiện đồng thời và gây ra lỗi cho một trong những người dùng (người dùng không liên quan đến thử thách này). Điều này có thể xảy ra khi:
- một người dùng Đọc hoặc Cập nhật một tệp mà người dùng khác Xóa;
- cả hai người dùng Cập nhật cùng một tệp với chế độ khóa được bật;
- một người dùng Tạo một tệp mà người dùng khác Đọc / Cập nhật / Xóa (điều này có nghĩa là tệp đã tồn tại, vì vậy nó không thể được tạo);
- cả hai người dùng Tạo cùng một tệp.
- Vấn đề : Cả hai hành động của cả hai người dùng có thể được thực hiện đồng thời, nhưng có thể gây ra sự cố không mong muốn. Điều này có thể xảy ra khi:
- cả hai người dùng Cập nhật tệp khi tắt chế độ khóa;
- một người dùng Cập nhật một tệp mà người dùng khác đọc;
- cả hai người dùng Xóa cùng một tệp (thực tế điều này sẽ gây ra lỗi cho người dùng thứ hai, nhưng vì nó vẫn sẽ bị xóa như người dùng muốn, nên nó sẽ là một vấn đề thay vì lỗi vì thách thức này)
Quy tắc thử thách:
- Tất cả đầu vào và đầu ra đều linh hoạt và mọi người nên nói rõ câu nào họ đã sử dụng trong câu trả lời của mình!
Ví dụ đầu vào:0
/1
cho chế độ khóa &31
(hành động thứ ba: Cập nhật; tệp: 1) &21
(hành động thứ hai: Đọc; tệp: 1);true
/false
cho chế độ khóa &['C','A']
(hành động: Tạo; tệp: A) &['D','B']
(hành động: Xóa; tệp: B); v.v ... Kết
quả đầu ra:null
/true
/false
(null = hợp lệ; true = error; false = vấn đề);-1
/0
/1
(-1 = lỗi; 0 = vấn đề; 1 = hợp lệ); v.v ... Tuy nhiên, ba đầu ra có thể phải là duy nhất và khác biệt cho ba loại đầu ra. - Những gì các tệp được gọi là không liên quan, cũng có thể được nhìn thấy với các ví dụ đầu vào ở trên. Vì vậy, vui lòng sử dụng bất kỳ loại tên tệp nào trong câu trả lời của bạn bao gồm một chữ cái hoặc chữ số (ASCII). Tuy nhiên, chúng phải nhất quán trong tất cả các trường hợp thử nghiệm của bạn, vì vậy bạn không thể sử dụng
A
/B
trong một trường hợp thử nghiệm và1
/2
trong một trường hợp thử nghiệm khác. - Bốn hành động cho CRUD cũng phải là các giá trị duy nhất và nhất quán. Vì vậy, bạn không thể sử dụng
'D'
/'C'
trong một trường hợp thử nghiệm, và sau đó4
/1
trong một trường hợp thử nghiệm khác. - Bạn có thể giả định rằng tệp được người dùng chọn luôn tồn tại khi họ muốn Đọc, Cập nhật hoặc Xóa tệp.
Quy tắc chung:
- Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte thắng.
Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'. - Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
- Lỗ hổng mặc định bị cấm.
- Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
- Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.
Tất cả các trường hợp thử nghiệm có thể (trong đó các hành động có thể theo thứ tự đầu vào † ):
† : Bạn nên hỗ trợ tất cả (lên đến bốn) biến thể trong các trường hợp thử nghiệm dưới đây. Vì vậy, nếu một trường hợp thử nghiệm nêu rõ action1: Create file A; action2: Update file B
, trường hợp thử nghiệm đó cũng sẽ giữ kết quả tương tự cho action1: Create file B; action2: Update file A
; action1: Update file B; action2: Create file A
; và 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
trường hợp trong tính của tôi , vì tôi coi chúng tương tự như A/A
. Đó là nơi mà sự khác biệt đến từ. Nhưng tôi đoán rằng suy nghĩ đó là không chính xác nếu bạn có một giá trị cụ thể cho các tệp ..