लिस्प एक्सट्रैक्शन मिशन


19

लिस्प शैली की भाषाओं में, एक सूची को आमतौर पर इस तरह परिभाषित किया जाता है:

(list 1 2 3)

इस चुनौती के प्रयोजनों के लिए, सभी सूचियों में केवल सकारात्मक पूर्णांक या अन्य सूचियाँ होंगी। हम listशुरुआत में कीवर्ड भी छोड़ देंगे, इसलिए सूची अब इस तरह दिखाई देगी:

(1 2 3)

हम सूची का पहला तत्व प्राप्त करके उपयोग कर सकते हैं car। उदाहरण के लिए:

(car (1 2 3))
==> 1

और हम पहले तत्व के साथ मूल सूची प्राप्त कर सकते हैं cdr:

(cdr (1 2 3))
==> (2 3)

महत्वपूर्ण: cdrहमेशा एक सूची लौटाएगा, भले ही उस सूची में एक ही तत्व हो:

(cdr (1 2))
==> (2)
(car (cdr (1 2)))
==> 2

सूची अन्य सूचियों के अंदर भी हो सकती है:

(cdr (1 2 3 (4 5 6)))
==> (2 3 (4 5 6))

एक प्रोग्राम लिखें जो कोड का उपयोग करता है carऔर cdrएक सूची में एक निश्चित पूर्णांक वापस करने के लिए। जिस कोड में आपका प्रोग्राम वापस आता है, आप मान सकते हैं कि सूची में संग्रहीत है l, लक्ष्य पूर्णांक lकहीं पर है, और यह कि सभी पूर्णांक अद्वितीय हैं।

उदाहरण:

इनपुट: (6 1 3) 3

आउटपुट: (car (cdr (cdr l)))

इनपुट: (4 5 (1 2 (7) 9 (10 8 14))) 8

आउटपुट: (car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))

इनपुट: (1 12 1992) 1

आउटपुट: (car l)


क्या हम पूर्णांक के साथ इनपुट पहले और सूची दूसरे पर ले सकते हैं?
मार्टिन एंडर

@ मार्टिनबटनर ज़रूर।
अनुपम

(1 2 3) 16हम किस बारे में लौटेंगे ()?
coredump

@ बोरियत अच्छा सवाल है। आप मान सकते हैं कि लक्ष्य पूर्णांक हमेशा अभिव्यक्ति में होगा, इसलिए ऐसा मामला (1 2 3) 16कभी नहीं दिखाई देगा।
अनुपम

क्या हम दो इनपुट प्राप्त कर सकते हैं, एक सूची के लिए और एक पूर्णांक के लिए?
ब्लैकहोल सेप

जवाबों:


1

सीजेम, ५ ९

q"()""[]"er~{:AL>{0jA1<e_-_A(?j'l/"(car l)"@{2'dt}&*}"l"?}j

इसे ऑनलाइन आज़माएं

स्पष्टीकरण:

q                 read the input
"()""[]"er        replace parentheses with square brackets
~                 evaluate the string, pushing an array and a number
{…}j              calculate with memoized recursion using the array as the argument
                   and the number as the memozied value for argument 0
  :A              store the argument in A
  L>              practically, check if A is an array
                   if A is a (non-empty) array, compare with an empty array
                   (result 1, true)
                   if A is a number, slice the empty array from that position
                   (result [], false)
    {…}           if A is an array
      0j          get the memoized value for 0 (the number to search)
      A1<         slice A keeping only its first element
      e_          flatten array
      -           set difference - true iff the number was not in the array
      _           duplicate the result (this is the car/cdr indicator)
      A(          uncons A from left, resulting in the "cdr" followed by the "car"
      ?           choose the cdr if the number was not in the flattened first item,
                   else choose the car
      j           call the block recursively with the chosen value as the argument
      'l/         split the result around the 'l' character
      "(car l)"   push this string
      @           bring up the car/cdr indicator
      {…}&        if true (indicating cdr)
        2'dt      set the character in position 2 to 'd'
      *           join the split pieces using the resulting string as a separator
    "l"           else (if A is not an array) just push "l"
                   (we know that when we get to a number, it is the right number)
    ?             end if

10

आम लिस्प, 99

निम्नलिखित 99 बाइट्स समाधान अच्छी योजना के उत्तर का एक सीएल संस्करण है ।

(defun g(l n &optional(o'l))(if(eql n l)o(and(consp l)(or(g(car l)n`(car,o))(g(cdr l)n`(cdr,o))))))

मैं मूल रूप से कर उपयोग करने की कोशिश की positionऔर position-ifहै, लेकिन यह पता चला के रूप में मैं इसे पसंद किया है | (209 बाइट्स) के रूप में कॉम्पैक्ट नहीं होने के लिए:

(lambda(L x &aux(p'l))(labels((f(S &aux e)(cons(or(position x S)(position-if(lambda(y)(if(consp y)(setf e(f y))))S)(return-from f()))e)))(dolist(o(print(f L))p)(dotimes(i o)(setf p`(cdr,p)))(setf p`(car,p)))))

विस्तारित

(lambda
  (l x &aux (p 'l))
  (labels ((f (s &aux e)
             (cons
              (or (position x s)
                  (position-if
                   (lambda (y)
                     (if (consp y)
                         (setf e (f y))))
                   s)
                  (return-from f nil))
              e)))
    (dolist (o (print (f l)) p)
      (dotimes (i o) (setf p `(cdr ,p)))
      (setf p `(car ,p)))))

उदाहरण

(funcall *fun* '(4 5 (1 2 (7) 9 (10 8 14))) 14)

सूची उद्धृत की गई है, लेकिन यदि आप वास्तव में चाहते हैं, तो मैं एक मैक्रो का उपयोग कर सकता हूं। लौटाया गया मूल्य है [1] :

(CAR (CDR (CDR (CAR (CDR (CDR (CDR (CDR (CAR (CDR (CDR L)))))))))))

परीक्षणों के लिए, मैं एक लैम्बडा फॉर्म उत्पन्न करता lथा जहाँ एक चर था:

(LAMBDA (#:G854) (CAR (CDR (CDR (CAR (CDR (CDR (CDR (CDR (CAR (CDR (CDR #:G854))))))))))))

मूल सूची के साथ इसे कॉल करने पर रिटर्न 14 हो जाता है।


[१] (caddar (cddddr (caddr l)))भी अच्छा होगा


2
आपने लिस्प के साथ लिस्प के बारे में एक सवाल का जवाब दिया ! यह लिस्प-सीमेंट है!
DanTheMan

4
@DanTheMan लिस्प-धारणा काफी क्या लिस्प को परिभाषित करता है ;-) है
coredump

9

रेटिना , 170 142 125 115 114 87 84 83 75 73 70 69 68 67 बाइट्स

हाँ, मेरे पहले प्रयास से 100 से अधिक बाइट्स में से 50% से कम । :)

\b(.+)\b.* \1$
(
^.
l
\(
a
+`a *\)|\d


d
+`(.*[l)])(\w)
(c$2r $1)

किसी एकल फ़ाइल से कोड को चलाने के लिए, का उपयोग करें -s ध्वज का ।

मैं अभी भी आश्वस्त नहीं हूं कि यह इष्टतम है ... मेरे पास अगले कुछ दिनों में बहुत समय नहीं होगा, मैं अंततः स्पष्टीकरण जोड़ दूंगा।


5

पायथ, 62 बाइट्स

JvXz"() ,][")u?qJQG&=J?K}Quu+GHNY<J1)hJtJ++XWK"(cdr "\d\aG\)\l

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

स्पष्टीकरण:

पहला बिट इनपुट स्ट्रिंग में JvXz"() ,][")वर्णों के "() "साथ वर्णों को बदलता है "[],", जो कि पायथन-शैली की सूची के प्रतिनिधित्व में समाप्त होता है। मैं इसका मूल्यांकन करता हूं और इसे स्टोर करता हूंJ

फिर मैं स्ट्रिंग G = "l"को कम कर देता हूं u...\l। मैं आंतरिक फ़ंक्शन को ...बार-बार लागू करता हूं G, जब तक कि Gअब और फिर प्रिंट न होG

आंतरिक फ़ंक्शन निम्न कार्य करता है: यदि Jपहले से इनपुट नंबर के बराबर है, तो संशोधित न करें G( ?qJQG) से। अन्यथा मैं सूची को समतल कर दूंगा J[:1]और जांच करूंगा कि क्या इनपुट नंबर उस सूची में है और इसे चर K( K}Quu+GHNY<J1)) में सहेजें । ध्यान दें कि पायथन में एक समतल ऑपरेटर नहीं है, इसलिए यह काफी कुछ बाइट्स लेता है। अगर Kयह सत्य है, तो मैं J को अपडेट करता हूंJ[0] , अन्यथा J[1:]( =J?KhJtJ)। और फिर मैं की जगह Gके साथ "(cdr G)"और की जगह , अगर सच है ( )।daK++XWK"(cdr "\d\aG\)



1

PHP - 177 बाइट्स

मैंने पठनीयता के लिए कुछ नए समाचार जोड़े हैं:

function f($a,$o,$n){foreach($a as$v){if($n===$v||$s=f($v,$o,$n))return
'(car '.($s?:$o).')';$o="(cdr $o)";}}function l($s,$n){echo f(eval(strtr
("return$s;",'() ','[],')),l,$n);}

यहाँ ungolfed संस्करण है:

function extractPhp($list, $output, $number)
{
    foreach ($list as $value)
    {
        if (is_int($value))
        {
            if ($value === $number) {
                return '(car '. $output .')';
            }
        }
        else
        {
            $subOutput = extractPhp($value, $output, $number);
            if ($subOutput !== null) {
                return '(car '. $subOutput .')';
            }
        }

        $output = '(cdr '. $output .')';
    }
}

function extractLisp($stringList, $number)
{
    $phpCode = 'return '. strtr($stringList, '() ','[],') .';';
    $list = eval($phpCode);
    echo extractPhp($list, 'l', $number);
}

1

हास्केल, 190 188 बाइट्स

l "(4 5 (1 2 (7) 9 (10 8 14)))" 8

का मूल्यांकन करता है

"(car (cdr (car (cdr (cdr (cdr (cdr (car (cdr (cdr l))))))))))"

l(h:s)n=c$i(show n)s""""
i n(h:s)t l|h>'/'&&h<':'=i n s(t++[h])l|t==n='a':l|h=='('=j$'a':l|h==')'=j$tail$dropWhile(=='d')l|0<1=j$'d':l where j=i n s""
c[]="l"
c(h:s)="(c"++h:"r "++c s++")"

1
आप बदल सकते हैं (और एक स्ट्रिंग cमें कार्य कर सकते हैं c:c(h:s)="(c"++h:...
nimi

वाह, नहीं सोचा था कि hएक चार होने के साथ काम करेंगे !
लेफ विलर्ट्स

0

आम लिस्प, 168 155 बाइट्स

कुछ बेवकूफ पुनरावृत्ति की बात है, यह शायद थोड़ा और संघनित हो सकता है:

(lambda(l e)(labels((r(l o)(setf a(car l)d(cdr l)x`(car,o)y`(cdr,o))(if(equal e a)x(if(atom a)(r d y)(if(find e l)(r d y)(if d(r d y)(r a x)))))))(r l'l)))

सुंदर मुद्रित:

(lambda (l e)
  (labels ((r (l o)
             (setf a (car l) d (cdr l)
                   x `(car ,o) y `(cdr ,o))
             (if (equal e a) x
                 (if (atom a)
                     (r d y)
                     (if (find e l)
                         (r d y)
                         (if d
                             (r d y)
                             (r a x)))))))
    (r l 'l)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.