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


46

Pythเป็นภาษาโปรแกรมหลามแรงบันดาลใจในการดำเนินการสร้างโดยผู้ใช้ PPCG isaacg

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

กรุณาหนึ่งเคล็ดลับต่อคำตอบ

คำตอบ:


25

เขียนรหัสใน Python ก่อน

Pyth นั้นคล้ายกับ Python ที่ค่อนข้างง่ายในการแปลโปรแกรม Python เป็น Pyth อย่างไรก็ตามเนื่องจาก Pyth เป็นภาษาตัวอักษรตัวเดียวต่อคำสั่งบางครั้งจึงยากที่จะเขียน Pyth แบบตรง โดยการเขียนใน Python ครั้งแรกมีความคิดน้อยในแต่ละครั้ง (เนื่องจาก Python เป็นภาษาที่ใช้ในการเขียนโค้ดได้ง่าย


1
คุณสามารถพูดถึงว่าคุณยังคงสามารถใช้ Python syntax ใน Pyth ได้ดังนั้นคุณสามารถแปลงส่วนของโปรแกรมเป็นรายบุคคลหรือเพียงแค่ใช้ python ถ้าจำเป็น (ตามที่คุณทำที่นี่ )
FryAmTheEggman

@ mbomb007 ดาวน์โหลดล่าม Pyth และอ่านเอกสาร นั่นเป็นวิธีเดียวที่เชื่อถือได้สำหรับการเขียนโปรแกรม Pyth
Justin

@ mbomb007 ขออภัย; นั่นคือวิธีที่ฉันเรียนรู้วิธีการเขียน Pyth (ดูที่ซอร์สโค้ด) โดยทั่วไปไม่มีเอกสารเกี่ยวกับ Pyth; คุณต้องเรียนรู้ไวยากรณ์โดยการลองผิดลองถูก
Justin

22

รู้ว่าตัวแปรของคุณ

Pyth มีตัวแปร 3 ประเภท ได้แก่ ตัวแปรที่เตรียมข้อมูลเบื้องต้นไว้ล่วงหน้าตัวแปรที่กำหนดค่าเริ่มต้นไว้ล่วงหน้าตามอินพุตของผู้ใช้และตัวแปรที่สร้างการกำหนดโดยปริยายเมื่อใช้ครั้งแรก

ตัวแปรทั่วไป:

b = "\n"
d = " "
k = ""
G = "abcdefghijklmnopqrstuvwxyz"
H = {}                            # (empty dict)
N = '"'
T = 10
Y = []
Z = 0

ตัวแปรที่ป้อนค่าเริ่มต้น:

Q = eval(input())
z = input()

โปรดทราบว่าการเริ่มต้นเหล่านี้จะถูกเรียกใช้ในโปรแกรมที่กำหนดหากใช้ตัวแปรที่เกี่ยวข้องนอกสตริงในรหัส นอกจากนี้การสั่งซื้อQแล้วzถ้ามีการใช้ทั้ง

การกำหนดตัวแปรใช้งานครั้งแรก:

JKและ หากคุณต้องการที่จะเริ่มต้นพวกเขาทั้งสองเป็นค่าเดียวกันคุณสามารถทำได้ด้วยการแสดงออกเช่นKJ0ซึ่งเทียบเท่ากับ J0K0lengthier


18

ใช้ล่ามออนไลน์ที่ใหม่กว่าเพื่อทดสอบคำตอบของคุณ

โปรดทราบว่านี่เป็นซอฟต์แวร์ใหม่ดังนั้นจึงอาจมีข้อผิดพลาด กรุณารายงานปัญหาใด ๆ ให้ฉัน


2
! น่ากลัว ฉันไม่พบสิ่งนี้ด้วย google สิ่งที่ฉันต้องการ!
theonlygusti

12

สตริงที่ท้ายบรรทัดไม่จำเป็นต้องมีเครื่องหมายคำพูดสิ้นสุด ตัวอย่างเช่น:

"Hello, world!

เป็นโปรแกรม Hello World ที่ถูกต้องสมบูรณ์


ค่อนข้างชัดเจนจริงๆมันเป็นผล google แรกสำหรับ "ภาษาการเขียนโปรแกรม Pyth" คุณสร้างเพจของคุณเองบน esolangs หรือไม่?
theonlygusti

3
@theonlygusti ใช่ฉันทำ นอกจากนี้ยังไม่ใช่ผลลัพธ์แรกของเดือนตุลาคมปีที่แล้ว
isaacg

9

ใช้Cสำหรับการบีบอัดฐาน

นี่คือไม่มีเอกสารจริง, C บนสตริงจริง ๆ แล้วไม่ได้โดยตรง chr -> int แต่แทนฐาน 256 -> ฐาน 10 (ซึ่งจะเหมือนกันในหนึ่งอักขระถ่าน) สิ่งนี้มีประโยชน์อย่างมากในการบีบอัด int เราสามารถใช้สคริปต์นี้เพื่อบีบอัด:

sCMjQ256

รับ12345678910ก็จะส่งผลในßÜ>(บาง unprintables ในนั้น)

นอกจากนี้ยังมีอาร์เรย์ของ ints คุณสามารถต่อกันและกับสตริงขนาดใหญ่โดยการแปลงเป็นรหัสจุดและถือว่าเป็นฐาน 128 หมายเลข

การใช้งานอื่นCขอบคุณ @xnor ที่แสดงให้ฉันเห็นนี้ทำให้จำนวนมากโดยพลการ วิธีที่ไร้เดียงสาคือ:

^TT

แต่เราสามารถทำหนึ่งไบต์ให้ดีขึ้นด้วย:

CG

ฐานนี้ 256 ถอดรหัสตัวอักษรทั้งหมด ผลการค้นหา156490583352162063278528710879425690470022892627113539022649722= 1.56e62~


เพิ่มไปยัง doc ทันทีแล้ว
isaacg


8

ใช้ฟังก์ชั่นสั้น ๆ ... err ...

เมื่ออาร์กิวเมนต์แลมบ์ดาไปmapหรือreduceเพียงแค่ใช้การดำเนินการหนึ่งที่จะขัดแย้ง ,, คุณสามารถใช้รูปแบบระยะสั้นและM เทียบเท่ากับและเป็นสิ่งเดียวกับ ตัวอย่างเช่นสมมติว่าเรารับรายการตัวเลขเป็นอินพุตและเอาต์พุตที่เพิ่มขึ้นแต่ละครั้ง วิธีแรกอาจจะ:FfMxmfdxfFx.UfbZx

mhdQ

อย่างไรก็ตามสามารถเขียนใหม่เป็น:

hMQ

สิ่งที่คล้ายกันนำไปใช้กับreduce Fตัวอย่างเช่นสมมติว่ามีความท้าทายในการคำนวณผลิตภัณฑ์ของรายการจำนวนเต็ม อีกครั้งลองครั้งแรกอาจจะ:

.U*bZQ

อย่างไรก็ตามด้วยFที่สามารถย่อให้เป็น:

*FQ

กำจัดสามไบต์ ... ไม่เลว!


และคุณไม่ต้องการQเนื่องจากจะมีการเสริมเมื่อฟังก์ชั่นขาดอินพุททำให้มันเป็นไปได้*F
Stan Strum

7

ทำให้การใช้งาน Pyth ของคุณทันสมัยอยู่เสมอ

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

คุณลักษณะที่เพิ่งเพิ่มบางอย่าง: (ณ วันที่ 10/19/14)

y: ทำหน้าที่เหมือนกับ*2ตัวเลขและเป็นรายการของชุดย่อยทั้งหมดในสตริงและรายการ ตัวอย่างเช่น

pyth -c 'y"abc'
['', 'a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']

f: fเป็นคำสั่งตัวกรอง ตอนนี้เมื่อเรียกด้วยตัวเลขเป็นอาร์กิวเมนต์ที่สองมันจะกรองลำดับอนันต์ที่เริ่มต้นด้วยตัวเลขนั้นและนับขึ้นจากนั้นส่งกลับองค์ประกอบแรกของลำดับผลลัพธ์

ตัวอย่างเช่นต่อไปนี้เป็นรหัสเพื่อค้นหานายกที่เล็กที่สุดกว่าหนึ่งพันล้าน:

pyth -c 'f!tPT^T9'
1000000007

ดูคนที่เป็นเหมือนการเพิ่มประโยชน์ แต่สิ่งที่คุณสามารถใช้แทนของเดิมyz? mvdczdไม่สามารถเป็นทางที่สั้นที่สุด ...
เดนนิส

1
@Dennis ฉันขว้างออกไปyเพราะฉันไม่คิดว่า Pyth จำเป็นต้องมีรูปแบบอินพุตแยกวิเคราะห์ที่ง่ายสุด ๆ หลายรูปแบบเช่นเดียวกับรูปแบบ Python ใช่ฉันคิดว่าน่าmvdczdจะต้องทำอย่างน่าเสียดาย
isaacg

@Dennis ปัญหาได้รับการแก้ไขเพียงเพิ่มสิ่งนี้ไปยังrชุดการประมวลผลของสตริง
isaacg

rดูมีประโยชน์ทีเดียว
เดนนิส

@isaacg ขออภัยหากนี่ไม่ใช่หัวข้อ แต่ฉันสงสัยว่าจะใช้การดำเนินการรูท@ใน Fdr1 + 1 @ Q2Iq% Qd0d เพื่อสร้างเครื่องคิดเลขได้อย่างไร เมื่อฉันพยายามที่จะใช้มันเริ่มต้นที่indexความหมายแทน มีวิธีการแก้ไขพฤติกรรมนี้หรือไม่?
StardustGogeta

5

อาร์กิวเมนต์ที่มีชื่อในฟังก์ชั่น (ไม่รองรับอีกต่อไป)

บางครั้งค่าเริ่มต้นในฟังก์ชั่นอาจมีประโยชน์สำหรับการเล่นกอล์ฟ Pyth รองรับสิ่งนี้จริง ๆ (ทำให้ฉันประหลาดใจมาก) ตัวอย่างเช่น:

DC=Z1RZ;C;C5

จะพิมพ์:

1
5

คุณยังสามารถใช้ J และ K เพื่อบันทึกอักขระเมื่อทำสิ่งนี้:

DgJ1K1R+JKg;g2;g2 3

พิมพ์:

2
3
5

ซึ่งมักจะมีประโยชน์สำหรับอัลกอริทึมแบบเรียกซ้ำ

สิ่งนี้ใช้งานไม่ได้อีกต่อไป แต่ฉันทิ้งไว้ที่นี่ในกรณีที่มีคนต้องการเล่นกอล์ฟโดยใช้ Pyth รุ่นเก่า


16
ว้าว - ถึงแม้ฉันจะไม่ทราบว่าพีธี้สนับสนุนเรื่องนี้และฉันก็เขียนภาษา!
isaacg

น่าเสียดายที่นี่ไม่สามารถใช้งานได้กับ Pyth รุ่นล่าสุด
isaacg

เคล็ดลับนี้ควรถูกลบเหมือนหนึ่งในเคล็ดลับที่ล้าสมัยอื่น ๆ หรือไม่? มิฉะนั้นควรทำเครื่องหมายด้วยคำแนะนำเวอร์ชันนี้
mbomb007

@ mbomb007 ฉันตั้งใจจะหาเวอร์ชั่น แต่ฉันขี้เกียจเกินไป อย่าลบทิ้งถ้าคุณคิดว่ามันจะดีกว่านี้จนกว่าฉันจะเจอมัน
FryAmTheEggman

@FryAmTheEggman ฉันคิดว่ามันขึ้นอยู่กับคุณเพราะมันบอกว่าอยู่ในชื่อที่ไม่ได้รับการสนับสนุน
mbomb007

5

เปิดตัว 2 องค์ประกอบ tuples ด้วย F

สมมติว่าคุณมี 2 องค์ประกอบ tuple J = (a, b)และคุณต้องการr(a,b)สำหรับฟังก์ชัน arity 2 อัน r

rhJeJวิธีที่ไร้เดียงสาที่จะทำเช่นนี้คือ

วิธีที่ยอดเยี่ยมในการทำเช่นนี้คือการr.*Jใช้ตัวดำเนินการ unpack

วิธีแฟนซีในการทำเช่นนี้คือการrFJใช้ตัวดำเนินการแบบพับ


มันยังคงเป็นไปได้ที่จะใช้.uสำหรับการที่? .uดูเหมือนว่าจะลดลงสะสมในขณะนี้
Ven

.u ->. * นี่เป็นการเปลี่ยนแปลงที่เกิดขึ้นเมื่อไม่นานมานี้ แต่ไม่เคยอัพเดท
isaacg

4

ใช้ฟังก์ชันเลขคณิตสั้น ๆ

h: อื่น ๆ กว่าจะกลับองค์ประกอบแรกของรายการก็เพิ่มขึ้นเป็นจำนวนมากเช่นประเมินhT สั้นกว่า 11+1T

t: นี่ decrements จำนวน (นอกเหนือจากผลตอบแทนที่หางของรายการ) เช่นประเมินtT สั้นกว่า9-T1

y: คู่นี้เป็นจำนวนมากเช่นyTประเมินจะ20สั้นกว่าหรือ*T2+TT


4

ใช้mapเพื่อสร้างรายการ

โดยพื้นฐานแล้วเทียบเท่ากับความเข้าใจในรายการแฟนซีของไพ ธ อน ใช้รายการที่มีอยู่หรือช่วงเพื่อวนซ้ำและแมปค่าแต่ละค่าแม้ว่าค่าไม่สำคัญ

สองตัวอย่าง:

  • สร้างรายการ 8 ศูนย์

    mZ8 แทน *8]Z

  • สร้างรายการ 5 หมายเลขสุ่มระหว่าง 0 และ 9:

    mOT5 แทน V5~Y]OT)

    รายการที่สองกำหนดรายการให้โดยอัตโนมัติY(จริง ๆ แล้วมันจะผนวกเข้ากับ Y) แต่=YmOTU5ก็สั้น


