2013-05-08 1 views
-1

특히 Lisp 또는 ML 계열의 기존 프로그래밍 언어는 '두 번째 시작까지 첫 번째'라는 의미에서 목록 차이를 계산하는 라이브러리 함수를 가지고 있습니까? 정확하게라고 - 예를 들어, 문자의 목록과 같은 문자열을 고려, 입력이있는 경우 :목록 차이 함수

abcdef 
def 

그런 다음 출력이

abc 
+2

args가'abcdef' 및'dgf' 인 경우 어떤 출력이 있어야합니까? –

+0

더 많은 예제를 제공해 주실 수 있습니까? – chris

답변

3

코드 공통의 리스프 것 :

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) 
+0

맞아, 그것을 구현하는 좋은 방법이야 - 그게 어떤 표준 이름도없는 것 같아? 'take-up'은 어떨까요? – rwallace

+0

이런 종류의 함수에는 표준 이름이 있습니다 - take-while (술어를 취함). 다른 FP 언어에서 다른 이름을 가질 수도 있습니다. – Ankur

3

이미 받아 들여진 답변이 있지만 Common Lisp의 LDIFF ("목록 차이"의 약자)은 여전히 ​​언급할만한 가치가 있습니다. 목록의 요소가 아닌 목록 구조 (목록이 만들어진 cons 셀)를 기반으로하므로 "빼기"목록은 목록의 일부 꼬리로 같음 일치 셀이어야합니다. 좀 더 구체적이지만 목록 차이를 확실히 계산합니다. takeWhile 이후

CL-USER> (let* ((abcdef '(a b c d e f)) 
       (def (cdddr abcdef))) 
      (ldiff abcdef def)) 
(A B C) 
+0

기호 a, b, c, d, e, f를 인용 할 수 있습니다. 또한 명확하게하기 위해 : 단락 세포는 동일해야합니다. 동일은 '동일'을 의미합니다. –

+0

@RainerJoswig 예, 인용해야합니다. 나는''(a b c d e f)'로 시작하여, SO의 구문 강조가 "일치하지 않는 작은 따옴표"를 좋아하지 않을 때 편집했습니다. 단점 셀에 관해서는 그 대답에 언급되어 있습니다 : "목록의 구조 (즉, 목록으로 만들어진 단점 셀)를 기반으로",하지만 그 명확하게 만들 수 있습니다. –

1

코멘트에 언급과 하스켈은 여기,이 기능을 가지고 당신이 하스켈에서 원하는 결과를 얻을 수있는 방법입니다

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 
+0

내가 잘못 읽은 것 같습니다. 그러나 이것은 "두 번째가 첫 번째 접미사가 될 때까지"걸리는 것처럼 보이지 않습니다. ''abc "'가''abc"'이후에 멈출 것이기 때문에이 구현체는''abcdefgh''가 아니라''abcdefghdef "''abcdefghdef''를'takeWhile (flip notElem"def " ''def ''의? –

+0

@JoshuaTaylor 예, 나는 그것이 바람직한 행동이라고 생각했습니다. 비록 OP를 다시 읽은 후에, 나는 그것에 대해 아마 틀리다는데 동의한다. – chris