이 문제는 우리 모드의 영혼 들어하는 것입니다 알렉스 A. 일반적으로, 잘못을 .
기본 논리와 수학, 특히 수학적 동등성에 대한 도움이 필요한 Alex라는 친구가 있다고 가정합니다 .
그는 [variable] = [variable]
a [variable]
가 항상 단일 대문자 A에서 Z (소문자가 아닌 숫자가 아닌 다른 형식) 인 형식의 방정식 목록을 제공합니다 . 이라고 만 표시된 단일 행을 제외하고 목록에 한 행에 하나의 방정식이 있습니다 therefore
.
위의 모든 방정식 therefore
은 전제 이며 사실입니다. 아래의 모든 방정식 therefore
은 확인되지 않은 제안, Alex가 구내에서 추론하려고한다는 사실이며, 사실 일 수도 있고 아닐 수도 있습니다.
예를 들어,이 방정식 목록에서 단일 결론 제안 A = C
은 사실입니다.
A = B
B = C
therefore
A = C
이 경우 알렉스에게 당신의 직업 의 모든 그의 명제는 논리적으로 주어진 전제에서 수행합니다. 즉, Alex가 자신의 결론에서 틀렸거나 옳은지 알 필요가 있습니다.
설명 된대로 일련의 방정식 목록을 취하는 프로그램 / 함수를 작성하고 인쇄 / 반환
Alex is right
모든 결론이 구내에서 논리적으로 따르고 그렇지 않으면 출력
Alex is wrong
구내에서 논리적으로 결론을 따르지 않는 경우.
바이트 단위의 가장 짧은 코드가 이깁니다.
다음과 같은 경우에주의하십시오.
-
변수는 항상 자신과 같습니다. 예 :
B = A therefore A = A X = X
결과
Alex is right
. -
관계가 알려지지 않은 변수는 동일하다고 가정 할 수 없습니다. 예 :
P = Q therefore E = R
결과
Alex is wrong
. -
therefore
그 이후에 방정식이 없으면 결론은 명백하게 사실 입니다. 예 :D = C therefore
과
therefore
둘 다 결과
Alex is right
. -
이전에 방정식이 없으면
therefore
자기 평등 만 유추 할 수 있습니다. 예 :therefore R = R
결과는
Alex is right
되지만therefore R = W
결과
Alex is wrong
.
더 많은 예
Alex가 잘못된 경우 : (빈 줄로 구분)
A = B
C = D
therefore
A = C
A = L
E = X
A = I
S = W
R = O
N = G
therefore
G = N
L = I
R = O
S = A
X = X
X = E
D = K
D = Q
L = P
O = L
M = O
therefore
K = L
A = B
therefore
B = C
Z = A
S = S
therefore
A = Z
A = A
S = A
A = S
Z = A
Z = A
K = L
K = X
therefore
X = P
L = X
L = P
therefore
A = B
B = C
A = C
therefore
A = A
B = B
C = C
D = D
E = E
F = F
G = G
H = H
I = I
J = J
K = K
T = I
L = L
M = M
N = N
O = O
P = P
Q = Q
R = R
S = S
T = T
U = U
V = V
W = W
X = X
Y = Y
Z = Z
A = B
B = C
C = D
D = E
E = F
F = G
G = H
H = I
I = J
J = K
K = L
L = M
M = N
N = O
O = P
P = O
Q = R
R = S
S = T
T = U
U = V
V = W
W = X
X = Y
Y = Z
therefore
A = Z
therefore
C = D
T = Y
A = Z
P = Q
therefore
E = R
therefore
R = W
알렉스는 올바른 경우입니다.
H = J
therefore
J = H
K = L
K = X
therefore
L = X
C = B
B = A
therefore
A = B
K = L
K = X
K = P
therefore
L = X
L = P
X = P
A = Y
Y = Q
Q = O
therefore
O = Y
O = A
C = C
therefore
C = C
A = B
B = A
therefore
A = B
B = A
A = B
B = C
C = D
therefore
A = A
A = B
A = C
A = D
B = A
B = B
B = C
B = D
C = A
C = B
C = C
C = D
D = A
D = B
D = C
D = D
therefore
A = A
B = B
C = C
D = D
E = E
F = F
G = G
H = H
I = I
J = J
K = K
L = L
M = M
N = N
O = O
P = P
Q = Q
R = R
S = S
T = T
U = U
V = V
W = W
X = X
Y = Y
Z = Z
D = I
F = H
J = M
therefore
M = J
D = I
H = F
A = B
B = C
C = D
D = E
E = F
F = G
G = H
H = I
I = J
J = K
K = L
L = M
M = N
N = O
O = P
P = Q
Q = R
R = S
S = T
T = U
U = V
V = W
W = X
X = Y
Y = Z
therefore
Z = A
F = R
G = I
W = L
A = B
B = C
therefore
A = C
B = A
therefore
A = A
X = X
P = P
C = G
M = C
therefore
D = C
therefore
therefore
therefore
R = R
답변
CJam, 49
"Alex is "qN%S{f{)er}(_el-}h;{)#},"wrong""right"?
histocrat의 Ruby 솔루션에서 영감을 얻었습니다.
jimmy23013 덕분에 3 바이트가 없어지면 온라인으로 사용해보십시오.
🙂
설명:
각 전제에 대해 프로그램은 나머지 텍스트에서 첫 번째 변수를 두 번째 변수로 바꿉니다. 그런 다음 변수가 다른 결론이 있는지 확인합니다.
"Alex is " first push the part we know
qN% read the input and split into lines
S push a space (initial no-op replacement string, see below)
{…}h do-while
f{…} for each line and the replacement string
) take out the last character
er replace the remaining character(s) with that character
( afterwards, take out the first line
_el duplicate and convert to lowercase
- remove all the resulting characters from the line
this removes all lowercase letters and non-letters
"X = Y" becomes "XY" (new replacement string)
and "therefore" becomes "" (ending the loop)
this is the loop condition and is left on the stack every time
; after the loop, pop the empty string (from "therefore")
{…}, filter the remaining (conclusion) lines using the condition block
) take out the last character
# find its index in the remaining string
this is 0 (false) iff the first character is the same as the last
afterwards, we have an array of lines with non-equal variables
"wrong" push "wrong"
"right" push "right"
? choose "wrong" if the array was not empty, else choose "right"
구버전, 85
"Alex is "26,:A;{:i{{_A=_@-}g}%$~}:F;0q"= "-'t/Nf%~\{A\Ft:A;}/1>{F=}%-"right""wrong"?
이것은 공용체 찾기 알고리즘을 사용합니다. 온라인으로 사용해보십시오
답변
루비, 80 76 + 2 = 78
명령 행 플래그 p0
를 사용하여
gsub$1,$2%p=$`[/e/]while~/(.) = (?!\1)(.)/
$_="Alex is #{p ?:wrong: :right}"
설명:
순수한 문자열 조작을 사용합니다. p0
전체 입력을 변수에 단일 문자열로 읽습니다 $_
. 그런 다음 해당 문자열을 정규 표현식과 반복해서 일치시킵니다. /(.) = (?!\1)(.)/
여기서 “X = Y”형식의 모든 문자열을 찾습니다. 여기서 X와 Y는 같은 문자가 아니며 X를 $ 1에, Y를 $ 2에 할당합니다. 이러한 일치가 발견되면 gsub$1,$2
문자열에서 X의 모든 인스턴스를 Y로 바꿉니다. 또한이 일치 항목이 “thefore”이전 또는 이후에 발생했는지 확인합니다.
$`[/e/]
이후에 발생한 경우 정당하지 않은 주장이며 Alex가 잘못되었습니다. 를 사용하여 이러한 발생이 발생했는지 추적합니다 p=
. p
추적 변수로 사용 하면 루프가 한 번도 적중하지 않으면 일이 중단 p
되지 않습니다. 할당되지 않은 경우 nil을 반환하기 때문입니다.
이 게시물을 기준으로 CJam 솔루션은 더 길다. 의심의 여지없이 잠깐의 순간.
편집 : 예, 빨리 결정됩니다. 또한, 설명을 끝내기 위해 p
플래그 와 함께 최종 값 $_
이 실행이 끝날 때 출력되므로 마지막 줄이 출력됩니다.
답변
CJam, 83 75 68 67 64 바이트
1 바이트를 절약 해 준 Dennis에게 감사합니다.
"Alex is "q_elN--N/:$La/~{)-},\{__m*{:&},::^|}5*-"wrong""right"?
테스트 스위트. 테스트 케이스가 퍼머 링크에 비해 너무 길기 때문에 질문에서 간단히 복사하십시오. 온라인 인터프리터에서 1-2 분이 소요됩니다. 이 경우 거의 즉시 완료하고 하나의 테스트 사례를 제외한 모든 문제를 해결하는 것으로 변경 5*
하여 훨씬 빠르게 만들 수 있습니다 2*
.
설명
(약간 구식입니다.)
아이디어는 가능한 평등에 대해 일종의 “홍수 채우기”를 수행 한 다음 결론 목록에서 얻은 모든 평등을 제거하는 것입니다. 플러드 필의 5 단계 이상이 필요하지 않음을 알 수 있습니다. 이는 초기 불평등 그래프의 거리 를 포함 하지만 최대 거리는 25입니다.25 = 32
"Alex is " e# Push the string.
q e# Read the input.
_elN- e# Make a copy, convert to lower case, remove linefeeds. This gives us a string
e# with all the characters we don't want from the input.
- e# Remove them from the input. This leaves two upper-case letters on each line
e# and an empty line between premises and conclusions.
N/ e# Split into lines.
La/ e# Split around the empty line.
~ e# Dump both halves on the stack.
{)-}, e# Remove any "A = A"-type equalities from the conclusions.
\ e# Swap with the premises.
{ e# Extend the premises 5 times...
_Wf% e# Duplicate the premises and reverse each one, because = is symmetric.
| e# Set union with the original premises.
__m* e# Make two copies and get an array of every possible pair of premises.
{:&}, e# Select those which have at least one character in common.
::^ e# For each such pair, take the mutual set difference, i.e. those characters
e# that are in only one of the strings.
| e# Set union with the original premises.
}5*
- e# Remove all the equalities we've obtained from the conclusions. If all
e# conclusions were valid, the result will now be a empty array, which is falsy.
! e# Logical not.
"wrong""right"?
e# Select "wrong" or "right", respectively.
답변
R, 183192 바이트
user2357112가 지적한 제한 사항을 해결하기 위해 답변을 수정했습니다. Alex가 실제로 옳을 때 여전히 전화 할 가능성은 극히 적습니다 (이것은 도전의 맥락을 이해하면 자주 발생하지 않는 것 같습니다 :-). 나는 그가 신경 쓰지 않기를 바랍니다.
i=grep("t",z<-scan(,"",,,"\n"))
cat("Alex is",if(eval(parse(t=c(paste(LETTERS,"=",1:26),sample(rep(head(z,i-1),1e3)),paste(c(TRUE,sub("=","==",tail(z,-i))),collapse="&")))))"right"else"wrong")
나는 이것을 조금 골퍼해야합니다 :
lines = scan(, what = "", sep = "\n")
therefore_idx = grep("therefore", lines)
setup = paste(LETTERS, "=", 1:26)
premises = sample(rep(head(lines, therefore_idx - 1), 1000))
propositions = paste(c(TRUE, sub("=", "==", tail(lines, -therefore_idx))), collapse = "&")
things_to_evaluate = c(setup, premises, propositions)
boolean_result = eval(parse(text = things_to_evaluate))
cat("Alex is", if (boolean_result) "right" else "wrong")
예를 들어 입력이
A = B
B = C
therefore
A = C
B = C
먼저 다음을 평가합니다 setup
.
A = 1
B = 2
...
Z = 26
그런 다음 premises
A = B
B = C
무작위로 1,000 번씩 실행됩니다. 이것은 모든 평등이 전파되도록 (거의 확실하게)하는 것입니다. 마지막으로 다음을 평가합니다 propositions
.
TRUE & A == B & B == C
답변
하스켈, 208 바이트
import Data.Equivalence.Persistent
c l=equate(l!!0)$last l
r=foldr(c)$emptyEquivalence('A','Z')
l#r=equiv r(l!!0)$last l
f x|(h,_:t)<-span((<'t').head)$lines x="Alex is "++if all(#r h)t then"right"else"wrong"
작업을 Data.Equivalence.Persistent
모듈로 오프로드하고 동등성 클래스를 조작하는 기능을 제공합니다. 남은 일은 골프를 치기에는 너무 긴 이름을 가진 입력 및 호출 기능을 파싱하는 것입니다.
사용 예 :
*Main> f "A = B\nB = C\ntherefore\nA = C"
"Alex is right"
*Main> f "A = B\nB = D\ntherefore\nA = C"
"Alex is wrong"
답변
매스 매 티카, 182
f[s_]:="Alex is "<>If[True===And@@Simplify[#2,#1]&@@(StringSplit[s,"\n"]/.{a___,"therefore",b___}:>StringSplit/@{{a},{b}}/.{x_,_,y_}:>Symbol[x<>"$"]==Symbol[y<>"$"]),"right","wrong"]
과제에 따라 문자열 입력에서 작동합니다.
In[]:= f["A = B
B = C
therefore
A = C"]
Out[]= Alex is right
In[]:= f["D = K
D = Q
L = P
O = L
M = O
therefore
K = L"]
Out[]= Alex is wrong
답변
레티 나, 90 바이트
실행하려면 다음 12 줄의 코드를 12 개의 개별 파일에 배치하십시오 (첫 번째 파일 이후 각 파일에 대해 +11 바이트 수). <empty>
빈 파일을 지정합니다. \n
리터럴 개행을 지정합니다. 또는 \n
s를 그대로 유지하고 모든 줄을 단일 파일에 넣고 -s
옵션을 사용하십시오 . 모든 파일이 Windows가 아닌 리터럴 개행을 사용하는지 확인 \r\n
하고 마지막 행 끝에 공백을 기록하십시오.
s+`^(.) = (.)(.*)\1
$1 = $2$3$2
)`^. .+\n
<empty>
^.+|(.) = \1
<empty>
^\n*$
right
^[^r]+
wrong
^
Alex is
작동 원리
첫 번째 대체는 전제 시간이 파일에서 나중에 발생할 때마다 입력의 첫 번째 전제와 일치합니다. 그것은 나중에 발생하는 것을 전제의 rhs로 대체합니다. +
수정은 더 이상 일치하지 않을 때까지 교체가 반복되는 것을 보장한다. 따라서 첫 번째 전제가 A = B
인 A
경우 파일의 모든 후속 s가 s로 변환됩니다 B
.
두 번째 대체는 입력이 완료되었으므로 첫 번째 전제를 입력에서 제거합니다. 그런 다음 )
수정자는 첫 번째 교체로 루프하고 루프를 통과하는 전체 패스에 변경 사항이 없을 때까지 반복됩니다. 이것은 모든 구내가 대체되고 제거되고 입력이로 시작될 때 발생 therefore
합니다.
세 번째 대체는 첫 번째 입력 행 ( therefore
또는) 과 일치하고 A = A
이를 삭제합니다. 모든 제안이 구내에서 지원되는 경우 모든 제안 이이 양식과 일치하므로 남아있는 내용은 개행으로 만 구성되어야합니다. 네 번째 교체는 이것을로 변경합니다 right
. 그렇지 않으면 다섯 번째 교체는 남아있는 모든 항목 ( 삭제 된 r
이후 포함되지 않은 therefore
)을로 변경 wrong
합니다. 마지막으로 마지막 교체가 Alex is
처음에 추가 됩니다.