เคล็ดลับการตีกอล์ฟในเจ


33

GolfScript เข้าหาทางของตัวเองบ่อยเกินไปและฉันรู้สึกว่าที่เก็บคำแนะนำที่มีประโยชน์สำหรับการเล่นกอล์ฟใน J อาจช่วยในการต่อสู้กับอาณาจักรชั่วร้าย คุณมีเคล็ดลับอะไรที่ทำให้ภาษานี้สั้นลงแล้ว

สำหรับผู้ที่ต้องการเรียนรู้ J จุดเริ่มต้นที่ชัดเจนคือเว็บไซต์jsoftwareและโดยเฉพาะคำศัพท์คู่มือการเรียนรู้ Jและคู่มือโปรแกรมเมอร์ J สำหรับ C


1
มีบางอย่างที่ตลกเกี่ยวกับการอ่านGolfScript gets its own way far too oftenในปี 2019
สตริงที่ไม่เกี่ยวข้อง

คำตอบ:


14

มีรายละเอียดปลีกย่อยจำนวนหนึ่งในการบีบอักขระสองสามตัวสุดท้ายใน J สำหรับต่อไปนี้สมมติว่าตัวอักษรตัวใหญ่แต่ละตัวเป็นคำกริยาดั้งเดิม

  • เมื่อคุณมีรถไฟไปและคุณจำเป็นต้องใช้ฟังก์ชั่นบนยอดอีกส่วนหนึ่งผ่าน([:FLGR)และ(LF@:GR)มีจำนวนอักขระที่เท่ากัน แต่(LF@GR)จะบันทึกหนึ่ง หากเฟรมของ G มากกว่าหรือเท่ากับระดับ monad ของ F นี่เป็นการเปลี่ยนแปลงที่ถูกต้อง ยวดรถไฟทั้งหมดได้ยศอนันต์ขณะที่ทำ, ,. ,: ~. /: \: [ ]และการใช้งานส่วนใหญ่และ#|.

  • >i{ab`cd`efถ้าคุณต้องเลือกสายออกจากรายการและสตริงเหล่านี้ไม่มีช่องว่างการใช้งาน มันสกปรก แต่มันช่วยประหยัดอักขระสำหรับสตริงใหม่แต่ละอันที่คุณต้องจัดการยกเว้นว่าคุณเพิ่งจะดึงตัวอักษรตัวเดียวและถึงแม้ลิสต์จะต้องมีความยาว 4 ถึงจะสั้นกว่า สิ่งที่เกิดขึ้นก็คือชื่อที่ไม่ได้กำหนดจะถือว่าเป็นการอ้างอิงถึงคำกริยาและเมื่อคุณใช้คำกริยาของคำกริยาเหล่านั้นคุณจะได้รับชื่อของสตริง ชื่อใด ๆ ที่กำหนดไว้แล้วว่ามีคำนามประเภทคำวิเศษณ์หรือการรวมไม่สามารถใช้ในรูปแบบนี้เพราะชื่อเหล่านั้นได้รับการแก้ไขก่อนที่จะ`สามารถมีพวกเขา

  • หากคุณโชคดีพอที่จะมีการแสดงออกที่จะทำงานกับและไม่เพียง แต่คำกริยาโดยปริยายก็เกือบคุ้มค่าที่จะกำหนดบิตใด ๆ ที่คุณนำมาใช้ซ้ำกับตัวแปรไม่ว่าพวกเขาจะเป็นคำนามคำกริยาหรือคำวิเศษณ์ parens บางครั้งจะจ่ายคืนให้กับตัวเองโดยใส่เข้าไปในตำแหน่งที่คุณมีช่องว่างก่อนหน้านี้และคำจำกัดความดังกล่าวส่วนใหญ่จะคุ้มค่าถ้าพวกเขาถูกนำมาใช้ซ้ำอีกครั้ง

  • คำสันธานเช่น(FGH)^:(u`v`w)นี้สามารถเขียนใหม่u`v`w(FGH^:)ได้ วิธีนี้ใช้ได้กับทุกความยาวของรถไฟแม้ 1 แม้ว่าคุณจะบันทึกอะไรก็ได้หากเคล็ดลับนี้จะลบ parens ออกจากอาร์กิวเมนต์ที่ถูกต้อง เคล็ดลับนี้ใช้ได้เฉพาะเมื่อคุณโหลดตัวถูกดำเนินการทางด้านซ้ายล่วงหน้า (ไม่รู้ว่าเกิดอะไรขึ้นมองหา 'คำวิเศษณ์โดยปริยาย' และศึกษาส่วนการแยกวิเคราะห์และการดำเนินการของพจนานุกรม J)

  • อย่าใช้a.&i.ใช้u:! {&a.และ3&u:เทียบเท่ากับความยาวแม้ว่าและในอดีตอาจมีประโยชน์มากกว่าในการรวม (ขึ้นอยู่กับการรวม)

  • สิ่งที่ชอบ(2%~F)และ(F%2:)มีความยาวเท่ากัน สิ่งนี้มีประโยชน์เพราะบางครั้งขึ้นอยู่กับว่าส่วนที่เหลือของรถไฟของคุณเป็นอย่างไรคุณสามารถปรับโครงสร้างด้วย@เทคนิคตามที่เขียนไว้ในตอนแรกเพื่อบันทึกอักขระที่สิ้นหวัง (และแน่นอนถ้าFเป็น]และรถไฟเป็น monad โดยใช้การ%&2ประหยัดถ่าน, duh.)

  • Hook เหมือนรถไฟ]หรือเป็นซ้ายสุดคำกริยาเช่น[(]FGH)

    • ]ให้คุณแยกแอปพลิเคชัน dyadic และใช้อาร์กิวเมนต์ที่ถูกต้องเท่านั้น (สลับไปทางซ้ายด้วย(]FGH)~การลงโทษอย่างน้อย 1 ตัวอักษรอาจจะมากกว่า) บันทึกตัวละคร(FGH)@]และมีประโยชน์มากในการพูดเยาะเย้ย!
    • [ในเบ็ดที่ใช้แบบ monadically ช่วยให้คุณทำบางสิ่งบางอย่างสำหรับผลข้างเคียงทางด้านขวาแล้วส่งกลับอาร์กิวเมนต์อีกครั้ง การใช้งานทั่วไปส่วนใหญ่อยู่กับ1!:2อาจเป็นไปได้กับการจัดรูปแบบขยะ
  • I / O แย่มาก เร่งกระบวนการโดยการวนซ้ำทุกสิ่งที่คุณทำได้ 1!:1มีอันดับ0และทั้งคู่1!:2 3มีอันดับ_ 0ยกตัวอย่างเช่นใช้ประโยชน์นี้โดยกำหนดให้ 1s และเรียกใช้1!:1โดยตรงกับพวกเขา โปรดทราบว่า".ยังมีอันดับ 1 ดังนั้นคุณสามารถใส่ได้โดยตรงหลังจาก1!:1นั้นเช่นกันและไม่ต้องแนบผ่านทาง@หรือจัดอันดับ shenanigans

  • ไม่ใช่เรื่องง่ายที่จะหาสถานที่ที่จะนำสิ่งนี้ แต่::มีประโยชน์

    • ::]^:_เป็นชุดค่าผสมที่มีประสิทธิภาพโดยเฉพาะอย่างยิ่งเช่นที่ช่วยให้คุณทำสิ่งที่อันตรายจนกว่าคุณจะไม่สามารถทำมันได้อีกต่อไป (ขึ้นอยู่กับ^:_caveats -as-a-loop ปกติ)

    • นอกจากนี้ยังช่วยให้คุณสามารถใช้{กับรายการที่ไม่มีดัชนีที่ต้องการได้เนื่องจากจะเกิดข้อผิดพลาดในโดเมนเมื่อเกิดขึ้น มีประโยชน์เช่นนำหัวของรายการหากมีอยู่ (ลองใช้::]เพื่อส่งคืนรายการเปล่าหรือ::_1:ส่งคืนรหัสข้อผิดพลาดและอื่น ๆ )

  • ]`($:@u)@.vสามารถทำให้สั้นกว่าu^:v^:_โดยเฉพาะในคำจำกัดความuและvที่สามารถเล่นได้ด้วย กรณีคล้ายกันถือสำหรับเงื่อนไขเหมือนเทียบกับu^:(1-v) ]`u@.vพิจารณาตัวเลือกของคุณโดยเฉพาะเมื่อคุณมีคำกริยาที่มีชื่อมากมายลอยอยู่ นอกจากนี้ยังมีความยืดหยุ่นมากกว่าเดิมเล็กน้อย แต่โปรดจำไว้ว่าหากใช้$:จะมีความลึกในการเรียกซ้ำซึ่งง่ายต่อการชน (โดยปกติแล้วจะมีค่าประมาณ 1800 ซ้ำ?)


เคล็ดลับที่ไม่พึงประสงค์มันเจ๋งจริงๆ
FUZxxl

"บันทึกตัวละครที่สิ้นหวัง" เมื่อคุณกำลังศึกษาอยู่แสงทุกอย่างดูเหมือนจะเป็นฉายาโอน! :)
Soham Chowdhury

1
"การใช้งาน%&2ช่วยประหยัดถ่าน, duh." และ-:ประหยัดอีก!
ลินน์

11

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

ตัวอย่างเช่นความท้าทายที่ผ่านมาถามว่าจะแก้ปัญหา subarray ใหญ่ที่สุด อัลกอริทึมหุ้นเพื่อแก้ปัญหานี้คืออัลกอริทึมของ Kadane มีคำอธิบายที่ไม่เป็นทางการดังต่อไปนี้:

ผ่านอาร์เรย์และในแต่ละตำแหน่งและหาผลรวมของ subarray ที่ใหญ่ที่สุดซึ่งสิ้นสุดที่นี่ซึ่งเป็นค่าสูงสุด 0 หรือค่าที่ดัชนีปัจจุบันบวกผลรวมของ subarray ที่ใหญ่ที่สุดที่สิ้นสุดที่ตำแหน่งก่อนหน้า คำนวณค่าสูงสุดของ subarrays เหล่านี้เมื่อคุณไปหา subarray ที่ใหญ่ที่สุดในอาร์เรย์ทั้งหมด

การแปลเป็นรหัสที่จำเป็นนั้นตรงไปตรงมา:

  1. ให้ A เป็นอาร์เรย์อินพุต
  2. hmฉัน ← 0
  3. ถ้า ฉัน ≥ len (A) ผลตอบแทน เมตร
  4. h ←สูงสุด (0, h + A [ i ])
  5. m ←สูงสุด ( m , h )
  6. ฉันฉัน + 1
  7. ข้ามไป 3

อัลกอริทึมนี้ดูเหมือนจะซับซ้อนสำหรับ J ในทันทีเนื่องจากมีลูปที่ชัดเจนซึ่งไม่เหมือนกับการลดลงในตอนแรก หากคุณรู้ว่าอัลกอริทึมนั้นกำลังทำอะไรคุณสามารถแก้ให้หายยุ่งแต่ละขั้นตอนและดูว่ามันทำงานจริงสองอย่างในการทำงานของอาเรย์อย่างง่าย ๆ :

  1. สแกนอาร์เรย์เพื่อคำนวณความยาวของอาร์เรย์ย่อยที่ใหญ่ที่สุดซึ่งสิ้นสุดที่แต่ละดัชนี
  2. ลดความยาวเหล่านี้ด้วยฟังก์ชัน max เพื่อค้นหาค่าสูงสุด

ตอนนี้ทั้งสองขั้นตอนง่ายมากที่จะใช้ใน J นี่คือการแปล:

  1. (0 >. +)/\. y , 0- ขั้นตอนนี้ทำงานจากปลายอีกด้านของอาร์เรย์เพื่อให้เหมาะสมกับกระบวนทัศน์ของ J คือโดยปริยายสำหรับ0 >. +0 >. x + y
  2. >./ y

เมื่อรวมกันเราจะได้อัลกอริทึมที่กระชับมาก:

>./ (0 >. +)/\. y , 0

หากคุณเรียนรู้วิธีการใช้งานอัลกอริทึมวิธีนี้โซลูชันของคุณจะสั้นเหมือนรหัสนี้

นี่คือเทคนิคบางอย่างที่ฉันสะสมเมื่อเวลาผ่านไป รายการนี้จะขยายตัวเมื่อฉันได้รับความรู้เพิ่มเติมในการเล่นกอล์ฟ J

  • เรียนรู้พจนานุกรม มันมีคำกริยาที่คลุมเครือจำนวนมากซึ่งไม่สมเหตุสมผลจนกว่าคุณจะเห็นว่ามันมีประโยชน์อย่างไร ยกตัวอย่างเช่น monadic =แปลกในตอนแรก แต่มีประโยชน์มากในการท้าทายงาน ASCII
  • ใช้ dyadic &ในปริยายบริบทเมื่อคุณต้องการพลังงานร่วม คำศัพท์ที่แสดงให้เห็นu@[&0เป็นแทนโดยปริยายไป4 : 'u^:x yและทำเพื่อฉัน
  • ในหลายกรณีคุณสามารถหลีกเลี่ยง a [:หรือ@:ตามลำดับเช่นu@vโดยเลือกตัวแปรuที่มีอาร์กิวเมนต์ซ้าย ตัวอย่างเช่นหากต้องการวางรายการแรกของผลลัพธ์vให้ใช้1}.vแทน[:}.vหาก}.@vไม่สามารถทำได้ด้วยเหตุผลบางประการ
  • ] vมักจะสั้นกว่าv@]ถ้าคุณต้องการใช้ monadic vในบริบทของ dyadic สิ่งนี้มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อvมีกริยารถไฟยาว
  • บางครั้งคุณสามารถเขียนแทนm (n v w) y (n v m&w) yสิ่งนี้อาจทำให้สามารถหลีกเลี่ยงช่องว่างและวงเล็บ
  • #\>:@i.@#แทน
  • u &. vมีประโยชน์เมื่อvมีผิวหน้า เมื่อไม่เป็นเช่นนั้นคุณอาจต้องการใช้[: vinv u & vหรือu & (v :. vinv)แทน
  • ทำความเข้าใจอันดับและวิธีการใช้งาน พยายามคลุกคลีกับการจัดอันดับจนกว่าคุณจะได้อะไรที่เหมาะสม ช่วยให้เข้าใจว่าอันดับของคุณมีอิทธิพลต่อรหัสของคุณอย่างไร
  • ^:_ มีประโยชน์อย่างยิ่งสำหรับอัลกอริทึมที่คุณต้องการเข้าถึงการบรรจบกันเช่นการเติมน้ำท่วมหรือการจำลอง
  • รู้จักห้องสมุดมาตรฐานของคุณ มันมีฟังก์ชั่นที่มีประโยชน์มากที่ช่วยให้คุณประหยัดอักขระจำนวนมาก
  • copulæ =.และ=:สามารถฝังที่ใดก็ได้ในวลี ใช้สิ่งนี้เพื่อสร้างหนึ่งสมุทรที่สัญกรณ์เงียบไม่เพียงพอ
  • ใช้ monadic ,แทนการลดหลายครั้งเมื่อลดอาร์เรย์หลายมิติ
  • ทำความเข้าใจกับวลีพิเศษที่ได้รับการสนับสนุนด้วยรหัสพิเศษเมื่อความท้าทายกำหนดขอบเขตของรันไทม์ สิ่งที่มีประโยชน์บางอย่างทำงานใน O ( n ) แทน O ( n 2 ) ตอบโต้อย่างสังหรณ์ใจ
  • กล่องมีประโยชน์สำหรับต้นไม้

J ฉลาดพอที่จะเรียกใช้โซลูชัน subarray สูงสุดของคุณใน O (n) โดยการแคชการคำนวณที่ใช้ซ้ำหรือจะทำสิ่งที่ตรงไปตรงมาและรันใน O (n ^ 2) หรือไม่
โจนาห์

@ Jonah ฉันคิดว่ามันทำงานในเวลากำลังสอง
FUZxxl

10

ระวังการใช้ลูป

ในขณะที่เจมีบ่วงโครงสร้าง ( for. do. end., while. do. end.และรูปแบบ) ถ้าคุณพบว่าตัวเองใช้พวกเขามีความเป็นไปได้ว่าอัลกอริทึมของคุณจะไม่ได้เล่นกับเจจุดแข็งของการเล่นกอล์ฟและว่ามีเงินฝากออมทรัพย์ของตัวละครที่จะทำ

^:การรวมพลังเป็นเพื่อนของคุณ ในการรันคำกริยาx:

verb^:x

หากคุณต้องการผลลัพธ์ของการวนซ้ำแต่ละรายการในรายการ:

verb^:(i.x)

คุณยังสามารถใช้^:เพื่อดำเนินการคำกริยาตามเงื่อนไข:

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

เพิ่มเป็นสองเท่า+:ถ้า^:ไอเท็มนั้นมีค่ามากกว่า 3 3<](การ"0เปลี่ยนอันดับของคำกริยาเพื่อให้มันทำงานได้ในแต่ละครั้ง)


ชนิดบรรจุกล่องค่าทำหน้าที่เหมือน(i.x)ตัวอย่างเช่นเทียบเท่ากับf^:(<x) f^:(i.x)
FireFly

9

อินพุต

1!:1[1 จะใช้เวลาหนึ่งบรรทัดของการป้อนข้อมูลยกเลิกโดยการกดปุ่ม Enter

1!:1[3 จะใช้จำนวนบรรทัดอินพุต (สิ้นสุดโดย Ctrl-D บน Mac ของฉัน, Ctrl-C บน Windows)

หากคุณกำลังพยายามป้อนหมายเลขการใช้".จะประเมินสตริงและส่งคืนรายการหมายเลขที่พร้อมใช้งาน หากคุณใช้ตัวเลขหนึ่งตัว แต่ต้องดำเนินการกับตัวเลขแต่ละตัว".,.(ขอบคุณที่คอมเมนต์ของ Jan Dvorak สำหรับเรื่องนี้) หรือ"."0จะแบ่งสตริงออกเป็นตัวเลขหลัก:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

;:หากคุณอ่านในสายทางที่สั้นที่สุดที่จะได้รับรายชื่อชนิดบรรจุกล่องของสตริงที่แยกจากกันคือการใช้งาน วิธีนี้จะทำงานได้ดีที่สุดสำหรับสตริงที่คั่นด้วยช่องว่าง:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘

จากความอยากรู้อยากเห็น (ฉันเล่นกับ J เพียงเล็กน้อย) อะไรจะ1!:1[2เป็นผลดี (ถ้ามี)
Gaffi

จากสิ่งที่ฉันสามารถรวบรวมบน1!:หน้า (ฉันไม่มีผู้เชี่ยวชาญ J) 2 คือหน้าจอดังนั้นการป้อนข้อมูลจากหน้าจอไม่สมเหตุสมผล
Gareth

ขอบคุณสำหรับลิงค์ จากตรงนั้นดูเหมือนว่า2ไม่ถูกต้องจริงเหรอ? ฉันไม่มีคอมพิวเตอร์ J ของฉันที่จะลองตอนนี้ ที่ผมเห็น2เพียงด้านล่างบันทึกเกี่ยวกับการนั้นก็เพื่อให้1!:1 1!:2
Gaffi

@Gaffi หมายเลขไฟล์สำหรับอินพุตและเอาต์พุตดูเหมือนจะเรียงตามลำดับดังนั้นฉันเดาว่าไฟล์เหล่านั้นจะได้รับการแก้ไขและที่ 2, 4 และ 5 จะปรากฏใต้เอาท์พุทเท่านั้น กันไปวิธีอื่น ๆ 1 และ 3
แกเร็ ธ

เนื่องจาก".เป็นอันดับ 1-xx และ,.สร้างอาร์เรย์ 2 มิติเสมอ".,' ',.(เย็บต่อด้วยช่องว่าง ravel และประเมิน; 8 อักขระ) สามารถแทนที่ด้วย just ".,.(รายการ ravel และประเมิน; 4 ตัวอักษร)
John Dvorak

6

การใช้การวนซ้ำเพื่อคำนวณลำดับ

โดยทั่วไปแล้วการแก้ไขความท้าทายลำดับ OEIS จะต้องใช้สูตรใดสูตรหนึ่งที่ให้ไว้ในหน้า บางส่วนของสิ่งเหล่านี้ปรับตัวได้ดีสำหรับ J และอื่น ๆ ไม่มาก สูตรเรียกซ้ำเป็นแบบตรงไปตรงมาอย่างไรก็ตามการทำซ้ำอาจไม่ง่าย รูปแบบที่ฉันเริ่มใช้คือ

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

โดยที่sเป็นค่าแรกในลำดับfเป็นคำกริยาที่จะคำนวณคำถัดไปที่กำหนดคำก่อนหน้านี้และnเป็นดัชนี zero-based ของคำที่คุณต้องการคำนวณ วิธีนี้อาศัยข้อเท็จจริงที่ว่าเมื่อคำนวณพลังของ dyad LHS จะผูกพันกับ dyad เพื่อสร้าง monad ใหม่และ monad นั้นซ้อนอยู่บนค่าเริ่มต้น คู่ให้กับคำวิเศษณ์อำนาจเป็นเบ็ดที่(]f)จะได้รับดัชนีnใน LHS sและคุณค่าของคำที่อยู่ในลำดับที่ เบ็ดจะนำไปใช้fในการsเป็น monad แล้วไม่สนใจที่จะกลับผลมาจากการnf s

ห้องสมุดมาตรฐาน

บางครั้งคุณอาจพบว่าเจจะมีการสนับสนุนสำหรับคำกริยาในของห้องสมุดมาตรฐาน ตัวอย่างเช่นการดำเนินการจำนวนเต็ม bitwise ส่วนใหญ่ถูกผูกไว้กับชื่อที่สั้นกว่าการใช้การโทรดั้งเดิม

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

มีวันที่และเวลาในตัว

ช่วง

หากคุณมีชุดของค่า[a, b, c]และคุณต้องการจัดรูปแบบช่วงโดยยึดตามผลิตภัณฑ์ของพวกเขา[0, 1, 2, ..., a*b*c-1]วิธีการทั่วไปก็คือการค้นหาผลิตภัณฑ์ของพวกเขาแล้วสร้างช่วงที่อาจมี[:i.*/ค่าใช้จ่าย 6 ไบต์ วิธีที่สั้นกว่าคือ,@i.4 ไบต์เนื่องจากi.สามารถสร้างอาร์เรย์หลายมิติในขณะที่ยังคงนับและแบนมันจะสร้างช่วงที่เทียบเท่า

การพิมพ์อย่างต่อเนื่อง

วิธีโดยปริยายในการพิมพ์ค่าและใช้งานต่อไปโดยไม่ต้องวนซ้ำอย่างชัดเจน([echo)สำหรับกรณี monadic echoเป็นคำกริยาในไลบรารีมาตรฐานที่พิมพ์เนื้อหาstdoutในรูปแบบเดียวกับที่ใช้ในล่าม จากนั้นตะขอผ่านค่าอินพุตเดียวกันโดยใช้[กริยาซ้าย

ฐาน 10 หลักของจำนวนเต็ม

วิธีมาตรฐานในการรับฐาน 10 หลักของจำนวนเต็มมี10#.inv]ค่า 8 ไบต์มากเกินไป! อีกทางเลือกหนึ่งคือการแปลงเป็นสตริงและแยกวิเคราะห์ที่อันดับ 0 "."0@":ซึ่งช่วยประหยัดไบต์ แต่วิธีที่ดีกว่าคือการ,.&.":ประหยัดไบต์อื่นซึ่งทำให้ต้นทุน 6 ไบต์สุดท้ายเป็น 8 แทน



5

เทคนิคบางอย่างที่พบเห็นบ่อยๆ

ฉันกำลังแบ่งปันบางสิ่งที่มีประโยชน์สำหรับฉัน โดยพื้นฐานแล้วสิ่งเหล่านี้เป็นเคล็ดลับที่ฉันได้รับด้วยตัวเอง แต่ฉันไม่มีเครดิตสำหรับส่วนใหญ่

ผลรวมของอาร์เรย์อันดับหนึ่ง

แทนการใช้การใช้งาน+/@:(FGH) (1#.FGH)ซึ่งหมายถึงการลดระดับฐาน 1 ซึ่งหมายถึงการรวมอาเรย์อย่างมีประสิทธิภาพ แม้ว่าจะยาวกว่า+/แต่ก็ไม่จำเป็นต้องมีฝาปิดหรือองค์ประกอบใด ๆ ซึ่งมักทำให้สั้นกว่าการใช้งาน+/มาก

การนับความจริงต่อท้าย

#.~หากคุณมีรายการบูลและคุณต้องการที่จะนับจำนวนของความจริงต่อท้ายการใช้ ดูที่นี่ คำตอบ APLให้คำอธิบายที่ดีสำหรับวิธีการทำงานนี้ ได้รับสิ่งนี้มีประโยชน์กับฉันเพียงสองครั้ง แต่ฉันคิดว่าฉันจะแบ่งปันมันต่อไป

ใต้ (&.)

ไม่ใช่เคล็ดลับที่เฉพาะเจาะจง แต่เป็นเพียงข้อเสนอแนะทั่วไป: คำวิเศษณ์ที่&.มักจะนำไปสู่การแก้ปัญหาสั้น ๆ ที่สง่างามและ (สำคัญกว่า) เก็บไว้ในใจเมื่อคุณเล่นกอล์ฟ

บ่อยครั้งที่มันมีประโยชน์สำหรับความท้าทายในการแปลงฐานและฐานอื่น ๆ เช่นรหัสนี้ซึ่งจะลบบิตที่สำคัญที่สุดออกจากตัวเลข: }.&.#:(แปลงเป็นรายการของเลขฐานสองเอาตัวเลขหลักแรกออกแล้วเลิกทำการแปลงเป็นรายการเลขฐานสองและแปลง กลับเป็นทศนิยม) #.@}.@#:วิธีการแก้ปัญหาตรงไปตรงมาเป็นไบต์ที่สองเพิ่มเติมได้ที่:

u&.":ภายใต้ยังเป็นประโยชน์สำหรับความท้าทายที่คุณจะต้องทำงานร่วมกับตัวเลขทศนิยมเนื่องจากคุณสามารถใช้ ตัวอย่างเช่นการใช้ไมล์ทางลัดให้แบ่งเป็นหลักทศนิยมใช้ภายใต้: ,.&.":.

ตัวอย่างสุดท้ายคือการหาขนาดของเวกเตอร์: +/&.:*:โปรดทราบว่าคุณต้องรวบรวมผลลัพธ์ทั้งหมดจาก*:-square พร้อมกับ&.:-under เนื่องจาก*:-square มีค่าเป็นศูนย์


4

วิธีที่สั้นกว่าที่จะยุ่งกับอันดับ

บางครั้งคุณจะมีรหัสเหมือน<"0 i.3 3ที่คุณต้องการใช้คำกริยาที่ยศv rอย่างไรก็ตามหากคุณใช้คำนาม (เช่น0) คุณมักจะต้องมีช่องว่าง เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้กริยาที่มีuระดับเทียบเท่าและใช้u"vแทนได้ ยกตัวอย่างเช่นตั้งแต่+มียศ0 0 0เราสามารถใช้แทน<"+<"0

นี่คือตารางของคำกริยาทั้งหมดและอันดับของพวกเขา (หาได้โดยใช้v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

หากต้องการใช้ตารางนี้ค้นหาอันดับที่ต้องการrทางด้านซ้ายมือจากนั้นเลือกคำกริยาที่เหมาะสมvจากด้านขวามือ เช่นถ้าฉันต้องการให้คำกริยามีvความลึก2 _ 2จากนั้นฉันก็พบว่าอันดับนั้นอยู่ทางซ้ายและเลือก%.จากด้านขวา แล้วฉันจะใช้แทนv"%.v"2 _ 2


3

strings ห้องสมุด: เคล็ดลับการเล่นกอล์ฟ

ไลบรารี่ของสตริงมีประโยชน์อย่างมากสำหรับการทำทุกอย่างด้วยการจัดการสตริง แน่นอนว่าต้องใช้เวลาinclude'strings'(ซึ่งมีราคาแพงมากเมื่อพิจารณา J) แต่บางครั้งคุณอาจได้รับประโยชน์

stringreplace

พบว่าตัวเองใช้แทนที่สตริง? สังเกตว่าเป็นเช่นเดียวกับA stringreplace BB rplc A

ในความเป็นจริงนี่คือวิธีrplcการใช้งาน:

   rplc
 stringreplace~

cuts

คำกริยาcutsให้:

ตัด y ที่ x (รวม)
ข้อความสตริง (คำกริยาตัด n)
  n = _1 มากถึง แต่ไม่รวมสตริง
  n = 1 ถึงและรวมสตริง
  n = _2 แต่ไม่รวมสตริง
  n = 2 หลังและรวมสตริง

ดังนั้นจึงเป็นการแบ่งสตริงจริงๆ


3

รับตัวเลขตั้งแต่ 0 ถึง 4

หากมีข้อ จำกัด ในการใช้ตัวเลขในรหัสของคุณ:

0 %_ : หนึ่งหารด้วยอนันต์
1 #_ : อินฟินิตี้กี่คน
2 #_ _ : สองอนันต์
3 verb : มีในตัว
4 dyad : อื่น ๆ ในตัว

รับตัวเลขจาก 10 ถึง 35

ตัวอักษร Base-inifinity: 11 : _bb, 26 : _bqฯลฯ


3

การเขียนโปรแกรม Tacit

ข้อมูลพื้นฐานเกี่ยวกับ

คำกริยา Dyadic

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

คำกริยา Monadic

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

อื่น ๆ

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

เล่นกล

(F x) G (H y)

วิธีการแก้ปัญหาเงียบ: (G~F)~H; ~ขึ้นอยู่กับคำกริยาที่เกิดขึ้นจริงพิจารณาการจัดเรียงข้อโต้แย้งซ้ายและขวาเพื่อลบ

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

การแทนที่ Monadic-Dyadic

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y

1
(G~F)~Hเป็นความดีที่บริสุทธิ์ฟอง!
โจนาห์

2

& เป็นเพื่อนของคุณใช้มันอย่างชาญฉลาด

vเป็นคำกริยาnเป็นคำนามxและyเป็นอาร์กิวเมนต์ซ้ายและขวาตามลำดับ

Monad &: แนะนำ~ภายในคำวิเศษณ์ / เชนร่วม

คำวิเศษณ์ / เชื่อมโยงโซ่ประเมินจากด้านซ้าย ดังนั้นสิ่งที่ชอบ_2&+/\&.>จะไม่ทำงานเพราะมันจะแยกวิเคราะห์เช่นในขณะที่เราต้องการ(_2&+)/\&.> _2&(+/\)&.>ในกรณีนี้สลับซ้าย / ขวาของ+/\สามารถบันทึกไบต์ในขณะนี้เพราะหนึ่งจะแยกวิเคราะห์เป็น+/\~&_2&.> ((+/\)~)&_2&.>หากต้องการดูว่าทำไมจึงใช้งานได้:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

Dyad &: ทำซ้ำxครั้ง

คุณรู้ไหมว่าถ้าคุณให้อาร์กิวเมนต์ซ้ายxเพื่อ&ฟังก์ชั่นใช้มันxครั้งเพื่อy ? ความท้าทายค่อนข้างน้อยขอให้คุณทำxเวลาดำเนินการบางอย่าง สามารถทำได้สองวิธี:

  • ใช้ตัวดำเนินการพลังงาน^:โดยไม่มีตัวถูกดำเนินการที่ถูกต้อง

หากการดำเนินการvนั้นv^:จะกลายเป็นรถไฟคำวิเศษณ์ที่เมื่อได้รับตัวถูกดำเนินการด้านซ้ายจะกลายเป็นคำกริยา monadic ดังนั้นvจะนำไปใช้y, xครั้ง

x(v^:)y
is equivalent to
(v^:x)y
  • ใช้ dyadic &เป็นข้อต่อด้านนอกสุด

ใช้นี้คุณจะต้องระบุค่าคงที่nและคำกริยา dyadic uเพื่อให้อย่างใดอย่างหนึ่งn u yหรือเทียบเท่ากับy u n vจากนั้นคุณสามารถเขียนn&uหรือu&nแก้ไขงานทั้งหมด แบบฟอร์มนี้มีประสิทธิภาพมากที่สุดเมื่อการเลือกค่าคงที่ชัดเจนเช่น 3 ใน3 u:(แปลงตัวอักษรเป็นค่า ASCII)

นอกจากนี้ยังu&nเป็นที่ต้องการมากกว่าn&uเมื่อโครงสร้างด้านนอกสุดของuคือการรวมหรือคำวิเศษณ์ (ในกรณีที่n&uควรn&(u); คุณสามารถทำu~&nแทน)

โปรดทราบว่าคุณสามารถวาง dyadic ที่ใดก็ได้ในรถไฟเพื่อให้บรรลุการทำซ้ำฟังก์ชั่นที่กำหนดเองโดยพลการโต้แย้งในความรู้สึกคล้ายกับแบบไดนามิก&^:

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