IBM DFSORT, 11 3 บรรทัดของ 71, 72 หรือ 80 ตัวอักษร
OPTION COPY
OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X)
คำตอบสองคำตอบที่มีรูปแบบเอาต์พุตแบบเสามีการทดสอบตามเวลา ที่ให้ฉัน "ห่วง" เรียงลำดับของที่ใน OUTFIL REPEAT = คัดลอกระเบียนปัจจุบันที่หลายต่อหลายครั้ง
เทคนิคที่แตกต่างกันที่จะได้รับค่าซึ่งดูเหมือนว่าอีกต่อไป แต่จะสั้นที่สุดเท่าที่ฉันไม่สามารถทำงานออกวิธีที่ไม่มีเงื่อนไขใด ๆ ในการจัดการกับบันทึกที่ 12 อยู่ในปีต่อไปและทำให้มันเป็นวิธีการเงื่อนไขรวมถึงIFTHEN=(WHEN=
สองครั้งและบางสิ่งอื่น ๆ กำไรจากการชิงช้า (ครั้งแรกของเดือนเป็นวิธีที่ง่ายที่สุดในการทำ) แพ้อย่างหนักในวงเวียน (ข้อกำหนดด้านไวยากรณ์โดยเฉพาะ)
ใช้ฟังก์ชัน inbuilt (ฟังก์ชันทั้งหมดใน DFSORT เป็น inbuilt) เพื่อค้นหาวันสุดท้ายของเดือน จากนั้นเพิ่มหนึ่งวัน (ฟังก์ชัน) เพื่อไปยังเดือนแรกของเดือนถัดไปและใช้ฟังก์ชัน PREVDSUN เพื่อรับวันอาทิตย์ก่อนหน้า (ซึ่งจะเป็นวันอาทิตย์สุดท้ายของเดือนก่อนหน้าเสมอเหมือนก่อน)
เมื่อเปลี่ยนปี (อินพุท) เป็นวันที่ที่ถูกต้องจะใช้หมายเลขลำดับสองหลักสำหรับเดือนและค่านั้นจะถูกคัดลอกสำหรับวันเช่นกันเนื่องจากจุดเริ่มต้นไม่สำคัญตราบเท่าที่ถูกต้องตามที่เราเป็น หลังจากวันสุดท้ายของเดือนแรก: จะสั้นกว่า5,2
C'01'
นี่คือรายละเอียด:
OPTION COPY - คัดลอกไฟล์อินพุตไปยังเอาต์พุต
OUTFIL - เพื่อให้ไฟล์เอาต์พุตหลายไฟล์ที่มีการเลือกและการจัดรูปแบบต่างกันสร้างรายงานที่จัดรูปแบบ ที่ใช้ในการตั้งค่าให้สั้นลงเนื่องจากการใช้งานของINREC
REPEAT=
REPEAT = 12 - สร้างสำเนาของแต่ละระเบียน 12 ชุด ในตัวอย่างนี้สามารถมีได้เพียงหนึ่งระเบียนอินพุต (ไม่เหมือนกับเวอร์ชันก่อนหน้า) เนื่องจาก SEQNUM
5: - เริ่มที่คอลัมน์ 5 ในบันทึก
SEQNUM, 2, ZD - หมายเลขลำดับค่าเริ่มต้นที่เริ่มต้นที่หนึ่งสองหลัก "zoned ทศนิยม" (สำหรับเครื่องหมายที่ไม่ได้ลงนามซึ่งพวกเขาจะเป็นเช่นเดียวกับตัวละคร)
1,8 - คัดลอกไบต์ 1 สำหรับความยาว 8 ถึงตำแหน่งปัจจุบัน (9) นี่เป็นเพราะ Y4T จำเป็นต้องดูว่า 8 มิฉะนั้นจะใช้รูปแบบวันที่อื่น
Y4T - วันที่จัดรูปแบบ ccyymmdd (เนื่องจาก 8 อยู่ข้างหน้าทันที)
LASTDAYM - วันสุดท้ายของเดือน (อาจเป็นไปได้ของสัปดาห์ไตรมาสและปี)
TOJUL = - การแปลงวันที่เอาท์พุทสำหรับฟังก์ชั่นวันที่ (TOJUL คือหนึ่งตัวอักษรที่น้อยกว่า TOGREG)
9,7 - ตอนนี้มันยาว 7 แล้ว Y4T ก็จะเป็น CCYYDDD
เพิ่มวัน - เพิ่มจำนวนวันปรับโดยอัตโนมัติหากเข้าสู่เดือน / ปีถัดไป (อาจเป็น ADDMONS และ ADDYEARS)
PREVDSUN - วันที่จูเลียนเข้ามาวันอาทิตย์ก่อนหน้าตั้งอยู่ TOGREG เพื่อรับรูปแบบเอาต์พุตที่ถูกต้องโดยใช้ตัวคั่น "-" (อาจเป็นสิ่งที่คุณต้องการเป็นตัวคั่น)
12X - ช่องว่างเพื่อกำจัดสิ่งที่ทำให้เราทำอย่างนั้น
ผลลัพธ์จากด้านบนสำหรับปี 2014 คือ:
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28
บางสิ่งจำเป็นต้องบอกให้ SORT รู้ว่าต้องทำ ไม่มีค่าเริ่มต้น OPTION COPY
สั้นที่สุดSORT FIELDS=COPY
เทียบเท่า แต่ยาวกว่า
การทำงานของตัวเองมันเสร็จในเวลานี้OUTFIL
(เพื่ออนุญาตการใช้งานซ้ำ) รหัสการทำงานเป็นเนื้อหาใด ๆ ของ 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) หรือ 138 (70 + 68) (ไม่รวมช่องว่างนำหน้าการบังคับต่อเนื่องและช่องว่างต่อท้าย)
ระบุว่าผู้รับจะต้องรู้ว่าสิ่งที่พวกเขากำลังทำฉันคิดว่าฉันสามารถพูดได้ว่ารหัส DFSORT เพื่อแสดงรายการวันอาทิตย์สุดท้ายของแต่ละเดือนสำหรับปีใด ๆ จาก 1900 (จะทำงานจากปี 0001 แต่ฉันหลีกเลี่ยงการวิจัยเป็น ดี) มากถึง 9999 (แม้ว่า DFSORT จะรองรับปีที่สูงถึง 9999 แต่โซลูชันก่อนหน้านี้จะไม่ทำงานในปี 9999 เนื่องจากวันที่ 12 เข้าสู่ปีถัดไป) สามารถเป็นทวีตได้
ทำไมรหัสถึงยาวถ้ามีฟังก์ชั่น inbuilt-apt โดยเฉพาะ?
คำจำกัดความของฟิลด์เป็นชั่วคราว เขตข้อมูลถูกกำหนดเป็นสถานที่เฉพาะภายในข้อมูล (ซึ่งเป็นบันทึก) สำหรับการใช้งานทันที เพื่อให้เป็นอีกวิธีหนึ่งฟิลด์ไม่ได้ถูกกำหนดเช่นนั้น แต่ถูกกำหนดไว้สำหรับการใช้งานแต่ละครั้งและเพื่อการใช้งานเท่านั้น ฟังก์ชั่นวันที่จำเป็นต้องรู้ว่าจะใช้รูปแบบวันที่ (ของหลายรายการ) สำหรับแหล่งที่มาและเอาท์พุทจะต้องอยู่ในรูปแบบวันที่ดังนั้นจะต้องมีการระบุ
ตอนนี้เรามีวันที่จูเลียน .... TBC?
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),11:X,18,120,6X)
ต้องการบ้าง JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
และไฟล์อินพุต (บรรทัดอื่นของ JCL และรายการสตรีมข้อมูลสามรายการ):
//SORTIN DD *
2014
1900
2000
ผลิต:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
จะทำงานได้จริงถึงปี 9999
DFSORT เป็นผลิตภัณฑ์เรียงลำดับเมนเฟรมของ IBM ข้อมูลสามารถจัดการได้ แต่เนื่องจากการเรียงลำดับเป็นกุญแจสำคัญและมักจะมีขนาดใหญ่และยาวการ์ดควบคุม DFSORT จึงไม่มีโครงสร้างวนลูปดังนั้นเราจึงไม่สามารถใส่ SORT เข้าไปในลูปได้ ทำให้สิ่งต่าง ๆ ยืดเยื้อไปนานสำหรับงานต่างๆเช่นกอล์ฟ
ทำไมต้องโพสต์คำตอบเป็นเพราะ DFSORT มีPREVDday
ฟังก์ชั่น ดังนั้นวันอาทิตย์สุดท้ายของเดือนจึงเป็นเรื่องง่าย เป็นวันอาทิตย์ก่อนหน้า (PREVDSUN) ถึงวันแรกของเดือนถัดไป
นอกจากนี้ยังสนุกที่จะทำมันภายในหนึ่ง "ตัวถูกดำเนินการ" (OVERLAY) บิตเช่นทำมันทั้งหมดภายในsprintf
หรือคล้ายกัน
นี่มัน ungolfed:
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,
1,8,1,8,1,8,1,8,
1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,
14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
62:C'9',69:C'10',77:C'11',85:C'12',
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
11:X,18,120,6X)
ในขณะที่การละเมิดไม่ได้เป็นเรื่องปกติมันจะไม่เป็นเรื่องปกติที่จะพยายามยัดเยียดสิ่งเหล่านี้ทั้งหมดใน OVERLAY และมีบางสิ่งที่ไม่จำเป็นซึ่งดูเหมือนว่าจำเป็นเพื่อให้ทุกอย่างเข้าสู่ OVERLAY ได้ มีห้องสำหรับเล่นกอล์ฟ แต่เนื่องจากมันจะลบได้แค่หนึ่งบรรทัดเท่านั้นฉันจึงไม่ถูกล่อลวง
INREC จะถูกประมวลผลสำหรับแต่ละระเบียน
OVERLAY อนุญาตให้มีการเปลี่ยนแปลงเนื้อหาของระเบียนที่มีอยู่ หากมีการขยายเรกคอร์ดเกินความยาวในกระบวนการนั่นไม่ใช่ปัญหา
1,4 คือปีที่เข้ามามันมีตัวอักษรอยู่ที่ 0201 ต่อท้ายจากนั้น 1,8s ต่อเนื่องทำซ้ำ 11 ครั้งเพื่อให้ชัคยาว 96 ไบต์
ปีที่ 12 ในบันทึกปัจจุบันที่ขยายเพิ่มได้รับ 1 เพิ่มและเดือนที่ทำกับ 1 (มกราคม)
ส่วนที่เหลืออีก 10 เดือนจะเปลี่ยนเป็น 3 ถึง 11
จากนั้นมี 12 ตามลำดับย้อนกลับ (เนื่องจาก OVERLAY) ของสิ่งประเภทนี้:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
n: คือหมายเลขคอลัมน์ในบันทึก X แทรกว่างเปล่า 89,8 ใช้ข้อมูลจากคอลัมน์ / ความยาว Y4T ถือว่าเป็นวันที่ CCYYMMDD, PREVDSUM ทำงานเมื่อวันอาทิตย์ที่ผ่านมา TOGREG = Y4T (-) ส่งออกเป็นวันที่แบบคริสต์ศักราช CCYY-MM-DD
เนื่องจากคุณได้รับขยะหากแหล่งที่มาและเป้าหมายของส่วนเฉพาะของ OVERLAY ทับซ้อนกันอย่างทำลายล้างการ11:X,18,120,6X)
จัดเรียงใหม่และปิดบังความยุ่งเหยิงเล็กน้อย
คู่มือและเอกสารสามารถดูได้ที่: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080และมีคู่มือการเขียนโปรแกรม DFSORT แอปพลิเคชัน 900+ หน้า
เช่นเดียวกับผลิตภัณฑ์ทั้งหมดของ IBM มีคู่มือให้ใช้ฟรี (ยกเว้นของที่มีราคาแพงมาก ๆ ซึ่งมีเพียงไม่กี่คนเท่านั้นที่ยังมีคนทั่วโลกที่แสร้งทำเป็นเข้าใจ)
การ์ดควบคุม DFSORT ทั้งหมดจะต้องเริ่มต้นด้วยช่องว่าง คอลัมน์ 72 ใช้สำหรับการดำเนินการต่อไปเท่านั้น (ไม่ใช่ที่ว่างเปล่าใด ๆ ที่จะทำ แต่ * เป็นแบบเดิม) คอลัมน์ 72 ตามด้วยพื้นที่หมายเลขลำดับซึ่งถูกละเว้นทำให้แต่ละระเบียน 80 ไบต์
อีกสองวิธีที่จะมาอาจจะ