পিরামিড স্কিম কোড উত্পন্ন করুন


32

পিরামিড স্কিম @ کونোরও ব্রায়েন একটি ভাষা বিকাশ করছে । পিরামিড স্কিমে, আপনি যে কোডটি লিখেছেন তা দেখতে এমন দেখাচ্ছে:

      ^         ^
     / \       /3\
    /   \      ---
   /  +  \
  ^-------^
 /9\     /3\
/123\    ---
-----

এখন, এই কোডটিতে দুটি সুস্পষ্ট গুণ রয়েছে: এটি বিশ্লেষণ করা কঠিন এবং এটি লেখা শক্ত। কনর প্রথমটি সমাধান করেছে, তবে সেই দ্বিতীয় সমস্যাটি সমাধান করা আপনার কাজ হবে।


উপরের কোডটি পিরামিডস্কিম ইন্টারপ্রেটার দ্বারা নেস্টেড স্ট্রিং অ্যারেটিতে প্রক্রিয়া করা হবে:

[["+", ["9123", "3"]], "3"]

আপনার টাস্কটি এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হয় যা স্ট্রিং, আউটপুট বা পুনরায় তৈরি পিরামিডস্কেম কোডের নেস্টেড অ্যারে দেয়। আপনি ধরে নিতে পারেন ইনপুট অ্যারে সর্বদা বৈধ থাকবে।

পিরামিড হ'ল একটি সমকোণী ত্রিভুজ। শীর্ষ হয় ^, পক্ষের ঢাল তির্যকভাবে সঙ্গে দূরে /এবং \, এবং নীচে হয় -। নীচের দুটি কোণটি হয় খালি বা অন্য পিরামিডগুলির সূচনা ধারণ করে যা আর্গুমেন্ট। মাঝখানে লাইন ব্রেকগুলি উপেক্ষা করে পিরামিডের নামটি পূর্ণ।

পার্সার কীভাবে কোডটিকে ব্যবহারযোগ্য বিন্যাসে রূপান্তরিত করে তা এখানে। প্রথমত, এটি শীর্ষ স্তরের পিরামিডের জন্য স্ক্যান করে। যদি এটি কোনও যুক্তি না নেয় তবে এটি একটি একক স্ট্রিং সহ এটি উপস্থাপন করে এবং এগিয়ে চলে। অন্যথায়, এটি একটি অ্যারে ["name",[arg1,arg2]]বা হিসাবে উপস্থাপন করে ["name",[arg1]]। আর্গুমেন্টগুলি পিরামিডের নীচে বাম এবং নীচে ডানদিকে পিরামিড যা উপরে বর্ণিত স্ট্রিং বা আরও অ্যারে হতে পারে। আপনি লক্ষ্য করতে পারেন যে এটি কিছুটা লিস্পের সাথে সাদৃশ্যপূর্ণ, এক্ষেত্রে আপনি ভাষাটির নাম যে ভয়াবহ শঙ্কাটিও লক্ষ্য করেছেন। পিরামিডটি সম্পূর্ণরূপে উপস্থাপিত হওয়ার পরে, পার্সারটি পরবর্তী একটিতে চলে যায়।

এটি , সংক্ষিপ্ততম কোডের জয়!

পরীক্ষার কেস: এগুলি কেবলমাত্র বৈধ আউটপুট নয়, এগুলি বৈধ আউটপুটগুলির উদাহরণ।

[["+", ["9123", "3"]], "3"]

      ^         ^
     / \       /3\
    /   \      ---
   /  +  \
  ^-------^
 /9\     /3\
/123\    ---
-----

[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]

        ^      ^     ^     ^
       / \    / \   / \   / \
      /out\  /out\ /out\ /out\
     ^-----^ -----^----- -----^
    / \   / \    / \         / \
   /chr\ /chr\  /chr\       /chr\
  ^----- -----^ -----^     ^-----
 / \         / \    / \   / \
/72 \       /101\  /108\ /111\
-----       -----  ----- -----

[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]

       ^
      / \
     / + \
    /     \
   ^-------^
  /a\     /d\
 /sdf\   /o  \
/ghjkl\ ^-----
-------/1\
       ---

দ্বিতীয় পরীক্ষার ক্ষেত্রে লক্ষ্য করুন, দ্বিতীয় এবং তৃতীয় outপিরামিড উভয়ের উভয়ই ["chr", ["108"]]প্যারামিটার হিসাবে রয়েছে, যা দুটি শীর্ষ-স্তরের দ্বারা ভাগ করা একটি পিরামিড স্ট্যাকের মধ্যে পড়ে যায়। আপনার কোড সমর্থন করতে পারে এটি এটি একটি বৈধ অপ্টিমাইজেশন, তবে এটি সম্পূর্ণ optionচ্ছিক; স্কোরিং আপনার আউটপুট দৈর্ঘ্যের উপর ভিত্তি করে নয়।

