Just another update
This commit is contained in:
parent
a25938f123
commit
00a190b0a6
6591 changed files with 94363 additions and 23227 deletions
|
|
@ -1,4 +1,6 @@
|
|||
Create a routine that will generate a text calendar for any year. Test the calendar by generating a calendar for the year 1969, on a device of the time. Choose one of the following devices:
|
||||
Create a routine that will generate a text calendar for any year.
|
||||
Test the calendar by generating a calendar for the year 1969, on a device of the time.
|
||||
Choose one of the following devices:
|
||||
|
||||
* A line printer with a width of 132 characters.
|
||||
* An [[wp:IBM_3270#Displays|IBM 3278 model 4 terminal]] (80×43 display with accented characters). Target formatting the months of the year to fit nicely across the 80 character width screen. Restrict number of lines in test output to 43.
|
||||
|
|
@ -13,3 +15,5 @@ This task is inspired by [http://www.ee.ryerson.ca/~elf/hack/realmen.html Real P
|
|||
For further Kudos see task [[Calendar - for "real" programmers|CALENDAR]], where all code is to be in UPPERCASE.
|
||||
|
||||
For economy of size, do not actually include Snoopy generation in either the code or the output, instead just output a place-holder.
|
||||
|
||||
For other calendar-related tasks, see [[Five weekends]].
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ in {
|
|||
} body {
|
||||
immutable rows = 12 / nCols + (12 % nCols != 0);
|
||||
auto date = Date(year, 1, 1);
|
||||
auto offs = cast(int)date.dayOfWeek;
|
||||
int offs = date.dayOfWeek;
|
||||
const months = "January February March April May June
|
||||
July August September October November December".split;
|
||||
|
||||
|
|
|
|||
92
Task/Calendar/Haskell/calendar.hs
Normal file
92
Task/Calendar/Haskell/calendar.hs
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
import qualified Data.Text as T
|
||||
import Data.Time
|
||||
import Data.Time.Calendar
|
||||
import Data.Time.Calendar.WeekDate
|
||||
import Data.List.Split (chunksOf)
|
||||
import Data.List
|
||||
|
||||
data Day = Su | Mo | Tu | We | Th | Fr | Sa
|
||||
deriving (Show, Eq, Ord, Enum)
|
||||
|
||||
data Month = January | February | March
|
||||
| April | May | June
|
||||
| July | August | September
|
||||
| October | November | December
|
||||
deriving (Show, Eq, Ord, Enum)
|
||||
|
||||
monthToInt :: Month -> Int
|
||||
monthToInt = (+ 1) . fromEnum
|
||||
|
||||
dayFromDate :: Integer -> Month -> Int -> Int
|
||||
dayFromDate year month day = day' `mod` 7
|
||||
where (_, _, day') = toWeekDate $ fromGregorian year (monthToInt month) day
|
||||
|
||||
nSpaces :: Int -> T.Text
|
||||
nSpaces n = T.replicate n (T.pack " ")
|
||||
|
||||
space :: T.Text
|
||||
space = nSpaces 1
|
||||
|
||||
calMarginWidth = 3
|
||||
|
||||
calMargin :: T.Text
|
||||
calMargin = nSpaces calMarginWidth
|
||||
|
||||
calWidth = 20
|
||||
|
||||
listMonth :: Integer -> Month -> [T.Text]
|
||||
listMonth year month = [monthHeader, weekHeader] ++ weeks'
|
||||
where
|
||||
monthHeader = (T.center calWidth ' ') . T.pack $ show month
|
||||
|
||||
weekHeader = (T.intercalate space) $ map (T.pack . show) [(Su)..]
|
||||
|
||||
monthLength = toInteger $
|
||||
gregorianMonthLength year $
|
||||
monthToInt month
|
||||
|
||||
firstDay = dayFromDate year month 1
|
||||
|
||||
days = replicate firstDay (nSpaces 2) ++
|
||||
map ((T.justifyRight 2 ' ') . T.pack . show) [1..monthLength]
|
||||
|
||||
weeks = map (T.justifyLeft calWidth ' ') $
|
||||
map (T.intercalate space) $
|
||||
chunksOf 7 days
|
||||
|
||||
weeks' = weeks ++ replicate (6 - length weeks) (nSpaces calWidth)
|
||||
|
||||
listCalendar :: Integer -> Int -> [[[T.Text]]]
|
||||
listCalendar year calColumns = (chunksOf calColumns) . (map (listMonth year)) $
|
||||
enumFrom January
|
||||
|
||||
calColFromCol :: Int -> Int
|
||||
calColFromCol columns = c + if r >= calWidth then 1 else 0
|
||||
where (c, r) = columns `divMod` (calWidth + calMarginWidth)
|
||||
|
||||
colFromCalCol :: Int -> Int
|
||||
colFromCalCol calCol = calCol * calWidth + ((calCol - 1) * calMarginWidth)
|
||||
|
||||
center :: Int -> String -> String
|
||||
center i a = T.unpack . (T.center i ' ') $ T.pack a
|
||||
|
||||
printCal :: [[[T.Text]]] -> IO ()
|
||||
printCal [] = return ()
|
||||
printCal (c:cx) = do
|
||||
mapM_ (putStrLn . T.unpack) rows
|
||||
printCal cx
|
||||
where rows = map (T.intercalate calMargin) $ transpose c
|
||||
|
||||
printCalendar :: Integer -> Int -> IO ()
|
||||
printCalendar year columns =
|
||||
if columns < 20
|
||||
then putStrLn $ "Cannot print less than 20 columns"
|
||||
else do
|
||||
putStrLn $ center columns' "[Maybe Snoopy]"
|
||||
putStrLn $ center columns' $ show year
|
||||
putStrLn ""
|
||||
printCal $ listCalendar year calcol'
|
||||
where
|
||||
calcol' = calColFromCol columns
|
||||
|
||||
columns' = colFromCalCol calcol'
|
||||
57
Task/Calendar/Java/calendar.java
Normal file
57
Task/Calendar/Java/calendar.java
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import java.text.*;
|
||||
import java.util.*;
|
||||
|
||||
public class CalendarTask {
|
||||
|
||||
public static void main(String[] args) {
|
||||
printCalendar(1969, 3);
|
||||
}
|
||||
|
||||
static void printCalendar(int year, int nCols) {
|
||||
if (nCols < 1 || nCols > 12)
|
||||
throw new IllegalArgumentException("Illegal column width.");
|
||||
|
||||
Calendar date = new GregorianCalendar(year, 0, 1);
|
||||
|
||||
int nRows = (int) Math.ceil(12.0 / nCols);
|
||||
int offs = date.get(Calendar.DAY_OF_WEEK) - 1;
|
||||
int w = nCols * 24;
|
||||
|
||||
String[] monthNames = new DateFormatSymbols(Locale.US).getMonths();
|
||||
|
||||
String[][] mons = new String[12][8];
|
||||
for (int m = 0; m < 12; m++) {
|
||||
|
||||
String name = monthNames[m];
|
||||
int len = 11 + name.length() / 2;
|
||||
String format = MessageFormat.format("%{0}s%{1}s", len, 21 - len);
|
||||
|
||||
mons[m][0] = String.format(format, name, "");
|
||||
mons[m][1] = " Su Mo Tu We Th Fr Sa";
|
||||
int dim = date.getActualMaximum(Calendar.DAY_OF_MONTH);
|
||||
|
||||
for (int d = 1; d < 43; d++) {
|
||||
boolean isDay = d > offs && d <= offs + dim;
|
||||
String entry = isDay ? String.format(" %2s", d - offs) : " ";
|
||||
if (d % 7 == 1)
|
||||
mons[m][2 + (d - 1) / 7] = entry;
|
||||
else
|
||||
mons[m][2 + (d - 1) / 7] += entry;
|
||||
}
|
||||
offs = (offs + dim) % 7;
|
||||
date.add(Calendar.MONTH, 1);
|
||||
}
|
||||
|
||||
System.out.printf("%" + (w / 2 + 10) + "s%n", "[Snoopy Picture]");
|
||||
System.out.printf("%" + (w / 2 + 4) + "s%n%n", year);
|
||||
|
||||
for (int r = 0; r < nRows; r++) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
for (int c = r * nCols; c < (r + 1) * nCols && c < 12; c++)
|
||||
System.out.printf(" %s", mons[c][i]);
|
||||
System.out.println();
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -63,7 +63,7 @@ columns = begin Integer(ENV["COLUMNS"] || "")
|
|||
rescue
|
||||
begin require 'io/console'; IO.console.winsize[1]
|
||||
rescue LoadError
|
||||
begin Integer(`tput co`)
|
||||
begin Integer(`tput cols`)
|
||||
rescue
|
||||
80; end; end; end
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue