GolfScript รุ่นปรับปรุง [ปิด]


12

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

ฉันไม่แน่ใจว่าควรเป็น Community Wiki หรือไม่ หากคุณคิดเช่นนั้นให้ตั้งค่าสถานะสำหรับโมเดอเรเตอร์เพื่อแปลง :)

ภาษานี้จะคล้ายกับ GolfScript มาก มันยังคงเขียนในทับทิม อย่างไรก็ตามมันมีความแตกต่างเล็กน้อย:

  • การใช้`เป็นตัวคั่นสตริงเนื่องจากเป็นอักขระที่ผิดปกติดังนั้นจึงจำเป็นต้องหลีกหนีน้อยกว่า (ตัวละครอื่นสามารถแทนที่ฟังก์ชั่นของมันเช่น#(เพิ่มเติมในภายหลัง)) \`เพื่อหลบหนี backtick \\เพื่อหลบหนี backslash และไม่มีลำดับ escape อื่น ๆ หากคุณต้องการขึ้นบรรทัดใหม่เพียงแค่ขึ้นบรรทัดใหม่ตามตัวอักษรที่แท้จริงในสตริง
  • การใช้รูบี้Rationalสำหรับจุดลอยตัวที่แม่นยำซึ่งเป็นข้อบกพร่องสำคัญอย่างหนึ่งของ GolfScript
  • ความสามารถในการแปลงประเภทเป็นประเภทอื่น ตัวอย่างเช่นคุณสามารถแปลงบล็อกเป็นสตริง
  • นิพจน์ทั่วไป "..."สร้างขึ้นอาจจะมี ผู้ประกอบการจะได้รับการโอเวอร์โหลดสำหรับพวกเขาเช่นกัน ตัวอย่างเช่น"\W"~{`Invalid: non-word character`}{`OK`}if. จะดำเนินการโดยอัตโนมัติเมื่อผลักจากตัวแปรเช่นบล็อก
  • วัตถุไฟล์และวันที่เพื่อทำสิ่งต่าง ๆ ที่เป็นไปไม่ได้ใน GolfScript สิ่งเหล่านี้จะไม่มีตัวอักษร แต่จะมีฟังก์ชั่นสำหรับการเริ่มต้นพวกเขาเช่น`file.txt`fl(ชื่อของฟังก์ชั่นการทำไฟล์อาจเปลี่ยนแปลง)
  • อาจแฮช แต่ฉันไม่แน่ใจในอันนั้น ฉันควร?
  • ฟังก์ชั่นตัวช่วยที่ต้องทำมากยิ่งขึ้น ตัวอย่างเช่น`http://example.com`netสำหรับการเข้าถึงเครือข่าย (อีกครั้งnetผู้ให้บริการอาจถูกเปลี่ยนชื่อ) rbเพื่อดำเนินการสตริงเป็นรหัสทับทิม จะมีอีกมากมายเหล่านี้; ยินดีต้อนรับข้อเสนอแนะ
  • ไม่มีความคิดเห็นดังนั้นจึง#สามารถนำไปใช้อย่างอื่นได้ หากคุณต้องการความคิดเห็น`comment here`;จะทำงานได้ดี (อาจจะ#สามารถแทนที่`ฟังก์ชั่นของ)
  • มันจะถูกเขียนใหม่อย่างสมบูรณ์ในลักษณะที่จะเพิ่มฟังก์ชั่นได้ง่ายขึ้นมาก โดยทั่วไปรหัสจะสามารถอ่านได้มากขึ้น (คุณเห็นแหล่ง GolfScript แล้วหรือยัง:/)
  • มันจะอยู่ใน Github ดังนั้นจึงสามารถทำงานร่วมกันได้ ฉันจะอนุญาตภายใต้ MIT หรืออะไรบางอย่าง
  • ไม่มีการขึ้นบรรทัดใหม่ดังนั้น quines ที่โกงจึงทำงาน: P

และฉันแยกมันออกจากกันเพราะฉันคิดว่ามันเป็นการเปลี่ยนแปลงที่รุนแรงและเป็นประโยชน์มากที่สุด (ยกเว้นอาจเพิ่มจุดลอยตัว):

  • มันจะมีฟังก์ชั่นทับทิมมากมายในตัว ตัวอย่างเช่นshuffle(ซึ่งอาจจะยากsf) (ก่อนหน้านี้มี9 ตัวอักษร ), tr(ก่อนหน้านี้14 ตัวอักษร ), sample( sm, ก่อนหน้านี้.,rand=), flatten( fl, ก่อนหน้านี้ ???) เป็นต้น
  • มันจะถูกรุมเร้าเช่น Rebmu ตัวอย่างเช่นตอนนี้คุณสามารถทำได้~:a0<{0a-}aIF(ใช้ชื่อตัวแปรตัวอักษร) แทน~:$0<{0$-}$if(เขียนทับฟังก์ชั่นการเรียงลำดับ) (ตัวอย่างจากที่นี่ ) โปรดทราบว่าวิธีนี้เป็นแบบไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กและไม่อนุญาตให้ใช้ตัวเลขในชื่อตัวแปร ในความคิดของฉันมันโอเคเพราะมันเป็นภาษากอล์ฟ: P
  • มันจะมีการดีบัก ฉันจะเพิ่มความสามารถในการจัดหาธงที่ระบุตัวคั่นอาเรย์ตัวคั่นองค์ประกอบ ฯลฯ เอาท์พุทตัวเลข (เหตุผลลอยหรือ int?) ก้าวผ่านคำแนะนำทีละครั้ง tokenizing และเอาท์พุทแต่ละโทเค็นแทนการเรียกใช้โปรแกรม เป็นต้น

ดังนั้นคำถามของฉันคือ: มีการปรับปรุงอะไร คุณคิดว่าฉันควรเพิ่มอะไร

ความคิดอื่น ๆ สำหรับเรื่องนี้ก่อนที่ฉันจะเริ่มเขียนโค้ดหรือไม่


จะรู้ว่าถ้าคุณเพิ่ม mushing คุณสูญเสียความไวกรณี
marinus

@marinus ฉันรู้ว่า ฉันควรทำให้ชัดเจน; กำลังแก้ไข ...
Doorknob

สิ่งที่ต้องการจริงๆคือวิธีทำ I / O ที่ชัดเจน (สำหรับโปรแกรมแบบโต้ตอบ) ล่ามสามารถตรวจสอบล่วงหน้าหากโปรแกรมใช้ I / O อย่างชัดเจนและจะทำ I / O โดยนัยหากไม่ได้
marinus

@marinus ยอดเยี่ยมคุณควรเพิ่มเข้าไปในคำตอบแล้ว :)
Doorknob

1
@Claudiu การพัฒนาของฉันในภาษาใหม่ของฉันยังมีชีวิตอยู่แม้ว่าฉันจะยุ่งมากเมื่อเร็ว ๆ นี้ดังนั้นฉันจึงไม่ได้ทำอะไรมากไปสักพัก ความคิดเหล่านี้บางอย่างไม่ใช่ความคิดที่ดีซึ่งฉันไม่ได้ใช้: P
Doorknob

คำตอบ:


17

I / O ที่ยืดหยุ่น

ปัจจุบัน Golfscript ไม่สามารถใช้สำหรับโปรแกรมแบบโต้ตอบได้ ผมเสนอฟังก์ชั่นบางอย่างสำหรับการป้อนข้อมูลที่ชัดเจนถูกเพิ่ม (เช่นreadline, getcharและเพื่อน ๆ ) ล่ามควรดูว่าโปรแกรมใช้สิ่งเหล่านี้ก่อนที่จะรันหรือไม่

หากโปรแกรมไม่เรียกใช้ฟังก์ชันอินพุตใด ๆ ล่ามควรทำหน้าที่เหมือน Golfscript ตามปกติ

ฉันไม่คาดหวังว่าล่ามจะตรวจจับฟังก์ชันอินพุตในโค้ด eval'ed ที่สร้างขึ้นขณะใช้งานจริง แต่ถ้าทำได้


นี่เป็นความคิดที่ดี io จำกัด เป็นหนึ่งในข้อ จำกัด ขนาดใหญ่ของนักกอล์ฟ +1
ลูกบิดประตู

11

บิวด์อินที่สั้นกว่า

นามแฝงอักขระเดียวสำหรับคำสั่งในตัวทั้งหมดที่ไม่มี ผมจะใช้มากขึ้นว่ามันเป็นเพียงแค่baseB


แต่ถ้าคุณใช้bเป็นชื่อตัวแปรล่ะ ยังคง; ความคิดที่ดี; คุณแค่จำไว้ว่าอย่าใช้ชื่อนั้นถ้าคุณจะใช้ฟังก์ชั่นและถ้าคุณไม่ได้ใช้ฟังก์ชั่นมันก็จะไม่ส่งผลกระทบกับคุณเลย
Doorknob

@DoorknobofSnow คุณสามารถใช้บิวด์อิน (และโทเค็นต่างๆเช่น^หรือ$) เป็นชื่อตัวแปรได้แล้ว มันไม่ได้ทำให้ปัญหานั้นแย่ลง นอกจากนี้ฉันแนะนำให้ใช้นามแฝงเพื่อให้เข้ากันได้ย้อนหลังดังนั้นคุณจะต้องใช้ชื่อที่ยาวขึ้นหากคุณกำหนดชื่ออื่นให้กับนามแฝงที่สั้นกว่า
Peter Taylor

4
Zเพราะzipจะมีประโยชน์มาก
Howard

บางทีเราสามารถปล่อยไลบรารีมาตรฐานอย่างเป็นทางการสำหรับ GolfScript แต่ฉันไม่ชัดเจนว่าจะรวมอยู่ในวิธีแก้ปัญหาได้อย่างไร (หายไป#includeและ"#{IO.read'lib'}"~ยาวเกินไป)
Howard

@Howard ตอนนี้ที่คิด ... mylang -Llibname somefile.extฉันสามารถเพิ่มห้องสมุดเป็นภาษาของฉันอาจจะชอบ
ลูกบิดประตู

9

div-mod ที่รวมกัน

นี่คือช่องน้อยกว่าบางส่วนของข้อเสนอแนะ แต่เมื่อทำงานบนโปรแกรมจำนวนทฤษฎีฉันมักพบว่าตัวเองต้องการการดำเนินงานซึ่งปรากฏสองจำนวนเต็มaและbจากกองและผลักดันและa/b a%b(ในปัจจุบันนี้คือ1$1$/@@%)


เนื่องจากเป็นโพรงดังนั้นอาจจะเป็นdvmเพราะ DiV-Mod ขอบคุณสำหรับความคิดเห็นทั้งหมด :-) +1
Doorknob

