ブロックスケジュールを印刷


11

私の高校、および他の多くの人は、回転ブロックスケジュールと呼ばれるタイプのスケジュールを実装しています。これは、人々が8つのクラスを受講する方法ですが、1日に6つの期間があります。

ブロックスケジュールには、繰り返し繰り返される4日間があり、実際の曜日とは関係ありません。それぞれに番号が割り当てられ[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

しかし、待って-もう一つ!

時々、学校の初日、または他の特別な日に、私の学校には「Day 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ますか?
ザックゲイツ

@ZachGatesは*週*でわずか4日間です。ブロックスケジュールは、実際の学校の週と同期していません。
マルティセン

「Day 0」はいつ使用されますか?どの週から選んでいるのか、これまでに「Day 0」が何回発生したのかをどのように知ることができますか?
ザックゲイツ

@ZachGatesそれは無関係ではないですか?1つの入力に対して1つの出力を提供する必要があります。出力は5つだけです。
mınxomaτ

2
@ZachGates 5つの可能な入力があります。それらに対応する5つの出力は、チャレンジで逐語的にリストされています。
ドアノブ

回答:


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

思考と黙想:

  • まず、私は間違いなく改行を印刷するきれいな方法を実装する必要があります。インデントされたブロックに改行を含む文字列は非常にugいためです。

  • 私は自分のトリックが好きです。実際のSnowmanコードに大文字が含まれていないオペレーターはaeめったに見えません。(また、私によって書かれていないSnowmanコードはめったに見られませんが、それは重要なことではありません。)aeE

    初心者には、Snowmanにはオペレーターを呼び出す2つの方法があります。「消費」モードと「非消費」モード。「消費」モードでは、要求された変数を使用してオペレーターを呼び出し、変数を破棄します。非消費モードでは演算子が呼び出されますが、変数はそのまま残ります。

    通常、これはae(array-each)で必要なものではありません。各要素で呼び出しているブロックはそこにとどまり、8つの変数のうちの貴重な1つを使い果たしてしまいます。

    ただし、これはまれな状況でありae 実際に必要なものです(詳細については、コードのコメントを参照してください)。

  • Snowmanには、「消費する」と「消費しない」以外の2つ以上のモードが必要だと思い始めています。たとえば、aa(基本的に配列のインデックス付け)では、2つの呼び出し方法しかありません。

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

    (Snowmanはスタック/配列構造を使用していませんが、ここではわかりやすくするために使用しています。)

    必要なのはかなり一般的です["foo" "f"](つまり、元の変数ではなく、インデックス変数を使用します)。0「do-not-consume」モードを使用する場合、その迷惑を取り除くのは非常に複雑なプロセスです。

    ここで行われているように、「do-not-consume」モードで「array-each」を呼び出すと、同様のことが起こります。配列とブロックは、そのブロックの実行あっても動き続けます。それは...本当に、本当に奇妙です。

    繰り返しになりますが、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)

forループを"\n".join
-Maltysen

Python 3では同じバイト数ですが、Python 2では役立ちます。@ Maltysenでも追加します。:P
ザックゲーツ

0

Pyth、51バイト

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.