打印我的时间表


11

我的高中和其他许多学校都实施一种称为“轮班时间表”的时间表。这是人们上8堂课的方式,而在一堂课上有6堂课。

一个块计划中有四天一遍又一遍地重复,与一周中的实际天数无关。每个分配一个编号[1-4]

日程安排的工作方式是您列出所有早班时间1-4[1, 2, 3, 4]。这是你第一天的时间表,或1天的日子,其余只需旋转列表:[2, 3, 4, 1][3, 4, 1, 2][4, 1, 2, 3]

但是,早上的最后一个时间段被“删除”,并且那天您没有看到那个老师。因此,天数为:[1, 2, 3][2, 3, 4][3, 4, 1][4, 1, 2]

下午是一样的,只不过它使用周期5-8,而不是:[5, 6, 7][6, 7, 8][7, 8, 5][8, 5, 6]

你的任务

所有这些旋转都是很难跟踪的,因此您必须编写一个程序以打印出我的日程安排(以输入日期为准)。您的代码必须将Homeroom和Lunch放置在正确的位置。这是您的代码需要输入的确切输出1-4

Homeroom    Homeroom    Homeroom    Homeroom
Period 1    Period 2    Period 3    Period 4
Period 2    Period 3    Period 4    Period 1
Period 3    Period 4    Period 1    Period 2
Lunch       Lunch       Lunch       Lunch
Period 5    Period 6    Period 7    Period 8
Period 6    Period 7    Period 8    Period 5
Period 7    Period 8    Period 5    Period 6

但是,等等-还有一件事!

有时,在开学的第一天或其他特殊日子,我的学校有“第0天”。这只是意味着我当天将上完所有课,包括班级和午餐。您的代码必须处理第0天。这是第0天的输出:

Homeroom
Period 1
Period 2
Period 3
Period 4
Lunch
Period 5
Period 6
Period 7
Period 8

这是因此以字节为单位的最短代码胜出!


一周有4天吗?还是第一个星期五循环回到 1, 2, 3, 5, 6, 7
Zach Gates

@ZachGates在*周*内仅4天。上课时间表将与实际的上课时间不同步。
Maltysen 2015年

什么时候使用“第0天”?我们如何知道我们从哪个星期开始挑选,到目前为止已经发生了多少次“第0天”?
扎克·盖茨

@ZachGates没关系吗?您只需要为一个输入提供一个输出即可。只有5个不同的输出。
mınxomaτ

2
@ZachGates有5种可能的输入。挑战中逐字列出了与它们对应的5个输出。
门把手

Answers:


3

雪人1.0.2,190字节

}vg10sB*:#NdE*!1*"Homeroom
"sP0vn3nR:|%+#nA4NmO'"Period "sP'!#nAtSsP"
"sP|%;ae|"Lunch
"sP5*|ae;:"Homeroom
"sP0vn4nR*#:`"Period "sP`NiNtSsP"
"sP;aE"Lunch
"sP#:`"Period "sP`5nAtSsP"
"sP;aE;#bI

最左边的那列实际上看起来很不错,不是吗?

...

...我是在跟谁开玩笑,我宁愿用PHP编写程序,也不愿这样做。

“可读”版本:

}vg10sB*   // store day # in permavar
// big if statement coming up, depending on whether the input (n) is 0 or not

// THE FOLLOWING BLOCK IS FOR N != 0
:

#NdE*      // decrement number (because we like 0-based indeces) and re-store
!1*        // store the number 1 in permavar ! for later
"Homeroom
"sP        // print "Homeroom"
0vn3nR     // generate [0 1 2]
// for each element in this array...
:
    |%            // shuffle around some variables so we have room
    +#nA          // add day number (in permavar +)
    4NmO          // modulo by 4
    '"Period "sP  // print "Period "
    '!#nAtSsP     // add whatever is in permavar ! and print
    "
"sP               // print a newline
    |%            // return variables to their original state
;ae
// this is a rare occasion in which we use "ae" instead of "aE"
// we use non-consume mode here because we need the block again
// since we've used a permavar ! to determine what to add to the period number,
//   we can set the permavar to 4 more than it used to be and run the same
//   exact block
|"Lunch
"sP        // print "Lunch"
5*         // store the number 5 in permavar !, as described above
|ae        // run the same block over the same array again

;

// THE FOLLOWING BLOCK IS FOR N == 0

:

// after much frustration, I have determined that the easiest way to go about
//   this is to simply code the "day 0" separately
// yes, snowman is *that* bad
"Homeroom
"sP           // you know the drill
// for each number in [0 1 2 3]
0vn4nR*#:
    `"Period "sP
    `NiNtSsP  // increment and print
    "
"sP
;aE
"Lunch
"sP           // same stuff from here
// only interesting thing is we saved the range from before with *#, so we can
//   get it back easily
#:`"Period "sP`5nAtSsP"
"sP;aE

;

#bI

思想和沉思:

  • 首先,我绝对需要采用更漂亮的方式打印换行符。因为在缩进块中带有换行符的字符串非常丑陋。

  • 我喜欢我的把戏ae-很少看到ae操作员,而没有E真正的Snowman代码大写。(您也很少看到不是我写的Snowman代码,但这不是重点。)

    对于没有经验的人,Snowman有两种调用操作员的方法。“消费”模式和“非消费”模式。“使用”模式将使用请求的变量调用操作员,然后丢弃变量。非使用模式将调用运算符,并且仍保持变量不变。

    这通常不是您想要的ae(数组每个),因为您在每个元素上调用的块将停留在那里并妨碍您的使用,用完了八个变量中的一个宝贵的变量。

    然而,这是一种罕见的情况,即ae 其实我们想要的(参见为了进一步解释,代码中的注释)。

  • 我真的开始真正地认为,雪人需要的不仅仅是“消费”和“不消费”两种模式。例如,使用aa(基本上是数组索引),只有两种方法可以调用它:

    ["foo" 0] -> ["f"]
    ["foo" 0] -> ["foo" 0 "f"]
    

    (Snowman不使用堆栈/数组结构,在这里只是为了清楚起见而使用。)

    您想要的很常见["foo" "f"](即使用index变量,而不是原始变量)。0如果您使用“不使用”模式,这是一个超级麻烦的过程,可以消除烦人的问题。

    当您在“不使用”模式下调用“数组每个”时,会发生类似的情况,如此处所做的。即使执行该块的过程中,该数组和该块也会粘住。真的,真的很奇怪。

    再说一次,Snowman的设计目标是尽可能地使人困惑,所以我不确定这是否是一个问题。



1

Python 3中,193个 192 182 168 165字节

u=int(input())
print('Homeroom')
r=['Period '+i for i in("123567234678341785412856"[(u-1)*6:u*6]if u else"12345678")]
r.insert(len(r)//2,'Lunch')
for i in r:print(i)

只是一个快速的解决方案。

Python 2,161字节

u=int(input())
print'Homeroom'
r=['Period '+i for i in("123567234678341785412856"[(u-1)*6:6*u]if u else"12345678")]
r.insert(len(r)//2,'Lunch')
print'\n'.join(r)

您可以通过用"\n".join
Maltysen

它与Python 3中的字节数相同,但在Python 2中会有所帮助。@Maltysen我将添加它。:P
扎克·盖茨

0

Pyth,51个字节

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.