9126 3কৌতূহলের জন্য, টপলেভেল পিরামিডগুলির ছাপ ছাপানোর কারণে প্রথম কেসটি প্রদর্শিত হয়, দ্বিতীয়টি প্রিন্ট করে Helloএবং শেষটি একটি সিনট্যাক্স ত্রুটি হয়, কারণ এটি একটি ঝরঝরে কাঠামো রয়েছে included


আপনি অনুমান হতে পারে যে ইনপুট শুধুমাত্র মুদ্রণযোগ্য হওয়া ASCII, ব্যতীত স্পেস, ধারণ ^, /, \, এবং -। ইনপুটটি সর্বদা বৈধ থাকবে এবং এতে কমপক্ষে একটি পিরামিড থাকবে। অ্যারের আকার বা ইনপুট স্ট্রিংগুলির কোনও সীমা নেই, তবে আপনি আপনার কোডটি এমনভাবে লিখতে পারেন যেন আপনার ভাষার ডিফল্ট পূর্ণসংখ্যার প্রকারটি অসীম নির্ভুলতা এবং আপনার কম্পিউটারে নির্বিচারে মেমরি রয়েছে। যদি একক স্ট্রিং হিসাবে ইনপুট গ্রহণ করা হয়, আপনি অ্যারে ছাড়ার জন্য উপযুক্ত কিছু (কমা, স্পেস ইত্যাদি ) মুদ্রণযোগ্য অ্যাস্কেই এবং না "বা ব্যবহার করতে পারেন []) del আপনাকে পুরো জিনিসটির চারপাশে বন্ধনী অন্তর্ভুক্ত করতে হবে না, এবং পরিবর্তে আপনার ডিলিমিটার দ্বারা পৃথক করে একাধিক অ্যারে নেওয়া উচিত।

আপনার আউটপুটটি গল্ফ করার দরকার নেই, আপনি অতিরিক্ত স্থান সন্নিবেশ করতে পারেন বা আপনার পিরামিডগুলি প্রয়োজনের তুলনায় আরও বড় করতে পারেন। টপলেভেল পিরামিডগুলি প্রথম লাইনে থাকা উচিত । আউটপুটটি নতুন লাইনের সাথে স্ট্রিং বা স্ট্রিংয়ের তালিকা হওয়া উচিত।

যে কেউ যিনি করেন যা সন্তোষজনক ভাবে পিরামিড golfs তাদের কোড এর একটি সংস্করণ অন্তর্ভুক্ত upvotes / অনুগ্রহকে মিথ্যা (কিন্তু সম্ভবত upvotes) আকারে কিছু প্রতিনিধির পেতে পারেন।


8
সিয়েরপিনস্কি এই ভাষাটি পছন্দ করবেন।
mbomb007

4
পুরোপুরি এই চ্যালেঞ্জটি পোস্ট করেননি কারণ আমি ত্রিভুজগুলি সঠিকভাবে ফর্ম্যাট করতে খুব অলস ...
পাভেল

@ কোডস জনসন ইনপুট একটি দেশীয় অ্যারে হতে পারে।
পাভেল

আপনি কীভাবে দুটিরও বেশি যুক্তি দিয়ে একটি ফাংশন রাখতে পারেন?
ধ্বংসাত্মক লেবু

@ আবিষ্কারযোগ্য ওয়াটারমেলন ইনপুটটিতে কখনই এমন অ্যারে থাকবে না যাতে পিরামিডে দুটি যুক্তি প্রেরণের প্রয়োজন হবে, কারণ এটি পিরামিড স্কিমে অসম্ভব।
পাভেল

উত্তর:


26

কমন লিস্প - 2524 1890 বাইট