4

โดยนัย Q ที่ EOF

นี่คือการเปลี่ยนแปลงใหม่ ณ วันนี้

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

วิธีที่สั้นที่สุดในการเขียนมันเป็นเช่นนี้:

@,/Q2h*3QQ

อย่างไรก็ตามเนื่องจากQs มีความชัดเจนในตอนท้ายของไฟล์เราจึงสามารถเขียน:

@,/Q2h*3

กำลังบันทึก 2 ไบต์

โปรดทราบว่าฟังก์ชั่นที่มีข้อโต้แย้งที่ไม่จำเป็นจะต้องไม่มีข้อโต้แย้งดังกล่าวตัวอย่างเช่นc"12 12"จะไม่ได้มีนัยโดยนัยQเนื่องจากcต้องการเพียง 1 อาร์กิวเมนต์เท่านั้น


3

ใช้ลดเพื่อใช้ฟังก์ชั่นซ้ำ ๆ

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

@,/Q2h*Q3Q

วิธีที่ชัดเจนที่สุดในการใช้ 100 ครั้งนี้และพิมพ์ผลลัพธ์จะเป็น

V100=Q@,/Q2h*Q3Q;Q

วนซ้ำ 100 ครั้งอัพเดตค่า Q ในแต่ละครั้งจากนั้นจบการวนซ้ำและพิมพ์ Q

