เคล็ดลับสำหรับการเล่นกอล์ฟใน Clojure


16

คุณมีเคล็ดลับอะไรในการตีกอล์ฟโดยใช้ Clojure

จุดประสงค์ของคำถามนี้คือการรวบรวมรายชื่อของเทคนิคที่เฉพาะเจาะจงกับ Clojure และสามารถนำมาใช้ในปัญหาการเล่นกอล์ฟทั่วไป


อืม .. ไม่ควรโพสต์ประเภทเหล่านี้ในเมตาดาต้า (ฉันไม่แน่ใจว่าเมตามีอยู่มากกว่า 5 ปีที่แล้ว)
อัลเบิร์ตเรนชอว์

คำตอบ:


6

ใช้ไวยากรณ์ตัวอ่านสำหรับ lambdas
ดังนั้นใช้

#(+ % %2 %3)

แทน

(fn [x y z] (+ x y z))

นอกจากนี้คุณยังสามารถกำจัดช่องว่างบางครั้ง:

#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)

โดยวิธีการที่จะเทียบเท่ากับ#(+ % %2 %3) +
bfontaine

4

ที่คุณสามารถลบช่องว่าง:

  • ระหว่างสตริงและสิ่งอื่น:

    (println(+"Hello, World!"1))
    
  • ระหว่างวงเล็บและอย่างอื่น:

    (for[x(range 5)](* x x))
    
  • ระหว่างตัวเลขและทุกอย่างอื่นที่ไม่ใช่บิวอินหรือชื่อตัวแปร:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • ระหว่าง@(dereference สำหรับอะตอม) และวงเล็บ


ก่อนหน้าแมโครอ่านเดเรฟ@
ASCII เท่านั้น

1
นอกจากนี้ในบางครั้งคุณอาจจัดเรียงสิ่งต่าง ๆ อีกครั้งletและกำจัดช่องว่าง
NikoNyrh

ก่อนพารามิเตอร์ในฟังก์ชันที่ไม่ระบุชื่อ: #(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

สตริงสามารถถือว่าเป็นลำดับของตัวอักษร

เช่นเพื่อจัดเรียงอักขระในสตริงตามตัวอักษร:

(sort "hello")
=> (\e \h \l \l \o)

1
เงื่อนไขเป็นคำจำกัดความของตัวอักษรในเกือบทุกภาษา แต่คุณไม่สามารถใช้เคล็ดลับนี้กับพวกเขาทั้งหมด :-)
mellamokb

3
หรือมากกว่า "ลำดับ" มีความหมายพิเศษใน Clojure กว่าวิธีที่คุณสามารถใช้เทคนิคพิเศษ: :-)
mikera

2

ใช้nth ... 0แทนfirst

ในการรับองค์ประกอบแรกของคอลเล็กชันการใช้(nth ... 0)over firstsave byte:

(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)

กันไปสำหรับsecond(2 ไบต์)
Uriel

1
นอกจากนี้คุณสามารถใช้เวกเตอร์เป็นฟังก์ชันได้ดังนั้นให้([2 3 4]1)ส่งคืนองค์ประกอบที่ดัชนี 1 ซึ่งควรเป็นประโยชน์หากตัวอย่างเช่นรูปแบบอินพุตมีความยืดหยุ่น
NikoNyrh

1

ใช้ใช้แทนการลด

ยกตัวอย่างเช่นเป็นหนึ่งไบต์สั้นกว่า#(apply + %)#(reduce + %)


1

หลีกเลี่ยงการปล่อยให้ถ้าคุณมีแล้วสำหรับ

ตัวอย่างเช่น: แทน#(for[a[(sort %)]...)#(let[a(sort %)](for ...))

เพราะมันมี:letโครงสร้าง แต่มันละเอียดเกินไปสำหรับการตีกอล์ฟ


1

ใช้+และ-แทนincและdec

วิธีนี้จะช่วยประหยัด 1 ไบต์หากคุณใช้inc/ decในการแสดงออกด้วย parens:

(inc(first[1 3 5]))
(+(first[1 3 5])1)

1

ใช้แผนที่แทนifs เมื่อทำการทดสอบเพื่อความเท่าเทียมกัน

;; if n=3 then A else B
(if (= 3 n) A B) ; (if(=3n)AB)
({3 A} n B)      ; ({3A}nB) -> -3 chars

;; if n=2 or n=3 then A else B
(if (#{2 3} n) A B) ; (if(#{23}n)AB)
({2 A 3 A} n B)     ; ({2A3A}nB) -> -4 chars

1

ผูกชื่อฟังก์ชั่นยาวที่ให้กับสัญลักษณ์ไบต์เดียว

ตัวอย่างเช่นหากคุณต้องการใช้partitionหรือfrequenciesหลายครั้งอาจเป็นประโยชน์ในการผูกเข้ากับสัญลักษณ์ไบต์เดียวในletแมโคร จากนั้นอีกครั้งมันอาจไม่คุ้มค่าถ้าคุณไม่ต้องการletอย่างอื่นและชื่อฟังก์ชั่นนั้นค่อนข้างสั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.