(defun f(i)(let((s(loop as r in i collect(g r)))(n())(output""))(loop until n do(setf n T)(loop as r in s do(if(cdr r)(progn(setf output(c output(e r))(cdr r)(cdr(cdr r)))(setf n()))(setf output(c output(b(car r))))))(setf output(c output(format()"~%"))))output))(defun g(r)(if(stringp r)(d(m(length r))r)(if(<(length r)2)(d(m(length(car r)))(car r))(if(=(length(e r))1)(let((h(g(car(e r))))(p(d(m(length(car r)))(car r))))(let((o(+ 1(position #\^(e h))))(parent_length(car p)))(if(<(-(car h)o)parent_length)(l(cons(+ o parent_length)())(loop as n in(butlast(cdr p))collect(c(b o)n))(cons(c(subseq(e h)0 o)(car(last p)))())(loop as n in(cdr(cdr h))collect(c n(b (- parent_length(-(car h)o))))))(let((i(-(- o 1)parent_length)))(l(cons(car h)())(loop as n in(butlast(cdr p))collect(c(b o)n(b i)))(cons(c(subseq(nth 1 h)0 o)(car(last p))(b i))())(cddr h))))))(let((l-h(g(car(e r))))(r-h(g(e(e r)))))(let((ll(position #\^(e l-h)))(rl(position #\^(e r-h))))(let((lr(-(car l-h)ll 1))(rr(-(car r-h)rl 1)))(let((p(d(max(m(length(car r)))(ceiling(+ lr rl)2))(car r))))(let((m-pad(if(>(car p)(+ lr rl))(-(car p)lr rl)0)))(l(cons(+ ll 1(car p)1 rr)())(loop as n in(butlast(cdr p))collect(c(b(+ 1 ll))n(b(+ 1 rr))))(cons(c(subseq(e l-h)0(+ 1 ll))(car(last p))(subseq(e r-h)rl))())(loop as y in(append(cddr l-h)(make-list(length l-h):initial-element(b(car l-h))))as z in(append(cdr(cdr r-h))(make-list(length r-h):initial-element(b(car r-h))))collect(c y(b m-pad)z))))))))))))(defun d(r n)(cons(+(* 2 r)1)(l(cons(c(b r)"^"(b r))())(loop as i from 1 to r collect(c(b(- r i))"/"(subseq(c n(b(expt i 2)))(expt(- i 1)2)(expt i 2))"\\"(b(- r i))))(cons(make-string(+ 1(* 2 r)):initial-element #\-)()))))(defun m(l)(+ 1(floor(sqrt l))))(defun b(n)(make-string n :initial-element #\space))(defun c(&rest a)(apply 'concatenate 'string a))(defun l(&rest a)(apply 'concatenate 'list a))(defun e(tree)(nth 1 tree))

বিভিন্ন গল্ফিং ট্রিক্সের জন্য @ কর্ডম্প্পকে ধন্যবাদ। প্রশ্ন থেকে নমুনা আউটপুট:

> (f '(("out" (("chr" ("72")) ("chr" ("101")))) ("out" (("chr" ("108")))) ("out" (("chr" ("108")))) ("out" (("chr" ("111"))))))
          ^               ^          ^          ^  
         /o\             /o\        /o\        /o\ 
        /ut \           /ut \      /ut \      /ut \
       /     \         ^-----     ^-----     ^-----
      /       \       /c\        /c\        /c\    
     ^---------^     /hr \      /hr \      /hr \   
    /c\       /c\   ^-----     ^-----     ^-----   
   /hr \     /hr \ /1\        /1\        /1\       
  ^-----    ^-----/08 \      /08 \      /11 \      
 /7\       /1\    -----      -----      -----      
/2  \     /01 \                                    
-----     -----                                    










> (f '( ("+" ( ("asdfghjkl") ("do" ( "1" )) )) ))
          ^        
         /+\       
        /   \      
       /     \     
      /       \    
     /         \   
    ^-----------^  
   /a\         /d\ 
  /sdf\       /o  \
 /ghjkl\     ^-----
/       \   /1\    
---------  /   \   
           -----   








> (f '(("+" ("9123" "3")) "3"))
       ^        ^  
      /+\      /3\ 
     /   \    /   \
    /     \   -----
   ^-------^       
  /9\     /3\      
 /123\   /   \     
/     \  -----     
-------            

এখানে মূল, (বেশিরভাগ) অরোগল্ফড সংস্করণ রয়েছে:

(defun f (input)
    (let ((trees (loop for tree in input collect (g tree)))
          (done nil)
          (output ""))
        (loop while (not done)
            do  (setf done T) 
                (loop for tree in trees
                    do  (if (cdr tree)
                            (progn
                                (setf output (conStr output (car (cdr tree))))
                                (setf (cdr tree) (cdr (cdr tree)))
                                (setf done nil))
                            (setf output (conStr output (blank (car tree))))))
                (setf output (conStr output  (format nil "~%"))))
        output))

;creates a single tree
;output is a list, first element is the length of each line, the rest are the lines of text
(defun g (tree)
    (if (stringp tree)
        ;strings should be drawn as just the pyramid for the name
        (draw-body (min-rows (length tree)) tree)

        (if (< (length tree) 2)
            ;lists with no arguments should be drawn as just the pyramid for the name
            (draw-body (min-rows (length (car tree))) (car tree))
            (if (= (length (car (cdr tree))) 1)
                ;single child
                (let ((child (g (car (car (cdr tree))))) (parent (draw-body (min-rows (length (car tree))) (car tree))))
                    (let ((parent_offset (+ 1 (position #\^ (first-line child)))) (parent_length (car parent)))
                        (if (< (- (car child) parent_offset) parent_length)
                            (let ((child-fill (- parent_length (- (car child) parent_offset))))
                                (concatenate 'list 
                                    (cons (+ parent_offset parent_length) nil)
                                    (loop for line in (butlast (cdr parent))
                                        collect (conStr (blank parent_offset) line))
                                    (cons (conStr (subseq (nth 1 child) 0 parent_offset) (car (last parent))) nil)
                                    (loop for line in (cdr (cdr child))
                                        collect (conStr line (blank child-fill)))))
                            (let ((parent-fill (- (- parent_offset 1) parent_length)))
                                (concatenate 'list 
                                    (cons (car child) nil)
                                    (loop for line in (butlast (cdr parent))
                                        collect (conStr (blank parent_offset) line (blank parent-fill)))
                                    (cons (conStr (subseq (nth 1 child) 0 parent_offset) (car (last parent)) (blank parent-fill)) nil)
                                    (cdr (cdr child)))))))
                ;two children
                (let ((l-child (g (car (car (cdr tree))))) (r-child (g (car (cdr (car (cdr tree)))))))
                    (let ((lc-l-width (position #\^ (first-line l-child))) (rc-l-width (position #\^ (first-line r-child))))
                        (let ((lc-r-width (- (car l-child) lc-l-width 1)) (rc-r-width (- (car r-child) rc-l-width 1)))
                            (let ((parent (draw-body (max (min-rows (length (car tree))) (ceiling (+ lc-r-width rc-l-width) 2)) (car tree))))
                                (let ((m-pad (if (> (car parent) (+ lc-r-width rc-l-width))
                                            (- (car parent) lc-r-width rc-l-width)
                                            0)))
                                    (concatenate 'list
                                        (cons (+ lc-l-width 1 (car parent) 1 rc-r-width) nil)
                                        (loop for line in (butlast (cdr parent))
                                            collect (conStr (blank (+ 1 lc-l-width)) line (blank (+ 1 rc-r-width))))
                                        (cons (conStr (subseq (first-line l-child) 0 (+ 1 lc-l-width)) (car (last parent)) (subseq (first-line r-child) rc-l-width)) nil)
                                        (loop for left in (append (cdr (cdr l-child)) (make-list (length l-child) :initial-element (blank (car l-child))))
                                            for right in (append (cdr (cdr r-child)) (make-list (length r-child) :initial-element (blank (car r-child))))
                                            collect (conStr left (blank m-pad) right))))))))))))


;create a single pyramid
; output is a list, first element is the length of each line, the rest are the lines of text
(defun draw-body (rows name)
    (print rows)
    (print name)
    (cons (+ (* 2 rows) 1)
        (concatenate 'list (cons (conStr (blank rows) "^" (blank rows)) nil)
            (loop for i from 1 to rows
                collect (conStr (blank (- rows i)) "/" (subseq (conStr name (blank (expt i 2))) (expt (- i 1) 2) (expt i 2)) "\\" (blank (- rows i))))
            (cons (make-string (+ 1 (* 2 rows)) :initial-element #\-) nil))))

(defun min-rows (l)
    (+ 1 (floor (sqrt l))))

(defun blank (n)
    (make-string n :initial-element #\space))

(defun conStr (&rest args)
    (apply 'concatenate 'string args))

(defun first-line (tree)
    (car (cdr tree)))

অনলাইনে চেষ্টা করে দেখুন!


অপ্রয়োজনীয় স্পেসগুলি সরিয়ে আপনার প্রচুর বাইট গল্ফ করতে সক্ষম হওয়া উচিত।
ক্লিষ্টিক

2
পিপিসিজিতে আপনাকে স্বাগতম এবং প্রথম প্রথম উত্তরের!
ক্রিটিকি লিথোস

সিএল গল্ফ করার জন্য কিছু টিপস: লুপগুলিতে, "জন্য" এছাড়াও "হিসাবে" লেখা যেতে পারে; প্রথম বন্ধনী এবং ডাবল-কোটের আগে এবং পরে স্পেসগুলি সরিয়ে ফেলতে পারেন; আপনি NIL দ্বারা প্রতিস্থাপন করতে পারেন (); আপনি পাঠক ভেরিয়েবলগুলিও ব্যবহার করতে পারেন, কখনও কখনও
coredump

... loop while (not x)হয় loop until x, (cdr (cdr x))হয় (cddr x), (setf a b c d)তুলনায় খাটো (setf a b)দ্বারা অনুসরণ (setf c d), ইত্যাদি কিন্তু এই ইতিমধ্যে একটি ভাল উত্তর
coredump

2
মোট ৩৫০ খ্যাতি অনুগ্রহযোগ্য তাৎপর্যপূর্ণ ... তবে এই উত্তরটি এটি প্রাপ্য। একটি লিস্প উপভাষার জন্য প্রশ্ন গঠনের বিষয়ে একটি প্রশ্নের একটি সাধারণ লিস্প উত্তর ... বাহ ow
wizzwizz4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.