แต่เราสามารถใช้ฟังก์ชั่นลดซึ่งไม่สนใจตัวแปรลำดับ ( H)

u@,/G2h*G3GU100Q

สั้นกว่านี้ 2 ตัวอักษร สั้นลง 3 ตัวอักษรหากคุณพยายามวนซ้ำหลายครั้งตามลำดับ


3

มักจะมีทางเลือกที่สั้นกว่าใด ๆ

.Emเมื่อคุณต้องการที่จะหาผู้ใดในลำดับตามเงื่อนไขที่คุณมักจะใช้ ตัวอย่างเช่นหากคุณต้องการทราบว่ามีรายการใดในรายการมากกว่าหรือเท่ากับ 5:

.Emgd5Q

แต่ถ้ามันต้องเป็นความจริง / เท็จไม่จริง / เท็จsmจะทำงานได้เพราะผลรวมทำงานใน bools

smgd5Q

เราสามารถทำได้สั้นกว่านี้ด้วยfilter:

fgT5Q

สุดท้ายดูเหมือนว่าน่าเกลียดจริงๆ

สำหรับ.All สิ่งเดียวที่ฉันคิดได้ก็คือใช้เงื่อนไขตรงกันข้ามและลบล้างมันเพื่อประหยัดถ่านหนึ่งตัว.Am:

!f<T5Q

3

ดูตัวเลือกโฟลว์การควบคุมทั้งหมด

ลูป:

F: สำหรับลูป เช่นเดียวกับ Python

V: สำหรับการวนซ้ำในช่วง ต้องกำหนดตัวแปรหรือช่วงไม่ให้สั้นลงดังนั้น 2 ตัวอักษร

W: ในขณะที่วง เช่นเดียวกับ Python

#: ไม่มีที่สิ้นสุดในขณะที่วง หลบหนีด้วยข้อผิดพลาดหรือตัวแบ่งที่ชัดเจน ฟีเจอร์เฉพาะtry ... exceptตอนนี้ใน Pyth

ฟังก์ชั่น:

D: นิยามทั่วไป เช่นเดียวกับงูหลาม

L: 1 อาร์กิวเมนต์ไม่มีฟังก์ชันการมอบหมายเช่น Lambda ของ Python แต่มีชื่อ Rไม่จำเป็นต้องระบุชื่อฟังก์ชันชื่อตัวแปรและ Return ( ) ดังนั้นจึงมีความยาว 3 ตัวอักษร

ฟังก์ชั่นการเขียนโปรแกรม:

f: ตัวกรอง - องค์ประกอบที่เลือกของลำดับการป้อนข้อมูลที่กลับมาจริงในแลมบ์ดาอินพุต

