Codegolf — Преобразовать Строку В Стиле __Date__ В Сортируемую Строку

  • Автор темы Parkad
  • Обновлено
  • 22, Oct 2024
  • #1

Цель состоит в том, чтобы написать максимально короткую одномодульную программу на C, совместимую с C89 и C99, которая будет вычислять и распечатывать однострочную строку, порядок сортировки которой будет соответствовать дате, заданной предопределенным

&sharp;include <stdio.h>
«CODE»int main(void){«CODE»}
macro (in other words, later dates will yield later-sorting strings). The programmer is free to arbitrarily select the mapping between dates and strings, but every entry should specify the mapping and it should be obvious that it will sort correctly (e.g. a programmer could decide to compute (day + month*73 + year*4129) and output that as a number, though it's likely that particular encoding would probably require a longer program than some others).

Программа должна давать одинаковые результаты на любом совместимом со стандартами компиляторе, в котором 'int' имеет длину 32 бита или больше, а исходный и целевой наборы символов имеют 7-битный ASCII, и не должна полагаться на какое-либо поведение, определенное реализацией или неопределенное, и не печатать какие-либо символы вне диапазона 32–126, за исключением одной новой строки в конце. Программа должна содержать следующие аспекты, указанные ниже (заменяющие "КОД" с чем угодно):

Dec 31 9999

Вся продукция должна производиться Feb 11 2012 at the end (i.e. the correct value will be in an __DATE__ называется Dec 31 9999 ). The required elements will be included in the character total for each entry.

Код должен работать правильно для всех будущих дат до z . Libraries which are standard in both C89 and C99 may be used, provided that appropriate headers are included. Note that standard date libraries may not be assumed to operate beyond the Unix limits.

Примечание. Коду разрешено выполнять неопределенное поведение тогда и только тогда, когда int macro expands to a macro other than a date between printf и __DATE__ (expressed in that format, using C-standard abbreviated English month names Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)

Примечание 2. Для соответствия стандартам C99 «main» должен возвращать произвольное, но определенное значение, при этом требуется перевод строки. Кстати, первое требование добавляет 7 символов к моим лучшим усилиям; единственная новая строка добавляет 5.

#код-гольф #свидание #c

Parkad


Рег
13 Apr, 2006

Тем
79

Постов
178

Баллов
603
  • 26, Oct 2024
  • #2

C, 137 184 184 140 120 106 103 символа

Поиск названия месяца заменен волшебной формулой.
Формула

 
(my entries)
#include <stdio.h>
int main(void){char*d=__DATE__"%s%sDFCwu-vBxE-t%c"+1;return printf(d+6,d+(*d+d[1])+9,d,10);}
int main(void){char*d="h-elbj-ikcfdga-"__DATE__+16;return printf("%s%s\n",d+6,d-(*d+d[1]));}
int main(void){char*d=__DATE__+1;return printf("%s%x%s\n",d+6,3**d+"![ WT -#[ 8"[d[1]],d);}
int main(void){char*d=__DATE__"%x%.5s\n"+1;return printf(d+6,3**d+"![ WT -#[ 8"[d[1]],d);}
int main(void){char*d=__DATE__"%x%.5s\n";return printf(d+7,d[1]+"1C0EB042E0:"[d[2]],d);}
(ugoren's entry, golfed, for comparison, and adding .5 to the %s format specifier)
int main(void){char*m=__DATE__"%3d%.5s\n"+1;return!printf(m+6,(*m*803^m[1]*95)%94,m);}
is ascending for month names.
Изменил его, чтобы он возвращал 0 бесплатно.
Он больше не печатает число. Вместо этого он печатает строку, которая должна быть правильно отсортирована.
Реализован суперкат
 
 
 #define _XOPEN_SOURCE
#include<time.h>
#include<stdio.h>
int main(void){

struct tm t;

strptime(__DATE__,"%b%d%Y",&t);

return printf("%d\n",t.tm_year*366+t.tm_yday);
}
 
idea, which inserts more spaces for earlier months, along with a function that's descending for month names - struct tm .

t

Я думал, что дни, состоящие из одной цифры, представлены как #include ( #include <stdio.h> #include <string.h> d,y,n[3]; int main(void) { sscanf(__DATE__,"%s %d %d",n,&d,&y); return printf("%ddd",y,13-strlen(strstr("JanFebMarAprMayJunJulAugSepOctNovDec",n))/3,d); } будучи пространством), хотя на самом деле это #include<stdio.h> int main(void){ char*m=__DATE__+1,*t=m+m[4]/16; return!printf("%s%3d%s\n",t+3,(*m*4388^m[1]*7)%252,t); } (extra space). This complicated things, so my previous versions were more complicated:

Jan__1_2012 ||answer||

С, 194 символа

_

Я думаю, что большинство новых строк не нужны, но я оставил их для удобства чтения.

Не уверен, что вы думаете о предупреждениях компилятора - это выдает несколько, но работает нормально. Также не уверен, действительны ли объявления без типа C89 или нет.

 

Hmara396


Рег
19 Jul, 2015

Тем
57

Постов
191

Баллов
486
  • 26, Oct 2024
  • #3

Вот решения, которые я придумал (для краткости я просто пишу Jan_1_2012 line once--copy and paste as needed to assemble a testable program).

#include<stdio.h> int main(void){ char*m=__DATE__"%*.6s\n"+1; return!printf(m+6,(*m*29^m[1]+405)%49,m); }

Мои первоначальные подходы использовали подход «месяц-число», который может превратить каждый месяц в произвольный символ. Если бы в производственной среде встроенных систем нужно было превратить буквенный месяц в число от 1 до 12, этот подход действительно мог бы быть эффективным алгоритмом для этого (возможно, используя повторное вычитание-17 вместо mod, если никаких других делений не требуется). ).

Разрешение вычислению возвращать значения, которые можно было сортировать, но не были последовательными, позволило использовать меньшую таблицу, индексированную с использованием третьего символа месяца, и добавить к этому символу второй. Дополнительная экономия была достигнута за счет осознания того, что умножение на три, которое я использовал для облегчения «разграничения связей», на самом деле не требовалось, поскольку месяцы, которые в противном случае давали бы совпадающие значения хеш-функции, были правильно отсортированы по первому символу.

Я попробовал немало вариантов, но ни один из них не приблизился к комбинации операторов, найденной Угореном, которая не требует какой-либо таблицы. Меня также впечатлила его запись, в которой были бы однозначные даты без дополнений, что само по себе было бы проблемой, и я сомневаюсь, что я смог бы справиться с ней так же хорошо.

 

Air182


Рег
02 Apr, 2020

Тем
77

Постов
189

Баллов
604
  • 26, Oct 2024
  • #4

С, 163 символа

Другой подход, чем мое другое решение.
Я могу сохранить 13 символов, сделав (m[1]*29^m[2]+405)%49 an int array, and relying on the internal layout of %*s . Но я считаю, что это нарушает правила.

(m[1]*4388^m[2]*7)%252
 

Erovaornace6


Рег
04 Jun, 2010

Тем
79

Постов
199

Баллов
634
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно