লিস্প এক্সট্রাকশন মিশন


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

সিজেম, 59

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 ফেরত দেয়।


[1] (caddar (cddddr (caddr l)))খুব সুন্দর হবে


2
আপনি লিস্পের সাথে লিপ্প সম্পর্কে একটি প্রশ্নের উত্তর দিয়েছেন ! এটা লিস্প-সেপশন!
ড্যানTheম্যান

4
@DanTheMan পাতার মর্মর-ception প্রায় কাছাকাছি কি পাতার মর্মর সংজ্ঞায়িত ;-) হয়
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[0]অন্যথায় J[1:]( =J?KhJtJ) দিয়ে থাকি । এবং তারপর আমি প্রতিস্থাপন Gসঙ্গে "(cdr G)"এবং প্রতিস্থাপন , যদি সত্য ( )।daK++XWK"(cdr "\d\aG\)



1

পিএইচপি - 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);}

নিখরচায় সংস্করণটি এখানে:

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)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.