f: จำนวนเต็มแรกมากกว่าหรือเท่ากับอินพุตซึ่งให้ผลลัพธ์ตัวกรองตามจริง

m: แผนที่ - แปลงองค์ประกอบของลำดับการป้อนข้อมูลโดยใช้แลมบ์ดาอินพุต

u: ย่อ - ลดลำดับการป้อนข้อมูลบนแลมบ์ดาอินพุตโดยเริ่มต้นการสะสมเป็นอาร์กิวเมนต์ที่สาม

o: การสั่งซื้อ - องค์ประกอบที่เก่ากว่าของลำดับการป้อนข้อมูลโดยใช้แลมบ์ดาเป็นคีย์

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


.xสามารถใช้งานได้นานกว่าสำหรับบล็อกแบบลองยกเว้น
mbomb007

@ mbomb007 มีวิธีที่จะละเลยยกเว้นบล็อกฉันหมายความว่าจะว่างเปล่าได้ไหม? ตัวอย่างเช่น: .x{some_statments}{except_block - can this be empty}.
Gurupad Mamadapur

@GurupadMamadapur # ... Bสามารถใช้วิธีนี้หากคุณไม่ได้อยู่ในการแสดงออก
isaacg

3

สลับสององค์ประกอบในรายการ

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

วิธี Tmp- ตัวแปร

ในการเตรียมการเรากำหนดรายการYและเติมด้วยตัวเลขบางส่วน เป้าหมายคือการสลับองค์ประกอบที่สองและสาม

=Y[1 3 5 3 6 7)AGH,1 2

เราก็กำหนดตัวแปรแฟ้ม tmp J = Q[G]ทำรายการแรกที่ได้รับมอบหมายแล้วที่สองโอนสิทธิครั้งล่าสุดY[G] = Y[H] เคล็ดลับที่นี่คือการทำรังทั้งสองได้รับมอบหมายรายการเพื่อให้คุณไม่ต้องพิมพ์ปราบและไม่ได้มีการใช้สองครั้งเพื่อดูY[H] = JY

J@YGXXYG@YHHJ

แทน

J@YG XYG@YHXYHJ

วิธีการแปล

หากองค์ประกอบที่คุณต้องการเปลี่ยนมีความเป็นเอกลักษณ์ในรายการให้ใช้วิธีการนี้ มันสั้นจริงๆ ดังนั้นเวลานี้เราสลับองค์ประกอบที่หนึ่งและสาม (ค่า1และ5ไม่ซ้ำกัน)

=Y[1 3 5 3 6 7)K,Z2

ใช้ฟังก์ชันการแปลของรายการ:

XYm@YdK)

แปลนี้แทนที่ทุกองค์ประกอบY[0]กับY[1]คนและทุกที่มีY[1] Y[0]ดังนั้นหากคุณค่านั้นไม่เหมือนกันสิ่งเลวร้ายก็เกิดขึ้น ยกตัวอย่างเช่นผลในการK,1 2[1, 5, 3, 5, 6, 7]

ขอให้สังเกตว่าวงเล็บปิดเป็นตัวเลือกถ้าคำสั่งเป็นวงเล็บสุดท้ายในรหัสของคุณ


3

แก้ไขข้อบกพร่องด้วย <newline>

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

FN.:Q2                loop
      =Y+-Y-FNhN      some random command
                Y     print intermediate result
                 ;Y   end for loop and print result

แต่โปรแกรม Pyth จำนวนมากใช้องค์ประกอบของฟังก์ชันการเขียนโปรแกรมเช่นแผนที่ตัวกรองและการลดขนาดซึ่งไม่อนุญาตให้พิมพ์แบบง่าย ๆ แต่มันยังคงเป็นไปได้โดยใช้\nคำสั่ง

รหัสเดียวกันโดยใช้u(ลด) จะเป็น: ( Permalink )

u        .:Q2Y   reduce .:Q2, start with G = Y
 +-G-FHhH        random command

ถ้าคุณต้องการพิมพ์ค่ากลางเพียงแค่แทรก\n: ( Permalink )

u         .:Q2Y   reduce
   \nG             print(G)
 +-\nG-FHhH        random command

\naพิมพ์บนบรรทัดใหม่และผลตอบแทนa aดังนั้นคุณสามารถแทรกได้ทุกที่โดยไม่ต้องเปลี่ยนฟังก์ชั่นการทำงานของโปรแกรม


ปัจจุบันคุณสามารถใช้การขึ้นบรรทัดใหม่สำหรับสิ่งนี้ซึ่งพิมพ์บรรทัดใหม่
PurkkaKoodari

@ Pietu1998 ใช่ฉันใช้มันตลอดเวลา ถึงเวลาอัพเดทโพสต์
Jakube

3

การหาจำนวนเต็มสูงสุดสองตัว

g#

ตัวอย่างเช่นสมมติว่าคุณมีและJ=5 K=12จากนั้นg#JK= 12 และg#KJ= 12 เช่นกัน

สิ่งนี้ถูกค้นพบโดย @ Pietu1998 ผู้ซึ่งคิดแบบนี้:

ไม่แน่ใจว่ามีคนพบแล้วมัน แต่มีวิธีที่เย็นจะทำ max (A, B) ใน 2 ไบต์ไม่จำเป็นต้องใช้ eS,AB3 g#ABทำสิ่งเดียวกัน (มันไม่มีประสิทธิภาพมากเพราะมันวนครั้งสูงสุด (1, A-B + 1) ครั้งการเพิ่มประสิทธิภาพคือการใส่ตัวเลขที่มีแนวโน้มว่าจะใหญ่กว่าเป็น B. )


@Jakube นี่เป็นเรื่องจริง เห็นได้ชัดว่าฉันทำอะไรบางอย่างผิดพลาดขณะที่พิมพ์ในการแชท
PurkkaKoodari

2

joinวิธีการของ Pyth

joinวิธีการในหลามสามารถมักจะเป็นที่น่ารำคาญนิด ๆ หน่อย ๆ เพราะมันเพียงร่วมสตริง Pyth joinเป็นคนใจกว้างมากขึ้น มันเปลี่ยนวัตถุทั้งหมดในสตริงโดยค่าเริ่มต้น

เช่นjkUTให้0123456789หรือjb["abc"4,5\f]7ให้

abc
4
(5, 'f')
[7]

เมื่อเร็ว ๆ นี้มีการเพิ่มฟังก์ชั่นการแปลงเป็นสตริงมากขึ้นอาร์กิวเมนต์แรกถูกรวมเข้ากับสตริงเช่นj2\a\b->"a2b"
isaacg

1

การบอกจำนวนถ้าเป็นจำนวนเต็ม

