Pythเป็นภาษาโปรแกรมหลามแรงบันดาลใจในการดำเนินการสร้างโดยผู้ใช้ PPCG isaacg
คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Pyth? ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะเจาะจงกับ Pyth
กรุณาหนึ่งเคล็ดลับต่อคำตอบ
Pythเป็นภาษาโปรแกรมหลามแรงบันดาลใจในการดำเนินการสร้างโดยผู้ใช้ PPCG isaacg
คุณมีเคล็ดลับอะไรสำหรับการเล่นกอล์ฟใน Pyth? ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะเจาะจงกับ Pyth
กรุณาหนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
Pyth นั้นคล้ายกับ Python ที่ค่อนข้างง่ายในการแปลโปรแกรม Python เป็น Pyth อย่างไรก็ตามเนื่องจาก Pyth เป็นภาษาตัวอักษรตัวเดียวต่อคำสั่งบางครั้งจึงยากที่จะเขียน Pyth แบบตรง โดยการเขียนใน Python ครั้งแรกมีความคิดน้อยในแต่ละครั้ง (เนื่องจาก Python เป็นภาษาที่ใช้ในการเขียนโค้ดได้ง่าย
Pyth มีตัวแปร 3 ประเภท ได้แก่ ตัวแปรที่เตรียมข้อมูลเบื้องต้นไว้ล่วงหน้าตัวแปรที่กำหนดค่าเริ่มต้นไว้ล่วงหน้าตามอินพุตของผู้ใช้และตัวแปรที่สร้างการกำหนดโดยปริยายเมื่อใช้ครั้งแรก
b = "\n"
d = " "
k = ""
G = "abcdefghijklmnopqrstuvwxyz"
H = {} # (empty dict)
N = '"'
T = 10
Y = []
Z = 0
Q = eval(input())
z = input()
โปรดทราบว่าการเริ่มต้นเหล่านี้จะถูกเรียกใช้ในโปรแกรมที่กำหนดหากใช้ตัวแปรที่เกี่ยวข้องนอกสตริงในรหัส นอกจากนี้การสั่งซื้อQ
แล้วz
ถ้ามีการใช้ทั้ง
J
K
และ หากคุณต้องการที่จะเริ่มต้นพวกเขาทั้งสองเป็นค่าเดียวกันคุณสามารถทำได้ด้วยการแสดงออกเช่นKJ0
ซึ่งเทียบเท่ากับ J0K0
lengthier
โปรดทราบว่านี่เป็นซอฟต์แวร์ใหม่ดังนั้นจึงอาจมีข้อผิดพลาด กรุณารายงานปัญหาใด ๆ ให้ฉัน
สตริงที่ท้ายบรรทัดไม่จำเป็นต้องมีเครื่องหมายคำพูดสิ้นสุด ตัวอย่างเช่น:
"Hello, world!
เป็นโปรแกรม Hello World ที่ถูกต้องสมบูรณ์
C
สำหรับการบีบอัดฐานนี่คือไม่มีเอกสารจริง, C บนสตริงจริง ๆ แล้วไม่ได้โดยตรง chr -> int แต่แทนฐาน 256 -> ฐาน 10 (ซึ่งจะเหมือนกันในหนึ่งอักขระถ่าน) สิ่งนี้มีประโยชน์อย่างมากในการบีบอัด int เราสามารถใช้สคริปต์นี้เพื่อบีบอัด:
sCMjQ256
รับ12345678910
ก็จะส่งผลในßÜ>
(บาง unprintables ในนั้น)
นอกจากนี้ยังมีอาร์เรย์ของ ints คุณสามารถต่อกันและกับสตริงขนาดใหญ่โดยการแปลงเป็นรหัสจุดและถือว่าเป็นฐาน 128 หมายเลข
การใช้งานอื่นC
ขอบคุณ @xnor ที่แสดงให้ฉันเห็นนี้ทำให้จำนวนมากโดยพลการ วิธีที่ไร้เดียงสาคือ:
^TT
แต่เราสามารถทำหนึ่งไบต์ให้ดีขึ้นด้วย:
CG
ฐานนี้ 256 ถอดรหัสตัวอักษรทั้งหมด ผลการค้นหา156490583352162063278528710879425690470022892627113539022649722
= 1.56e62
~
เอกสารฉบับเต็มจะถูกเพิ่มในภายหลัง
เมื่ออาร์กิวเมนต์แลมบ์ดาไปmap
หรือreduce
เพียงแค่ใช้การดำเนินการหนึ่งที่จะขัดแย้ง ,, คุณสามารถใช้รูปแบบระยะสั้นและM
เทียบเท่ากับและเป็นสิ่งเดียวกับ ตัวอย่างเช่นสมมติว่าเรารับรายการตัวเลขเป็นอินพุตและเอาต์พุตที่เพิ่มขึ้นแต่ละครั้ง วิธีแรกอาจจะ:F
fMx
mfdx
fFx
.UfbZx
mhdQ
อย่างไรก็ตามสามารถเขียนใหม่เป็น:
hMQ
สิ่งที่คล้ายกันนำไปใช้กับreduce
F
ตัวอย่างเช่นสมมติว่ามีความท้าทายในการคำนวณผลิตภัณฑ์ของรายการจำนวนเต็ม อีกครั้งลองครั้งแรกอาจจะ:
.U*bZQ
อย่างไรก็ตามด้วยF
ที่สามารถย่อให้เป็น:
*FQ
กำจัดสามไบต์ ... ไม่เลว!
Q
เนื่องจากจะมีการเสริมเมื่อฟังก์ชั่นขาดอินพุททำให้มันเป็นไปได้*F
ฉันกำลังปรับปรุง 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
ไม่สามารถเป็นทางที่สั้นที่สุด ...
y
เพราะฉันไม่คิดว่า Pyth จำเป็นต้องมีรูปแบบอินพุตแยกวิเคราะห์ที่ง่ายสุด ๆ หลายรูปแบบเช่นเดียวกับรูปแบบ Python ใช่ฉันคิดว่าน่าmvdczd
จะต้องทำอย่างน่าเสียดาย
r
ชุดการประมวลผลของสตริง
r
ดูมีประโยชน์ทีเดียว
@
ใน Fdr1 + 1 @ Q2Iq% Qd0d เพื่อสร้างเครื่องคิดเลขได้อย่างไร เมื่อฉันพยายามที่จะใช้มันเริ่มต้นที่index
ความหมายแทน มีวิธีการแก้ไขพฤติกรรมนี้หรือไม่?
บางครั้งค่าเริ่มต้นในฟังก์ชั่นอาจมีประโยชน์สำหรับการเล่นกอล์ฟ Pyth รองรับสิ่งนี้จริง ๆ (ทำให้ฉันประหลาดใจมาก) ตัวอย่างเช่น:
DC=Z1RZ;C;C5
จะพิมพ์:
1
5
คุณยังสามารถใช้ J และ K เพื่อบันทึกอักขระเมื่อทำสิ่งนี้:
DgJ1K1R+JKg;g2;g2 3
พิมพ์:
2
3
5
ซึ่งมักจะมีประโยชน์สำหรับอัลกอริทึมแบบเรียกซ้ำ
สิ่งนี้ใช้งานไม่ได้อีกต่อไป แต่ฉันทิ้งไว้ที่นี่ในกรณีที่มีคนต้องการเล่นกอล์ฟโดยใช้ Pyth รุ่นเก่า
F
สมมติว่าคุณมี 2 องค์ประกอบ tuple J = (a, b)
และคุณต้องการr(a,b)
สำหรับฟังก์ชัน arity 2 อัน r
rhJeJ
วิธีที่ไร้เดียงสาที่จะทำเช่นนี้คือ
วิธีที่ยอดเยี่ยมในการทำเช่นนี้คือการr.*J
ใช้ตัวดำเนินการ unpack
วิธีแฟนซีในการทำเช่นนี้คือการrFJ
ใช้ตัวดำเนินการแบบพับ
.u
สำหรับการที่? .u
ดูเหมือนว่าจะลดลงสะสมในขณะนี้
h
: อื่น ๆ กว่าจะกลับองค์ประกอบแรกของรายการก็เพิ่มขึ้นเป็นจำนวนมากเช่นประเมินhT
สั้นกว่า 11
+1T
t
: นี่ decrements จำนวน (นอกเหนือจากผลตอบแทนที่หางของรายการ) เช่นประเมินtT
สั้นกว่า9
-T1
y
: คู่นี้เป็นจำนวนมากเช่นyT
ประเมินจะ20
สั้นกว่าหรือ*T2
+TT
map
เพื่อสร้างรายการโดยพื้นฐานแล้วเทียบเท่ากับความเข้าใจในรายการแฟนซีของไพ ธ อน ใช้รายการที่มีอยู่หรือช่วงเพื่อวนซ้ำและแมปค่าแต่ละค่าแม้ว่าค่าไม่สำคัญ
สองตัวอย่าง:
สร้างรายการ 8 ศูนย์
mZ8
แทน *8]Z
สร้างรายการ 5 หมายเลขสุ่มระหว่าง 0 และ 9:
mOT5
แทน V5~Y]OT)
รายการที่สองกำหนดรายการให้โดยอัตโนมัติY
(จริง ๆ แล้วมันจะผนวกเข้ากับ Y) แต่=YmOTU5
ก็สั้น
นี่คือการเปลี่ยนแปลงใหม่ ณ วันนี้
Q
เป็นตัวแปรที่เริ่มต้นอัตโนมัติไปยังอินพุตที่ประเมิน มันจะถูกผนวกเข้ากับโปรแกรม Pyth โดยปริยายหลายครั้งเท่าที่จำเป็นเพื่อให้ arity ทำงานได้ หากต้องการดูตัวอย่างวิธีใช้สิ่งนี้ในการเล่นกอล์ฟสมมติว่าเราต้องการคำนวณฟังก์ชัน Collatzของอินพุต
วิธีที่สั้นที่สุดในการเขียนมันเป็นเช่นนี้:
@,/Q2h*3QQ
อย่างไรก็ตามเนื่องจากQ
s มีความชัดเจนในตอนท้ายของไฟล์เราจึงสามารถเขียน:
@,/Q2h*3
กำลังบันทึก 2 ไบต์
โปรดทราบว่าฟังก์ชั่นที่มีข้อโต้แย้งที่ไม่จำเป็นจะต้องไม่มีข้อโต้แย้งดังกล่าวตัวอย่างเช่นc"12 12"
จะไม่ได้มีนัยโดยนัยQ
เนื่องจากc
ต้องการเพียง 1 อาร์กิวเมนต์เท่านั้น
สมมติว่าคุณจำเป็นต้องตั้งค่าตัวแปรให้กับฟังก์ชั่นของตัวเองและทำซ้ำจำนวนครั้ง ยกตัวอย่างเช่นปัญหาในการค้นหาหมายเลข 100 ในภายหลังในลำดับ Collatz จากอินพุต วิธีที่สั้นที่สุดในการค้นหาหมายเลขถัดไปในลำดับหากจำนวนเริ่มต้นQ
คือ
@,/Q2h*Q3Q
วิธีที่ชัดเจนที่สุดในการใช้ 100 ครั้งนี้และพิมพ์ผลลัพธ์จะเป็น
V100=Q@,/Q2h*Q3Q;Q
วนซ้ำ 100 ครั้งอัพเดตค่า Q ในแต่ละครั้งจากนั้นจบการวนซ้ำและพิมพ์ Q
แต่เราสามารถใช้ฟังก์ชั่นลดซึ่งไม่สนใจตัวแปรลำดับ ( H
)
u@,/G2h*G3GU100Q
สั้นกว่านี้ 2 ตัวอักษร สั้นลง 3 ตัวอักษรหากคุณพยายามวนซ้ำหลายครั้งตามลำดับ
.Em
เมื่อคุณต้องการที่จะหาผู้ใดในลำดับตามเงื่อนไขที่คุณมักจะใช้ ตัวอย่างเช่นหากคุณต้องการทราบว่ามีรายการใดในรายการมากกว่าหรือเท่ากับ 5:
.Emgd5Q
แต่ถ้ามันต้องเป็นความจริง / เท็จไม่จริง / เท็จsm
จะทำงานได้เพราะผลรวมทำงานใน bools
smgd5Q
เราสามารถทำได้สั้นกว่านี้ด้วยf
ilter:
fgT5Q
สุดท้ายดูเหมือนว่าน่าเกลียดจริงๆ
สำหรับ.A
ll สิ่งเดียวที่ฉันคิดได้ก็คือใช้เงื่อนไขตรงกันข้ามและลบล้างมันเพื่อประหยัดถ่านหนึ่งตัว.Am
:
!f<T5Q
F
: สำหรับลูป เช่นเดียวกับ Python
V
: สำหรับการวนซ้ำในช่วง ต้องกำหนดตัวแปรหรือช่วงไม่ให้สั้นลงดังนั้น 2 ตัวอักษร
W
: ในขณะที่วง เช่นเดียวกับ Python
#
: ไม่มีที่สิ้นสุดในขณะที่วง หลบหนีด้วยข้อผิดพลาดหรือตัวแบ่งที่ชัดเจน ฟีเจอร์เฉพาะtry ... except
ตอนนี้ใน Pyth
D
: นิยามทั่วไป เช่นเดียวกับงูหลาม
L
: 1 อาร์กิวเมนต์ไม่มีฟังก์ชันการมอบหมายเช่น Lambda ของ Python แต่มีชื่อ R
ไม่จำเป็นต้องระบุชื่อฟังก์ชันชื่อตัวแปรและ Return ( ) ดังนั้นจึงมีความยาว 3 ตัวอักษร
f
: ตัวกรอง - องค์ประกอบที่เลือกของลำดับการป้อนข้อมูลที่กลับมาจริงในแลมบ์ดาอินพุต
f
: จำนวนเต็มแรกมากกว่าหรือเท่ากับอินพุตซึ่งให้ผลลัพธ์ตัวกรองตามจริง
m
: แผนที่ - แปลงองค์ประกอบของลำดับการป้อนข้อมูลโดยใช้แลมบ์ดาอินพุต
u
: ย่อ - ลดลำดับการป้อนข้อมูลบนแลมบ์ดาอินพุตโดยเริ่มต้นการสะสมเป็นอาร์กิวเมนต์ที่สาม
o
: การสั่งซื้อ - องค์ประกอบที่เก่ากว่าของลำดับการป้อนข้อมูลโดยใช้แลมบ์ดาเป็นคีย์
โดยทั่วไปจะมีความเป็นไปได้หลายอย่างสำหรับปัญหาใด ๆ ที่เกิดขึ้นและโดยการเขียนวิธีแก้ปัญหาการทดสอบกับแต่ละของพวกเขาเท่านั้นที่คุณสามารถคิดออกที่สั้นที่สุด
.x
สามารถใช้งานได้นานกว่าสำหรับบล็อกแบบลองยกเว้น
.x{some_statments}{except_block - can this be empty}
.
# ... B
สามารถใช้วิธีนี้หากคุณไม่ได้อยู่ในการแสดงออก
การสลับองค์ประกอบสองอย่างนั้นอาจเป็นงานที่ค่อนข้างแพง ดังนั้นนี่คือสองวิธีที่คุณต้องการใช้
ในการเตรียมการเรากำหนดรายการY
และเติมด้วยตัวเลขบางส่วน เป้าหมายคือการสลับองค์ประกอบที่สองและสาม
=Y[1 3 5 3 6 7)AGH,1 2
เราก็กำหนดตัวแปรแฟ้ม tmp J = Q[G]
ทำรายการแรกที่ได้รับมอบหมายแล้วที่สองโอนสิทธิครั้งล่าสุดY[G] = Y[H]
เคล็ดลับที่นี่คือการทำรังทั้งสองได้รับมอบหมายรายการเพื่อให้คุณไม่ต้องพิมพ์ปราบและไม่ได้มีการใช้สองครั้งเพื่อดูY[H] = J
Y
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]
ขอให้สังเกตว่าวงเล็บปิดเป็นตัวเลือกถ้าคำสั่งเป็นวงเล็บสุดท้ายในรหัสของคุณ
<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
ดังนั้นคุณสามารถแทรกได้ทุกที่โดยไม่ต้องเปลี่ยนฟังก์ชั่นการทำงานของโปรแกรม
g#
ตัวอย่างเช่นสมมติว่าคุณมีและJ=5
K=12
จากนั้นg#JK
= 12 และg#KJ
= 12 เช่นกัน
สิ่งนี้ถูกค้นพบโดย @ Pietu1998 ผู้ซึ่งคิดแบบนี้:
ไม่แน่ใจว่ามีคนพบแล้วมัน แต่มีวิธีที่เย็นจะทำ max (A, B) ใน 2 ไบต์ไม่จำเป็นต้องใช้ eS,AB
3 g#AB
ทำสิ่งเดียวกัน (มันไม่มีประสิทธิภาพมากเพราะมันวนครั้งสูงสุด (1, A-B + 1) ครั้งการเพิ่มประสิทธิภาพคือการใส่ตัวเลขที่มีแนวโน้มว่าจะใหญ่กว่าเป็น B. )
join
วิธีการของ Pythjoin
วิธีการในหลามสามารถมักจะเป็นที่น่ารำคาญนิด ๆ หน่อย ๆ เพราะมันเพียงร่วมสตริง Pyth join
เป็นคนใจกว้างมากขึ้น มันเปลี่ยนวัตถุทั้งหมดในสตริงโดยค่าเริ่มต้น
เช่นjkUT
ให้0123456789
หรือjb["abc"4,5\f]7
ให้
abc
4
(5, 'f')
[7]
j2\a\b
->"a2b"
เคล็ดลับเรียบร้อยใช้I
nvariant เพื่อบอกว่าตัวเลขเป็นจำนวนเต็มเช่น:
sI
การตรวจสอบนี้จะตรวจสอบว่าหมายเลขไม่เปลี่ยนแปลงเมื่อคุณตัดทอนหรือไม่
ตัวอย่างเช่นคุณสามารถใช้สิ่งนี้เป็นตารางตรวจสอบที่สมบูรณ์แบบ:
sI@Q2
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:
Downside:
ASCII เท่านั้น
ไม่มีอินพุตแบบโต้ตอบ
ตัวเลือกการดีบักแบบเต็มจะไม่มีประโยชน์
การรายงานข้อผิดพลาดแย่ลง
I
และ GCDคำเตือน:นี้เท่านั้นทำงานสำหรับ integers เชิงลบ
ในการตรวจสอบว่ามีจำนวนเต็มสองจำนวนที่ไม่เป็นลบหรือไม่คุณสามารถทำสิ่งต่อไปนี้:
iI<divisor><dividend>
หากหารด้วยขและ≥ข≥ 0แล้วgcd (A, B) = b
ไม่จำเป็นต้องบันทึกเป็นไบต์!%<dividend><divisor>
แต่อาจทำให้คุณประหยัดเนื่องจาก:
Q
) เมื่อทำงานกับเงินปันผล<pfn>
เนื่องจากมันเป็นฟังก์ชั่นในตัว0
จะจัดการโดยโมดูโลiI
เป็นฟังก์ชั่นของตัวเองในขณะที่!%
ไม่ใช่ดังนั้นคุณสามารถใช้เป็นฟังก์ชั่นนำหน้าได้
หากคุณมีฟังก์ชั่นของ arity 1 และต้องการใช้สิ่งนั้นกับตัวแปรและนำไปใช้กับตัวเองคุณสามารถใช้ไวยากรณ์ต่อไปนี้:
=<function><variable>
แทน:
=<variable><function><variable>
ตัวอย่างเช่นหากคุณต้องการเพิ่มตัวแปรZ
คุณสามารถทำได้:
=hZ
=ZhZ
ซึ่งจะช่วยประหยัดมากกว่าหนึ่งไบต์