8

เบอร์

เปลี่ยน lexer ที่นำ 0 ไม่ได้เป็นส่วนหนึ่งของตัวเลข:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

ควรเขียนตัวเลขลบด้วย_แทน:

# current behaviour
1 2-3   # -> -1 3

# new
1 2_3     # -> 1 2 -3

ว้าวน่าสนใจ โดยปกติแล้วคุณจะไม่กดตัวเลขสองตัวติดต่อกัน แต่สิ่งนี้จะช่วยได้มาก สิ่งที่เป็นลบก็ยอดเยี่ยมเช่นกันแทนที่จะ0 100-เป็นลบ 100 +1 +1
Doorknob

1
ฉันเคยคิดเรื่องนี้มาก่อน ไม่ควรมีการสนับสนุนตัวอักษรจำนวนเต็มลบเลย ~มันจัดการแล้วโดย เช่น 0~-1 นี้จะทำให้จำนวนเล็ก ๆ ของตัวเลขอีกต่อไปโดยหนึ่งถ่าน -แต่เอาความจำเป็นบ่อยพอควรสำหรับช่องว่างหลัง
Peter Taylor

เดี๋ยวก่อนคุณจะกด 1001 อย่างไร ฉันคิดว่าคุณหมายถึงเป็นผู้นำศูนย์ไม่ใช่ตาม
Doorknob

@DoorknobofSnow ถูกต้อง
Howard

คุณคิดอย่างไรเกี่ยวกับการทำ{0\-}:~;(จำนวน~ลบ - จำนวน) และใช้notสำหรับบิต (เหมือนand or xor)?
Doorknob

8

เข้าถึงสแต็กทั้งหมด

GolfScript เป็นภาษาที่ใช้สแต็ก แต่การเข้าถึงทั้งหมด แต่รายการสามอันดับแรกบนสแต็ก จำกัด ที่<integer>$จะคัดลอกรายการที่ n มันจะมีประโยชน์ในการมีrollคำสั่งของ PostScript เพื่อให้ง่ายต่อการทำงานกับตัวแปร "live" มากกว่าสามตัว

จะเป็นการดีที่จะมีรุ่นหนึ่ง ARG และสอง ARG แต่ถ้ามีชื่อไม่เพียงพอรอบ ๆ หนึ่ง ARG ควรได้รับการตั้งค่าสำหรับหนึ่งอักขระหนึ่งตัว

one-arg หนึ่งใช้จำนวนไอเท็มที่จะหมุน เช่น1 rollไม่ทำอะไรเลย 2 rollเทียบเท่ากับ\; 3 rollเทียบเท่ากับ@; 4 rollและสำหรับตัวเลขที่สูงกว่านั้นจะไม่เทียบเท่ากัน สิ่งที่ใกล้เคียงที่สุดที่เป็นไปได้คือ

]-4/()\+\+[]*-1%~

(และที่ไม่ได้จัดการที่ไม่ใช่จำนวนเต็มที่ตำแหน่งบางอย่างในกองหรือใช้งาน[และเกือบแน่นอนแบ่งภายในลูปเกินไป)

สองคนหาเรื่องก็ใช้จำนวนม้วน; เทียบเท่ากับa b roll2{a roll}b*


rotateดังนั้นเช่นทับทิม คุณควรแก้ไขสิ่งนี้ในคำตอบ CW
Doorknob

@ doorknob ไม่ ฉันกำลังพูดถึงการใช้งานสแต็คของสแต็กไม่ใช่ในอาเรย์
Peter Taylor

อืม ... ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ฉันไม่คุ้นเคยกับ postscript แต่rollแค่หมุนอาร์เรย์ใช่ไหม
ลูกบิดประตู

@ DoorknobofSnow สแต็ก อาร์เรย์คือรายการที่เกิดขึ้นในสแต็ก
Peter Taylor

โอ้มันจะหมุนทั้งกอง นั่นอาจเป็นประโยชน์! +1
ลูกบิดประตู

8

CJam

ฉันได้ติดตั้ง "GolfScript ที่ได้รับการปรับปรุง" และเรียกว่า CJam - http://sf.net/p/cjam
ตอนนี้ในรุ่นที่สอง (เวอร์ชั่น 0.6) มันมีคุณสมบัติหลายอย่างที่ไม่ได้กล่าวถึงที่นี่ ฉันจะลองรายการพวกเขา:

  • ยังเขียนใน Ruby - nope, java
  • ใช้`เป็นตัวคั่นสตริง - ไม่ แต่จะใช้สตริงที่มีเครื่องหมายคำพูดคู่กับการหลบหนีน้อยที่สุด ( \หนีเท่านั้น\และ")
  • จุดลอย - รองรับ แต่เพียงมาตรฐาน "สอง" ไม่แม่นยำโดยพลการ
  • แปลงประเภทเป็นประเภทอื่น - ใช่
  • นิพจน์ทั่วไป - ยังไม่ได้ แต่วางแผน จะใช้สตริงปกติกับตัวดำเนินการพิเศษ
  • วัตถุไฟล์และวันที่ - ไม่ แต่จะได้รับวันที่ / เวลาปัจจุบัน
  • hashes - สมมติว่าเป็นเหมือน pic dicts หรือ java maps ดังนั้นจึงไม่รองรับ (อาจพิจารณาในอนาคต)
  • ผู้ช่วยทำหน้าที่ได้มากขึ้น - ใช่มาก
  • `http://example.com`net - "example.com"g
  • รันสตริงเป็นรหัสทับทิม - ไม่
  • ไม่มีความคิดเห็น - #ใช้กับสิ่งอื่นอย่างแน่นอน"comments like this";
  • ง่ายต่อการเพิ่มฟังก์ชั่น - ฉันคิดอย่างนั้น แต่ฉันก็มีอคติด้วย :)
  • บน Github - ดียิ่งขึ้น (ในความคิดของฉันโปรดอย่ายิง) - บน SourceForge โดยใช้ hg
  • ได้รับใบอนุญาตภายใต้ MIT - ใช่
  • ไม่มีการขึ้นบรรทัดใหม่ - ถูกต้อง
  • สลับ - mr
  • tr - er
  • ตัวอย่าง - ไม่ได้ทำ _,mr=
  • เรียบ - ไม่เสร็จ แต่อาจทำได้ง่ายกว่า
  • ถูกเลื่อน - ไม่ แต่ตัวระบุไม่จำเป็นต้องแยกออกจากกัน
  • การดีบัก - เพียงร่องรอยสแต็กและedผู้ประกอบการสำหรับการแสดงสแต็ก

  • I / O ที่ยืดหยุ่นได้ - ใช่ แต่มีเพียงอินพุตที่ชัดเจนเท่านั้น

  • บิวด์อินที่สั้นกว่า - ใช่b= base, z= zip
  • แยกนำหน้า 0 - ไม่ แต่สามารถใช้ตัวแปรที่กำหนดไว้ล่วงหน้า
  • กระจ่าง-- ใช่ แต่ไม่ได้มี_; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • หมุน / หมุนสแต็ก - ไม่
  • ชุดอาร์เรย์ - t
  • divmod - md
  • เปลี่ยน lexer (สำหรับตัวระบุ) - ใช่เพิ่มเติมด้านล่าง
  • ผลิตภัณฑ์คาร์ทีเซียน - ไม่เหมือนกันทุกประการ แต่ใช่ m*
  • ตัวดำเนินการ unicode - ไม่
  • ตัวระบุอักขระเดียว - ตัวดำเนินการที่กำหนดไว้ล่วงหน้ามี 1 หรือ 2 ตัวอักษรและตัวแปรเป็นตัวอักษรตัวพิมพ์ใหญ่ตัวเดียว พวกเขาทั้งหมดสามารถต่อกันได้โดยไม่ต้องสับสนกับ lexer / parser
  • ตัวดำเนินการบนบล็อก - ไม่
  • จัดเรียงที่มั่นคง - ใช่
  • เปลี่ยนสัญลักษณ์กลับไปเป็นบล็อคโค้ด - ไม่ แต่อาจเพิ่มในภายหลัง
  • วันที่ / เวลาปัจจุบัน - et
  • args ของบรรทัดคำสั่ง - ea
  • การแยกบิวด์อินอย่างชัดเจน - ใช่ แต่ตัวพิมพ์ใหญ่เป็นตัวแปร บิวด์อินคือหรือเริ่มต้นด้วยตัวพิมพ์เล็กและอักขระพิเศษ
  • ต่ำสุดและสูงสุด - ใช่ปัจจุบันสำหรับ 2 ค่าเท่านั้น: e<,e>
  • ค่าสัมบูรณ์ - z(GolfScript มีabs, ไม่ขาด)
  • ผลรวมและผลิตภัณฑ์ของอาร์เรย์ - :+,:*
  • ระยะทางแมนฮัตตัน - ไม่
  • chr - c(แปลงเป็นอักขระไม่ใช่สตริง)
  • หกสตริงลงบนสแต็ก - สตริง CJam ทำจากตัวอักษรไม่ใช่ตัวเลข ที่จะรั่วไหลตัวละครก็ยังคง{}/
  • รุ่น:ที่กินสิ่งที่เก็บไว้ - ไม่
  • ผู้ประกอบการสำหรับ>=, <=- Nope ใช้<!,>!
  • base64 และ zlib - nope
  • ทางลัดสำหรับ 1 $, 2 $, 3 $, 4 $, 5 $ - ไม่
  • คัดลอกรายการสแต็คสองอันดับแรก - วางแผน สำหรับตอนนี้ใช้1$1$
  • ตัวแปรท้องถิ่น - ไม่
  • ฟีเจอร์ HQ9 + - ไม่ขอบคุณ

CJam มีคุณสมบัติอื่น ๆ อีกมากมายลองดูhttps://sourceforge.net/p/cjam/wiki/Operators/


7
ฉันไม่เห็นด้วยกับ SourceForge และ Mercurial ดีกว่า GitHub
nyuszika7h

1
@ nyuszika7h ไม่เป็นไรเราทุกคนมีความชอบของเรา
aditsu ออกเพราะ SE นั้นชั่วร้าย

ฉันเพิ่งโพสต์คำตอบ CJam แรกของฉันเพราะคำตอบ GolfScript ของฉันอยู่ในความต้องการหมดจดของฟังก์ชัน sqrt ที่เหมาะสม CJam เร็วกว่า GolfScript มาก ๆ !
Dennis


@aditsu คุณคิดว่า CJam เป็นภาษาของ GolfScript หรือภาษาใหม่ที่ได้รับแรงบันดาลใจจาก GolfScript หรือไม่? (นี่คือเหตุผลที่ฉันถาม: codegolf.stackexchange.com/questions/37464/ ...... )
Martin Ender

6

เปลี่ยน lexer

GolfScript lexer ใช้ตัวระบุ Ruby (สิ่งใดก็ตามที่ตรงกับ regex [_a-zA-Z][_a-zA-Z0-9]*) เป็นโทเค็นเดียว หากได้รับการปฏิบัติ[a-zA-Z]+เป็นโทเค็นที่จะเพิ่ม_ขึ้นในตัวและจะช่วยให้ตัวแปรอัลฟาจะตามมาด้วยจำนวนเต็มตามตัวอักษรโดยไม่ต้องแยกช่องว่าง


ตอนนี้ฉันกำลังใช้งานเพียงเล็กน้อย[a-z]+|[A-Z]+เพื่อเพิ่มขีดความสามารถดังนั้นการขีดเส้นใต้จึงไม่มีค่าใช้จ่าย นี่เป็นแนวคิดที่น่าสนใจและไม่เหมือนใคร! +1
ลูกบิดประตู

5

ชื่อแทน Unicode

คำสั่งหลายตัวละครอาจมีนามแฝง unicode สิ่งนี้จะบันทึกคะแนนเมื่อคะแนนถูกนับเป็นตัวอักษรและไม่เป็นไบต์


7
เอ่อ ... เราไม่ต้องการ APL อื่น ...
John Dvorak

1
Golfscript ไม่ได้เป็นอะไรอย่าง APL, Unicode หรือไม่ เรามี APL อื่น ๆ อยู่แล้วเช่น J และ K. (หรือ R ซึ่งดูค่อนข้างแรงบันดาลใจ APL สำหรับฉันจนถึงจุดที่คุณสามารถทำการแปลตามตัวอักษรได้บ่อยครั้ง)
marinus

จุดแตกต่างเกี่ยวกับ APL คือว่ามันใช้มาก charset ที่แตกต่างกันมากกว่าสิ่งอื่นใดไม่ว่าจะใช้คณิตศาสตร์เวกเตอร์โดยกำเนิด ฉันชอบ J ฉันใช้มันและฉันมักตอบ upvote J ฉันยังไม่ได้ตอบคำถาม APL หนึ่งคำตอบ ถ้าฉันต้องการทาสีโปรแกรมแทนการเขียนฉันจะใช้ Piet
John Dvorak

ฉันคิดว่า APL อ่านง่ายกว่า J ชัดเจนกว่า Golfscript แน่นอน
marinus


5

ผู้ประกอบการตั้งค่าอาร์เรย์

["A" "B" "C" "D" "E" "F"] -1 4 S    # -> ["A" "B" "C" "D" -1 "F"]

สิ่งใดในตัวที่เราสามารถให้บริการสำหรับสิ่งนั้น?


+1 ฉันเริ่มเขียนบทความในบล็อกเกี่ยวกับการนำชุดอาร์เรย์มาใช้ แต่ไม่เคยทำเสร็จ ขณะนี้มันยากอย่างยิ่งในการสร้างแบบทั่วไป สิ่งนี้จะสร้างความแตกต่างให้กับความท้าทายบางอย่าง
Peter Taylor

ฉันไม่อยากจะเชื่อเลยว่านี่ไม่ได้ถูกสร้างขึ้นเพื่อนักกอล์ฟแล้ว +1
Doorknob

5

ตัวระบุอักขระเดี่ยว

มันไม่เหมือนวิธีการแก้ปัญหารหัสกอล์ฟจะมีตัวแปรมากเกินไป และมันจะประหยัดพื้นที่


อืม .. สิ่งนี้สามารถทำได้โดยการเปลี่ยน parser บางทีธงเพื่อระบุพฤติกรรมนี้? ความคิดที่ดี! +1
ลูกบิดประตู


3

การสนับสนุน Regex

การขาดการสนับสนุน regex ทำให้ฉันรู้สึกแปลก ๆ ในภาษาที่ออกแบบมาสำหรับการเล่นกอล์ฟ มันคงจะดีถ้ามี

  • <string> <string> <string> y(aka trใช้นามแฝงของ char Perl หนึ่งสำหรับมัน)
  • <string> <string> <string> s (แทน)
  • <string> <string> <block> s (แทนที่ด้วยการโทรกลับ)
  • <string> <string> m (การจับคู่)

ฉันได้พูดถึง regex ในคำถามของฉัน
Doorknob

3

Builtins สำหรับวันที่ / เวลาปัจจุบัน

ขณะนี้มันแปลกมากที่จะได้รับวันที่ / เวลาโดยใช้ Ruby evals

D     # -> [2013 12 31]
T     # -> [23 59 59]

ที่ให้วันที่ / เวลาในลิมาหรือซูลู?
Peter Taylor

@PeterTaylor ไม่ทราบ - เวลากำลังเปลี่ยนแปลง ;-)
Howard

@ howard คุณหมายถึง"เวลาพวกเขากำลังเปลี่ยนแปลง"หรือไม่?
John Dvorak

พูดถึงแล้วว่าเป็นประเภทเวลาใน OP
Doorknob

3

บิวด์อินสร้าง |, & และ ^ ทำสิ่งที่มีประโยชน์บนบล็อก

เช่น<array/string> <block> |สามารถใช้เป็นฟังก์ชั่นดัชนี

[0 -10 -20 30 40 -50 60] {0<} |   # -> [1 2 5]

ความคิดใด ๆ สำหรับ<array/string> <block> &หรือ<array/string> <block> ^?


สิ่งที่ไม่array block =ทำตอนนี้?
John Dvorak

@JanDvorak เปรียบเทียบ "0<" {0<} =ประโยชน์ถ้าคุณต้องการที่จะเปรียบเทียบสตริงเพื่อกระชากเช่น
Howard

คุณต้องการมันบ่อยแค่ไหน? ฉันอยากจะวางและใช้array block =สำหรับ "select by predicate"
John Dvorak

@JanDvorak ,เลือกโดยกริยาจะดำเนินการแล้วโดยใช้
โฮเวิร์ด

โอ้ไม่เป็นไร ไปที่ :-)
John Dvorak

2

วิธีเปลี่ยนสัญลักษณ์กลับเป็นบล็อคโค้ด

ขณะนี้เราสามารถผูกโค้ดบล็อกกับสัญลักษณ์ด้วย:แต่ไม่มีวิธีที่จะย้อนกลับกระบวนการ: การรันสัญลักษณ์ที่ผูกไว้กับบล็อกโค้ดเพียงแค่เรียกใช้บล็อก

ฉันเห็นสองสามวิธีในการใช้สิ่งนี้:

  1. เพิ่มไวยากรณ์ใหม่เช่น#fooเพื่อส่งค่าของfooสแต็กถึงแม้ว่าจะเป็นรหัสบล็อกหรือ

  2. เพิ่มผู้ประกอบการเพื่อขยายทุกสัญลักษณ์ในการป้องกันรหัสเพื่อให้ (ใช้_เป็นผู้ประกอบการใหม่) เช่นจะผลิต{2*}:dbl; {dbl dbl}_{2* 2*}

ฉันเห็นข้อดีของทั้งสองวิธี หลังสามารถใช้แทนสำหรับอดีตที่ค่าใช้จ่ายของทั้งสองตัวอักษรพิเศษ (คน{foo}_แทน#foo) แต่ฉันสามารถดูบางโปรแกรมที่มีศักยภาพสำหรับไวยากรณ์อดีตที่ทั้งสองตัวอักษรจะห้ามปราม (เช่นใช้array #func %แทนarray {func} %)

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


ในกรณีใดกรณีหนึ่งฉันขอเสนอว่าการขยายสัญลักษณ์ที่ผูกไว้กับบิวด์อินดั้งเดิม (เช่นการใช้งานในโค้ด Ruby) ควรส่งสตับบางชนิดที่อาจถูกเรียกเพื่อรับฟังก์ชั่นการใช้งานของบิวด์อิน หรือไม่น่าจะถูกแทนที่ ตัวอย่างเช่น#$(หรือ{$}_) สามารถส่งคืนเช่น{builtin_dollar}ที่builtin_dollarจะมีการใช้งานจริงใน$ตัว (และ#builtin_dollarหรือ{builtin_dollar}_ควรกลับมา{builtin_dollar}เอง)

สิ่งนี้จะทำให้บิวด์อินได้รับการนิยามใหม่โดยไม่สูญเสียการเข้าถึงฟังก์ชั่นของพวกเขา (ดูคำแนะนำก่อนหน้าของฉัน ) ดังนั้นถ้าฉันพูดด้วยเหตุผลบางอย่างที่ต้องการแลกเปลี่ยนความหมายของ$และ@ฉันก็ทำได้#$ #@ :$; :@;(หรือ{$}_ {@}_ :$; :@;)


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

1
[[1] [2] [3]] _ -> [1 2 3]รุ่นที่สองของคุณจะพอดีกันกับผู้ประกอบการเรียบบนอาร์เรย์:
Howard

แล้วผลลัพธ์จะเป็น2:A;{1:A;A}_อย่างไร
Howard

อย่างไร้เดียงสา{1:A;2}(หรือเป็นเรื่องทางเทคนิค{1:A builtin_semicolon 2}หากรวมคุณสมบัติการขยายในตัวไว้ด้วย) ถ้าชนิดของ "การยกเว้นตัวแปรท้องถิ่น" {1:A;A}คุณสมบัติบางอย่างถูกรวมก็มีเหตุผลอาจประเมินเพียง
Ilmari Karonen

{builtin_1 :A builtin_semicolon 2}หรือจะยิ่งขึ้นทางเทคนิค
Howard

1

ตัวแปรที่ตั้งไว้ล่วงหน้าพร้อม args ของบรรทัดคำสั่ง

น่าเสียดายที่ไม่มีถ่านเหลืออยู่ที่ไม่ได้กำหนด แต่บางทีเราสามารถใช้Aมันได้?


_สามารถใช้ได้. บางทีนั่น? อย่างไรก็ตามใช่ golfscript ต้องการวิธีรับ cmd บรรทัด args +1
Doorknob

0

ฟังก์ชัน Native Ruby ที่ฉันควรใช้

นี่คือ Community Wiki; รู้สึกอิสระที่จะแก้ไขและเพิ่มฟังก์ชั่นที่คุณคิดว่าฉันควรจะใช้!

รูปแบบ: " nativeFunctionName( nameInMyLanguage)"

  • shuffle( sf)
  • tr( tr)
  • sample( sm)

0

ใช้คุณสมบัติจาก APL และ HQ9 + ด้วย!

  • ทางลัดเช่นใน APL แก้ไข: เพิ่งเห็นคำตอบ "นามแฝง unicode" นั่นคือสิ่งที่ฉันหมายถึง :)
  • ช็อตคัทการเล่นกอล์ฟอื่น ๆ เช่นใน H9 +, HQ9 +, CHIQRSX9 +

