다중 사용자 CRUD : 유효, 문제 또는 오류?


13

소개 :

다른 사람들과 Dropbox를 사용해 본 적이 있고 둘 다 동일한 파일을 수정 했습니까? 관계형 데이터베이스를 사용하는 다중 사용자 응용 프로그램을 가지고 있고 두 사람이 같은 개체를 수정하거나 더 나쁜 것은 수정하고 있습니까? 글쎄,이 도전 (정렬)으로 그것을 시뮬레이션 해 봅시다.

이 문제를 해결하기 위해 두 명의 사용자와 하나 또는 두 개의 관련 파일 만 있습니다. 두 사용자 모두 일반적으로 모든 파일 을 CRUD (만들기, 읽기, 업데이트 및 삭제) 할 수 있습니다.

도전:

입력:

몇 가지 입력이 가능합니다 (입력 형식은 유연하고 모든 합리적인 형식이 허용됩니다).

1) 잠금 모드 (켜기 / 끄기) : 낙관적 잠금과 비관적 동시 잠금 간의 차이점을 해결 합니다 .
두 사용자 모두 모든 것을 CRUD (만들기, 읽기, 업데이트 및 삭제) 할 수 있지만 때때로 오류나 문제가 발생할 수 있습니다. 잠금 모드에 따라 전원을 끌 때 문제가 발생하면 전원을 켤 때 오류가 발생할 수 있습니다. 이에 대해서는 아래 출력 섹션 에서 설명합니다 .

2 & 3) 두 가지 사용자 동작 . 이러한 작업은 항상 사용자가 수행하는 작업 (만들기, 읽기, 업데이트 또는 삭제)과 파일에 대한 두 가지로 구성됩니다.

산출:

세 가지 가능한 출력이 있습니다 :

  1. 유효한 : 문제없이 두 사용자의 두 작업을 동시에 수행 할 수 있습니다.
  2. 오류 : 두 사용자의 두 작업을 동시에 수행 할 수 없으며 사용자 중 한 명 (이 사용자는이 문제와 관련이 없음)에 오류가 발생합니다. 다음과 같은 경우에 발생할 수 있습니다.
    • 한 사용자가 다른 사용자가 삭제 한 파일을 읽거나 업데이트합니다.
    • 두 사용자 모두 잠금 모드가 설정된 동일한 파일을 업데이트합니다.
    • 사용자 다른 사용자가 읽기 / 업데이트 / 삭제하는 파일을 작성합니다 (이는 파일이 이미 존재하므로 작성할 수 없음을 나타냄).
    • 두 사용자 모두 같은 파일을 만듭니다.
  3. 문제 : 두 사용자의 두 작업을 동시에 수행 할 수 있지만 예기치 않은 문제가 발생할 수 있습니다. 다음과 같은 경우에 발생할 수 있습니다.
    • 두 사용자 잠금 모드가 해제되면 파일을 업데이트합니다.
    • 한 명의 사용자가 다른 사용자가 읽는 파일을 업데이트합니다.
    • 두 사용자 모두 같은 파일을 삭제합니다 (실제로이 경우 두 번째 사용자에게는 오류가 발생하지만 사용자가 원하는대로 여전히 삭제되므로이 문제로 인해 오류 대신 문제가됩니다)

도전 규칙 :

  • 모든 입력 및 출력은 유연 하며 모든 사람은 자신의 답변에 사용한 것을 명시해야합니다!
    입력 예 : 0/ 1잠금 모드의 경우 & 31(세 번째 작업 : 업데이트; 파일 : 1) & 21(두 번째 작업 : 읽기; 파일 : 1); true/ false잠금 모드의 경우 & ['C','A'](조치 : 작성; 파일 : A) & ['D','B'](조치 : 삭제; 파일 : B); 등.
    예제 출력 : null/ true/ false(null = 유효한; true = 오류; false = 문제); -1/ 0/ 1(-1 = 오류; 0 = 문제; 1 = 유효); 그러나 세 가지 가능한 출력은 세 가지 출력 유형에 대해 고유하고 고유 해야합니다.
  • 파일이 호출되는 것은 관련이 없으며 위의 입력 예제에서도 볼 수 있습니다. 따라서 단일 (ASCII) 문자 또는 숫자로 구성된 답에 파일 형식의 파일을 자유롭게 사용하십시오. 그들은 당신이 사용할 수 있도록, 그러나 모든 테스트 케이스에서 일치해야합니까 A/ B하나의 테스트 케이스 및 1/ 2또 다른에.
  • CRUD에 대한 4 가지 조치는 고유하고 일관된 값이어야합니다. 따라서 한 테스트 사례에서 / 를 사용한 다음 다른 테스트 사례에서 'D'/ 'C'를 사용할 수 없습니다 .41
  • 사용자가 선택한 파일이 읽기, 업데이트 또는 삭제를 원할 때 항상 존재한다고 가정 할 수 있습니다.

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙 을 사용 하여 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 (예 : TIO ) 링크를 추가하십시오 .
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

가능한 모든 테스트 사례 (작업이 입력 순서 중 하나 일 수있는 경우 ) :

: 아래 테스트 사례의 모든 (최대 4 개) 변형을 지원해야합니다. 따라서 테스트 케이스에 상태가 표시 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 바이트 솔루션이있을 것 같습니다.
Expired Data

2
@ExpiredData 가능한 출력의 일부를 변경하여 일관성이 있어야하지만 반드시 고유하지는 않아야합니다. 또한 입력이 일관되어야합니다.
케빈 Cruijssen

1
@Arnauld 아, 나는 모든 제외 B/B내 계산에 사건을 내가 아니라 그들과 유사한 것으로 간주하기 때문에, A/A. 그 차이가 나옵니다. 그러나 파일에 대한 특정 값이 있으면 생각이 잘못되었다고 생각합니다.
Kevin Cruijssen

답변:


8

자바 스크립트 (ES6), 36 바이트

조회 테이블없이

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

온라인으로 사용해보십시오!

I / O

  • m08
  • aA0248
  • fF
  • 028

어떻게?

파일이 다르면 모든 작업이 안전하고 반환됩니다. 2

파일이 동일하면 다음을 반환해야합니다.

  • 2두 번의 읽기 작업 이있는 경우 (유효)
  • 8 업데이트 와 하나의 읽기
  • m두 번의 업데이트 작업 이있는 경우 (문제 또는 오류)
  • 0다른 모든 것에는 (오류)

4×4

a ^ AaA? ? a * A & 8 : a & 4update? ? m:a

CRUD0248C00000R20280U408m0D80008


자바 스크립트 (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 자 문자열로, 파일 이름을 나타내는 2 자,에서 2 자 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]

a = [file, action], b = [file2, action2], c = 잠금으로 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.