특히 Lisp 또는 ML 계열의 기존 프로그래밍 언어는 '두 번째 시작까지 첫 번째'라는 의미에서 목록 차이를 계산하는 라이브러리 함수를 가지고 있습니까? 정확하게라고 - 예를 들어, 문자의 목록과 같은 문자열을 고려, 입력이있는 경우 :목록 차이 함수
abcdef
def
그런 다음 출력이
abc
특히 Lisp 또는 ML 계열의 기존 프로그래밍 언어는 '두 번째 시작까지 첫 번째'라는 의미에서 목록 차이를 계산하는 라이브러리 함수를 가지고 있습니까? 정확하게라고 - 예를 들어, 문자의 목록과 같은 문자열을 고려, 입력이있는 경우 :목록 차이 함수
abcdef
def
그런 다음 출력이
abc
코드 공통의 리스프 것 :
CL-USER 1 > (defun fusos (s1 s2)
(let ((pos (search s2 s1)))
(when pos (subseq s1 0 pos))))
FUSOS
CL-USER 2 > (fusos '(a b c d e f) '(d e f))
(A B C)
이미 받아 들여진 답변이 있지만 Common Lisp의 LDIFF
("목록 차이"의 약자)은 여전히 언급할만한 가치가 있습니다. 목록의 요소가 아닌 목록 구조 (목록이 만들어진 cons 셀)를 기반으로하므로 "빼기"목록은 목록의 일부 꼬리로 같음 일치 셀이어야합니다. 좀 더 구체적이지만 목록 차이를 확실히 계산합니다. takeWhile
이후
CL-USER> (let* ((abcdef '(a b c d e f))
(def (cdddr abcdef)))
(ldiff abcdef def))
(A B C)
기호 a, b, c, d, e, f를 인용 할 수 있습니다. 또한 명확하게하기 위해 : 단락 세포는 동일해야합니다. 동일은 '동일'을 의미합니다. –
@RainerJoswig 예, 인용해야합니다. 나는''(a b c d e f)'로 시작하여, SO의 구문 강조가 "일치하지 않는 작은 따옴표"를 좋아하지 않을 때 편집했습니다. 단점 셀에 관해서는 그 대답에 언급되어 있습니다 : "목록의 구조 (즉, 목록으로 만들어진 단점 셀)를 기반으로",하지만 그 명확하게 만들 수 있습니다. –
코멘트에 언급과 하스켈은 여기,이 기능을 가지고 당신이 하스켈에서 원하는 결과를 얻을 수있는 방법입니다
takeWhile (flip notElem ys) xs
귀하의 예제가 될 것
takeWhile (flip notElem "def") "abcdef"
즉, 목록 ys
에 포함되어 있지 않은 한 목록 xs
에서 요소를 가져옵니다. ys
(또는 xs
의 끝에 도달)에 포함 된 요소를 찾으면 즉시 중지합니다.
표준 ML 그것은 다음과 같습니다
fun take_while p [] = []
| take_while p (x::xs) =
if p x then x :: take_while p xs
else []
이 편집 : 위, 나는 사양은 우리의 (임의)의 요소를 발견하면 우리는 즉시, 첫 번째 목록에서 중지 있다는 것을 가정 두 번째 목록. 따라서 takeWhile
을 사용하십시오. 그러나 OP에서 실제 사양이 무엇인지는 분명하지 않습니다. 인 경우 입력 (첫 번째 목록)에서 기존 접미사 (두 번째 목록)를 제거하면 솔루션이 물론 다릅니다. 하스켈에서 효율성을 고려하지 않고 다음과 같이 할 수 있습니다 :
removeSuffix [] ys = []
removeSuffix [email protected](z:zs) ys
| xs == ys = []
| otherwise = z : removeSuffix zs ys
내가 잘못 읽은 것 같습니다. 그러나 이것은 "두 번째가 첫 번째 접미사가 될 때까지"걸리는 것처럼 보이지 않습니다. ''abc "'가''abc"'이후에 멈출 것이기 때문에이 구현체는''abcdefgh''가 아니라''abcdefghdef "''abcdefghdef''를'takeWhile (flip notElem"def " ''def ''의? –
@JoshuaTaylor 예, 나는 그것이 바람직한 행동이라고 생각했습니다. 비록 OP를 다시 읽은 후에, 나는 그것에 대해 아마 틀리다는데 동의한다. – chris
args가'abcdef' 및'dgf' 인 경우 어떤 출력이 있어야합니까? –
더 많은 예제를 제공해 주실 수 있습니까? – chris