โอเคแล้วคุณจะเสนอสิ่งนั้นอย่างไร มีแนวคิดเฉพาะใดบ้าง
Doorknob

อักขระ Unicode อนุญาตให้ทำสิ่งที่ซับซ้อนในเพียงตัวเดียว
xem

@Doorknob of Snow ฉันได้อัปเดตคำตอบของฉันด้วยทางลัดที่ฉันต้องการดู: ผู้ที่มาจาก APL และผู้ที่มาจาก CHIRQSX9 + :)
xem

อืมสิ่งที่ hq9 + ดูเหมือนว่าจะโกงมากเกินไป :-P
Doorknob

มันกอล์ฟที่มุ่งเน้น: P im ความคิดของฉันภาษาของคุณควรจะทำอย่างน้อยเช่นกัน :)
xem

0

การแยกบิวด์อินอย่างชัดเจน

เช่นเมืองหลวง: ตัว -ins; ทำให้ B เป็นฐานเป็นไปได้


1
ดังกล่าวข้างต้นไม่จำเป็นต้องแยกจากกัน หากใครบางคนชอบที่จะเขียนทับในตัวเขาควรจะสามารถทำเช่นนั้น {-}:+ฉันยังพบโปรแกรมที่มีประโยชน์ของผู้ประกอบการเช่นการเขียนทับ
Howard

ไม่จำเป็นภาษานี้จะไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
Doorknob

2
เนื่องจากเป้าหมายคือให้จังหวะน้อยลงต่อรูการมีความไวของเคสและบิวด์อินเพิ่มเติมจะนำไปสู่การแถลงภารกิจอย่างมีประสิทธิภาพ

0

ตัวแปร / การปิดท้องถิ่น

สิ่งหนึ่งที่ผมจริงๆพลาดใน GolfScript คือความสามารถในการเปลี่ยนค่าของสัญลักษณ์ชั่วคราว

โดยเฉพาะอย่างยิ่งในขณะนี้ยังไม่มีวิธีการแทนที่ความหมายของ "ดั้งเดิม" ในตัวชั่วคราว: เมื่อคุณพูดกำหนดใหม่$คุณจะไม่เรียงลำดับอะไรในโปรแกรมนั้นอีกเลย (อย่างน้อยก็ไม่ต้องเขียนโดยใช้การเรียงลำดับของคุณเองอย่างน้อย) มันเป็นเรื่องดีจริงๆที่สามารถพูดได้ตัวอย่างเช่นในบล็อกรหัสนี้มีความ $หมายอย่างอื่น แต่ยังคงมีความหมายปกติอยู่ที่อื่น

ที่เกี่ยวข้องกับการที่กล่าวมานั้นจะดีจะสัญลักษณ์ผูกในการป้องกันรหัสกับมูลค่าปัจจุบันของพวกเขา แน่นอนว่าฉันสามารถเขียนการพูด{$-1%}:rsortและสามารถที่จะใช้rsortในการจัดเรียงและย้อนกลับอาร์เรย์ แต่ที่ทำงานเพียงตราบเท่าที่ความหมายของ$(หรือ-1หรือ%) ไม่เปลี่ยนแปลงตั้งแต่ฉันฟังก์ชั่นยังคงเรียกสัญลักษณ์ทั่วโลกrsort $มันจะเป็นการดีถ้าคุณสามารถพูดว่า "ปล่อยให้rsortทำสิ่งที่ทำ$-1%อยู่ในปัจจุบันแม้ว่าสัญลักษณ์เหล่านั้นจะถูกนิยามใหม่ในภายหลัง"

