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=
, двічі та інші речі. Підвищення на гойдалках (перший місяць - це найпростіший спосіб зробити це) сильно втрачає на кругових роз'їздах (особливі вимоги до синтаксису).
При цьому використовується вбудована функція (всі функції в DFSORT вбудовані), щоб знайти останній день місяця. Потім додає один день (функцію), щоб дістатися до першого наступного місяця, і використовує функцію PREVDSUN, щоб отримати попередню неділю (яка завжди буде останньою неділею попереднього місяця, як і раніше).
При перетворенні року (введення) у дійсну дату використовується двозначний номер послідовності за місяць, і це значення копіюється також і за день, оскільки початкова точка не має значення, наскільки дійсна, як ми після останнього дня місяця спочатку: 5,2
коротше, ніж C'01'
.
Ось деталь:
OPTION COPY - скопіюйте вхідний файл на вихід
OUTFIL - щоб дозволити декілька вихідних файлів, з різним вибором та форматуванням, створювати форматовані звіти. Вживається в перевазі коротший INREC
через використання REPEAT=
.
REPEAT = 12 - створити 12 копій кожного запису. У цьому прикладі може бути лише один запис вводу (на відміну від попередньої версії) через SEQNUM.
5: - початок з колонки 5 на записі.
SEQNUM, 2, ZD - порядковий номер, за замовчуванням починається одна, дві цифри, "десятична зона" (для непідписаних, якими вони будуть, те саме, що і символ).
1,8 - скопіюйте байти 1 довжиною 8 у поточне місце розташування (9). Це тому, що Y4T потрібно бачити 8, інакше буде використаний інший формат дати.
Y4T - дата в форматі ccyymmdd (через 8 безпосередньо перед нею).
ПОСЛІДНИЙ - Останній день місяця (також можливий тиждень, квартал та рік).
TOJUL = - перетворення дати перетворення для функцій дати (TOJUL на один символ менше, ніж TOGREG)
9,7 - тепер, коли це 7, Y4T буде CCYYDDD.
ДОПОМОГА - додає кількість днів, автоматично підлаштовуючись, якщо переходить у наступний місяць / рік (також можуть бути АДДМОНИ та ДОБАВКИ)
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
(щоб дозволити використання REPEAT). Робочий код, мабуть, будь-який із 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) або 138 (70 + 68) (за винятком провідних заготовок, примусового продовження та проміжних заготовок).
Зважаючи на те, що одержувач повинен знати, що вони роблять, я думаю, що можу сказати, що код DFSORT, який слід перераховувати в останню неділю кожного місяця за будь-який рік з 1900 року (працюватиме з 0001 року, але я уникаю досліджень, оскільки добре) до 9999 (хоча DFSORT підтримує роки до 9999, попереднє рішення не працювало б у 9999 році, оскільки 12-та дата переходить у наступний рік) можна твітувати.
Чому код настільки довгий, якщо є особливо влучні вбудовані функції?
Польові визначення є ефемерними. Поле визначається лише як певне місце в даних (яке є записом) для його негайного використання. Інакше кажучи, поля не визначаються як такі, але визначаються для кожного використання та лише для використання. Функції дати повинні знати, який (з багатьох) форматів дати використовується для джерела, а висновок повинен бути у форматі дати, так що потрібно вказати.
Тепер, коли у нас є юліанські побачення .... 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 у цикл. Робить речі трохи затятими для таких завдань, як Golf.
Чому публікувати відповідь, це тому, що DFSORT має PREVDday
функцію. Тож остання неділя місяця проста. Це неділя попереднього (PREVDSUN) до першого дня наступного місяця.
Це було також цікаво робити це в одному "операнді" (OVERLAY), трохи схоже на те, щоб робити це все в межах sprintf
або подібних.
Ось це невольф:
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)
Хоча це не зовсім зловживання, не було б звичайним намагатися зафіксувати все це в одному ЗАВДАННІ, і є деякі, здавалося б, непотрібні речі, які необхідні для того, щоб все це перейшло в один НАДЗОР. Є місце для гольфу, але оскільки це видалить не більше однієї лінії, я не спокушаюся.
INREC обробляється для кожного запису.
OVERLAY дозволяє змінювати вміст існуючого запису. Якщо запис буде продовжено понад його довжину в процесі, це не є проблемою.
1,4 - рік, що настає. До нього додається буквальна цифра 0201, а потім наступні 1,8 секунди повторюють це 11 разів, щоб дати один довгий патрон з 96 байт,
Дванадцятий рік за розширеним поточним записом додає до нього 1, а його місяць - 1 (січень).
Решта 10 місяців змінюються на 3 - 11.
Тоді є 12, у зворотному порядку (за рахунок НАДОБРЕНОГО) такого типу речей:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
N: - це номер стовпця на записі. X вставляє порожню. 89,8 приймає дані з цього стовпця / довжини, Y4T трактує це як дату CCYYMMDD, PREVDSUM працює в попередню неділю, TOGREG = Y4T (-) виводить їх як дату григоріанського CCYY-MM-DD.
Оскільки ви отримуєте сміття, якщо джерело та ціль певної частини ОВЕРЛАЙ деструктивно перекриваються, остаточне 11:X,18,120,6X)
перестановлення та маскування трохи заплутане.
Посібники та документи можна знайти за посиланням: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 та містить посібник з програмування програми DFSORT на 900+ сторінок.
Як і у всіх продуктах IBM, всі посібники доступні безкоштовно (за винятком вибачливо невеликої кількості дуже дорогих, які лише дуже мала кількість людей у світі навіть претендує на розуміння).
Усі контрольні картки DFSORT повинні починатися з порожнього поля. Стовпець 72 використовується лише для продовження (будь-яке незаповнене буде, але * є звичайним). У стовпці 72 слідує область послідовних номерів, яка ігнорується, роблячи кожен запис 80 байтами.
Можливо, ще одна пара рішень.