IBM DFSORT, 11 3 baris dengan 71, 72 atau 80 karakter
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)
Dua jawaban dengan format output berbentuk kolom telah teruji oleh waktu. Itu memberi saya "loop", semacam, di bahwa pada OUTFIL REPEAT = menyalin catatan saat ini yang berkali-kali.
Teknik yang berbeda untuk mendapatkan nilai, yang tampaknya lebih lama tetapi lebih pendek karena saya tidak dapat menemukan cara tanpa syarat untuk berurusan dengan catatan ke-12 berada di tahun berikutnya, dan menjadikannya syarat bersyarat termasuk IFTHEN=(WHEN=
, dua kali, dan beberapa hal lainnya. Keuntungan pada ayunan (bulan pertama adalah cara paling sederhana untuk melakukannya) sangat kehilangan bundaran (persyaratan sintaksis tertentu).
Ini menggunakan fungsi inbuilt (semua fungsi dalam DFSORT adalah inbuilt) untuk menemukan hari terakhir bulan itu. Kemudian tambahkan satu hari (fungsi) untuk mendapatkan yang pertama dari bulan berikutnya dan menggunakan fungsi PREVDSUN untuk mendapatkan hari Minggu sebelumnya (yang akan selalu menjadi hari Minggu terakhir di bulan sebelumnya, seperti sebelumnya).
Ketika mengubah tahun (input) menjadi tanggal yang valid, nomor urut dua digit digunakan untuk bulan itu, dan nilai itu juga disalin untuk hari itu, karena titik awal tidak masalah selama valid, seperti kita setelah hari terakhir bulan pada awalnya: 5,2
lebih pendek dari C'01'
.
Inilah detailnya:
OPTION COPY - menyalin file input ke output
OUTFIL - untuk memungkinkan beberapa file output, dengan pemilihan dan pemformatan yang berbeda, menghasilkan laporan yang diformat. Digunakan dalam preferensi untuk yang lebih pendek INREC
karena penggunaan REPEAT=
.
REPEAT = 12 - menghasilkan 12 salinan dari setiap catatan. Dalam contoh ini, hanya ada satu catatan input (tidak seperti versi sebelumnya) karena SEQNUM.
5: - mulai di kolom 5 pada catatan.
SEQNUM, 2, ZD - nomor urut, standar untuk mulai dari satu, dua digit, "desimal dikategorikan" (untuk unsigned, yang akan menjadi, sama dengan karakter).
1,8 - salin byte 1 untuk panjang 8 ke lokasi saat ini (9). Ini karena Y4T perlu melihat bahwa 8, jika tidak format tanggal yang berbeda akan digunakan.
Y4T - tanggal format ccyymmdd (karena 8 tepat di depannya).
LASTDAYM - Hari terakhir Bulan (juga dimungkinkan dari Minggu, Kwartal dan Tahun).
TOJUL = - konversi tanggal keluaran untuk fungsi tanggal (TOJUL adalah satu karakter kurang dari TOGREG)
9,7 - sekarang 7 lama, Y4T akan menjadi CCYYDDD.
ADDDAYS - menambahkan beberapa hari, menyesuaikan secara otomatis jika masuk ke bulan / tahun berikutnya (bisa juga ADDMONS dan ADDYEARS)
PREVDSUN - tanggal Julian datang, Minggu sebelumnya berlokasi, TOGREG untuk mendapatkan format keluaran yang benar, dengan pemisah "-" (bisa apa saja yang Anda suka sebagai pemisah)
12X - kosong untuk membersihkan kekacauan yang memungkinkan kami melakukannya dengan cara yang singkat
Output dari di atas, untuk 2014, adalah:
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
Diperlukan sesuatu untuk memberi tahu SORT apa yang harus dilakukan. Tidak ada standar. OPTION COPY
adalah yang terpendek, SORT FIELDS=COPY
setara tetapi lebih lama.
Pekerjaan itu sendiri dilakukan kali ini di OUTFIL
(untuk memungkinkan penggunaan REPEAT). Kode kerja bisa dibilang ada di antara 160 (2 * 80), 144 (2 * 72), 140 (72 + 69), atau 138 (70 + 68) (tidak termasuk blanko terkemuka, lanjutan paksa dan trailing blank).
Mengingat bahwa penerima harus tahu apa yang mereka lakukan, saya pikir saya dapat mengatakan bahwa kode DFSORT mencantumkan hari Minggu terakhir setiap bulan untuk setiap tahun mulai tahun 1900 (akan berjalan dari tahun 0001, tapi saya menghindari penelitian sebagai well) hingga 9999 (meskipun DFSORT mendukung tahun hingga 9999, solusi sebelumnya tidak akan berfungsi di tahun 9999 karena tanggal ke-12 masuk ke tahun berikutnya) dapat di-Tweet.
Mengapa kodenya begitu panjang, jika ada fungsi inbuilt yang tepat?
Definisi bidang adalah fana. Bidang hanya didefinisikan sebagai lokasi tertentu dalam data (yang merupakan catatan) untuk segera digunakan. Dengan kata lain, bidang tidak didefinisikan seperti itu, tetapi didefinisikan untuk setiap penggunaan dan hanya untuk digunakan. Fungsi tanggal perlu mengetahui format tanggal mana yang digunakan untuk sumber, dan output harus dalam format tanggal, sehingga harus ditentukan.
Sekarang kita punya kencan Julian .... 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)
Membutuhkan beberapa JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
Dan file input (baris lain dari JCL dan tiga item instream data):
//SORTIN DD *
2014
1900
2000
Menghasilkan:
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
Sebenarnya akan bekerja hingga tahun 9999.
DFSORT adalah produk penyortiran Mainframe IBM. Data dapat dimanipulasi, tetapi karena pengurutan adalah kunci dan pengurutan sering kali besar dan berjalan lama, kartu kontrol DFSORT tidak memiliki konstruksi pengulangan, jadi kami tidak dapat memasukkan SORT ke dalam satu lingkaran. Membuat hal-hal yang agak bertele-tele untuk tugas-tugas seperti Golf.
Mengapa memposting jawaban, adalah karena DFSORT memiliki PREVDday
fungsi. Jadi hari Minggu terakhir dalam sebulan itu mudah. Ini adalah hari Minggu sebelumnya (PREVDSUN) hingga hari pertama bulan berikutnya.
Itu juga menyenangkan untuk melakukannya dalam satu "operan" (OVERLAY), agak seperti melakukan semuanya di dalam sprintf
atau serupa.
Ini dia 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)
Meskipun tidak cukup pelecehan, itu tidak biasa untuk mencoba menjejalkan semua ini menjadi satu OVERLAY, dan ada beberapa hal yang tampaknya tidak perlu yang diperlukan untuk memungkinkan semuanya masuk ke dalam satu OVERLAY. Ada beberapa ruang untuk bermain golf, tetapi karena itu hanya akan menghapus satu baris paling banyak, saya tidak tergoda.
INREC diproses untuk setiap catatan.
OVERLAY memungkinkan konten catatan yang ada diubah. Jika catatan diperpanjang melampaui panjangnya dalam proses, itu tidak masalah.
1,4 adalah tahun yang akan datang. Ini memiliki 0201 literal ditambahkan ke dalamnya, dan kemudian 1,8 berturut-turut mengulanginya 11 kali untuk memberikan satu chuck panjang 96 byte,
Tahun ke-12 pada catatan saat ini diperpanjang mendapat 1 ditambahkan ke dalamnya, dan bulannya dibuat menjadi 1 (Januari).
Sisa 10 bulan diubah menjadi 3 hingga 11.
Lalu ada 12, dalam urutan terbalik (karena OVERLAY) dari jenis hal ini:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
N: adalah nomor kolom pada catatan. X memasukkan kosong. 89,8 mengambil data dari kolom / panjang itu, Y4T memperlakukannya sebagai tanggal CCYYMMDD, PREVDSUM bekerja pada hari Minggu sebelumnya, TOGREG = Y4T (-) menampilkannya sebagai tanggal Gregorian CCYY-MM-DD.
Karena Anda mendapatkan sampah jika sumber dan target bagian tertentu dari OVERLAY tumpang tindih secara destruktif, final 11:X,18,120,6X)
mengatur ulang dan menutupi sedikit kekacauan.
Manual dan makalah dapat ditemukan di: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , dan termasuk Panduan Pemrograman Aplikasi DFSORT 900+ halaman.
Seperti halnya semua produk IBM, semua manual tersedia gratis (kecuali sejumlah kecil yang sangat mahal yang hanya segelintir orang di dunia yang pura-pura mengerti).
Semua Kartu Kontrol DFSORT harus dimulai dengan yang kosong. Kolom 72 hanya digunakan untuk kelanjutan (tidak ada yang kosong akan dilakukan, tetapi * adalah konvensional). Kolom 72 diikuti oleh area nomor urut yang diabaikan, membuat setiap record 80 byte.
Beberapa solusi lain yang akan datang, mungkin.