โดยเฉพาะอย่างยิ่งไลบรารีมาตรฐานสามารถใช้การรวมชนิดนี้ได้ เป็นชนิดที่น่าแปลกใจที่จะตระหนักว่าการพูด, การเปลี่ยนแปลงnการเปลี่ยนแปลงลักษณะการทำงานของputsหรือที่กําหนด!สมบูรณ์ messes xorup (จากนั้นอีกครั้งควรใช้ความระมัดระวังบางอย่างที่นี่เนื่องจากโดยเฉพาะอย่างยิ่งความสามารถในการเปลี่ยนพฤติกรรมของputsผลัดกันกลายเป็นวิธีเดียวที่จะหลีกเลี่ยงการพิมพ์บรรทัดใหม่สุดท้ายใน GS รุ่นปัจจุบัน)

แก้ไข:ความสามารถในการเปลี่ยนสัญลักษณ์กลับไปเป็นบล็อคโค้ดจะเป็นทางยาวไปสู่การใช้งานฟังก์ชั่นนี้ โดยเฉพาะอย่างยิ่ง{foo}_ไวยากรณ์ที่แนะนำในคำตอบนั้นจะดำเนินการอย่างมีประสิทธิภาพในระดับหนึ่งของการผูกแบบคงที่โดยการขยายสัญลักษณ์ทั้งหมดในบล็อกรหัส รวมเข้ากับfixpoint combinatorเพื่อการจับยึดที่ลึกยิ่งขึ้นและบ็อบเป็นลุงของคุณ ...


มาเลย - ภาษาใหม่ที่แปลกใหม่ฉลองการประเมินผลที่ขี้เกียจ ;-) มาเก็บฟีเจอร์นั้นไว้ใน GolfScript
Howard

ในความคิดที่สอง - คุณพูดถูกมันเป็นคุณสมบัติของการผูกมัดมากกว่าการประเมิน แต่แล้ว - การผูกแบบคงที่นั้นซับซ้อนกว่าเสียงเช่นให้การโทรซ้ำภายในนิยาม
Howard

" rsortทำสิ่งที่ทำ$-1%อยู่ในปัจจุบันแม้ว่าสัญลักษณ์เหล่านั้นจะถูกนิยามใหม่ในภายหลัง" ดังนั้น Emmental?
CalculatorFeline

0

ฟังก์ชั่นเพิ่มเติมในตัว

ทำให้ตัวแปรตัวอักษร az ทั้งหมดและ AZ ดำเนินการฟังก์ชันทั่วไปที่มีประโยชน์ บิวด์อินบางตัวที่ขาด:

  • min และ max: ทั้งหมดหรือบางส่วนของค่าสแต็ค 2 อันดับแรก, ค่า n สแต็คอันดับสูงสุด, บนอาร์เรย์
  • ค่าสัมบูรณ์
  • ผลรวมและผลิตภัณฑ์ของอาร์เรย์ ทำไม{+}*เมื่อคุณสามารถทำS? คุณมี 52 ฟังก์ชั่นสำหรับใช้งานที่นี่!
  • แมนฮัตตันระยะทาง (เช่นx1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1). ตอนนี้มันจะต้องเป็น@-A@@-A+ถ้าAเป็นในตัวค่าสัมบูรณ์ได้รับนี้ขึ้นมา caues ของฉัน. โพสต์ล่าสุดแต่ฉันมักจะคิดว่าจะเป็นวิธีที่ดีในการขยาย golfscript: เขียนลงสิ่งที่ ฟังก์ชั่นจะมีประโยชน์ในการรวบรวมและเพิ่มเป็นบิวด์อิน
  • แปลงจำนวนเต็มเป็นสตริงอักขระหนึ่งตัว (เทียบเท่า python chr)
  • หกสตริงลงบนสแต็ก (ปัจจุบัน{}/)
  • เวอร์ชัน:ที่กินสิ่งที่เก็บไว้ สิ่งนี้จะต้องไม่ติดอยู่กับตัวระบุที่จะเป็นประโยชน์
  • ผู้ประกอบการสำหรับ>=,<=
  • ตามที่มีคนแนะนำวิธีวางตัวแปรที่มีบล็อกไว้บนสแต็กโดยไม่ต้องดำเนินการ เพื่อให้คุณสามารถลดไอเอฟเอของแบบฟอร์ม1{\}{|}ifเพื่อสิ่งที่ต้องการ1?\?|if
  • การแปลง base64 ในตัวและการรองรับ zlib เพื่อให้ข้อมูลการฝังมีอักขระน้อยลง
  • นอกเหนือจาก base64 ให้ทำการเข้ารหัส base93 แบบกำหนดเอง (ใช้อักขระที่พิมพ์ได้ทั้งหมดที่ไม่ใช่ตัวคั่นสตริง)
  • ทางลัดสำหรับ1$, 2$, 3$, 4$,5$
  • ผู้ประกอบการที่จะคัดลอกรายการสแต็คสองอันดับแรกตามที่เป็นอยู่ \.@.@\

-3

มันจะดีถ้าค่าที่เขียนหรือคำนวณในบรรทัดสุดท้ายของฟังก์ชั่นถูกส่งกลับโดยอัตโนมัติ


3
มันเป็นแบบกองซ้อนดังนั้น ...
marinus

1
ไม่มีสิ่งเช่นฟังก์ชั่น
Peter Taylor

ฟังก์ชั่นไม่ส่งคืนสิ่งใด ... และพวกมันถูกเรียกว่าบล็อก
Doorknob

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