เคล็ดลับเรียบร้อยใช้Invariant เพื่อบอกว่าตัวเลขเป็นจำนวนเต็มเช่น:

sI

การตรวจสอบนี้จะตรวจสอบว่าหมายเลขไม่เปลี่ยนแปลงเมื่อคุณตัดทอนหรือไม่

ตัวอย่างเช่นคุณสามารถใช้สิ่งนี้เป็นตารางตรวจสอบที่สมบูรณ์แบบ:

sI@Q2

1

ใช้บรรจุ Pyth

Packed Pyth เป็น "ภาษาการเขียนโปรแกรม" ใหม่ซึ่งเหมือนกับ Pyth ยกเว้นว่ามันใช้ 7 บิตต่อตัวอักษรแทนที่จะเป็น 8 บิตต่อตัวอักษร

ที่จะใช้มันโคลนที่เก็บ pyth ไฟล์packed-pyth.pyนี้เป็นล่าม

"Hello, world!บอกว่ารหัสของคุณ

ก่อนอื่นให้วางไว้ในไฟล์: echo -n '"Hello, world!' > code.pyth

จากนั้นแพ็ครหัส Pyth ลงในไฟล์ Packed Pyth: python3 packed-pyth.py -p code.pyth code.ppyth

ในที่สุดให้รันรหัส Packed Pyth: python3 packed-pyth.py code.ppyth

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

upside:

  • รหัสสั้นลง 1 / 8th

Downside:

  • ASCII เท่านั้น

  • ไม่มีอินพุตแบบโต้ตอบ

  • ตัวเลือกการดีบักแบบเต็มจะไม่มีประโยชน์

  • การรายงานข้อผิดพลาดแย่ลง


1
เหมือนที่เราทำเพื่อเซฟโหมดเราสามารถย้ายมันไปเป็นธงได้หรือไม่?
Maltysen

นี่เป็น btw ที่ยอดเยี่ยม: D
Maltysen

@ Maltysen ฉันคิดว่ามันจะเพิ่มคะแนนไบต์หนึ่ง
isaacg

ไม่สามารถบรรจุ Pyth ได้อีกเนื่องจากใช้เพียง ASCII ที่พิมพ์ได้หรือไม่
lirtosiast

1

การทดสอบการแบ่งแยกโดยใช้Iและ GCD

คำเตือน:นี้เท่านั้นทำงานสำหรับ integers เชิงลบ

ในการตรวจสอบว่ามีจำนวนเต็มสองจำนวนที่ไม่เป็นลบหรือไม่คุณสามารถทำสิ่งต่อไปนี้:

iI<divisor><dividend>

หากหารด้วยและ≥ข≥ 0แล้วgcd (A, B) = b

ไม่จำเป็นต้องบันทึกเป็นไบต์!%<dividend><divisor>แต่อาจทำให้คุณประหยัดเนื่องจาก:

  • คุณอาจสามารถปรับแต่งสิ่งที่เป็นนัยในตอนท้ายของโปรแกรม Pyth (เช่นหยดQ) เมื่อทำงานกับเงินปันผล
  • คุณสามารถใช้มันเป็น a <pfn>เนื่องจากมันเป็นฟังก์ชั่นในตัว
  • 0จะจัดการโดยโมดูโล

ลองมัน!


ข้อได้เปรียบอีกข้อหนึ่ง: iIเป็นฟังก์ชั่นของตัวเองในขณะที่!%ไม่ใช่ดังนั้นคุณสามารถใช้เป็นฟังก์ชั่นนำหน้าได้
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณที่เพิ่มไว้ในรายการข้อดี :)
Mr. Xcoder

0

การกำหนดตัวแปรให้กับฟังก์ชันที่ใช้กับตัวเอง

หากคุณมีฟังก์ชั่นของ arity 1 และต้องการใช้สิ่งนั้นกับตัวแปรและนำไปใช้กับตัวเองคุณสามารถใช้ไวยากรณ์ต่อไปนี้:

=<function><variable>

แทน:

=<variable><function><variable>

ตัวอย่างเช่นหากคุณต้องการเพิ่มตัวแปรZคุณสามารถทำได้:

=hZ

=ZhZซึ่งจะช่วยประหยัดมากกว่าหนึ่งไบต์

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