내 차단 일정 인쇄


11

우리 고등학교와 다른 많은 사람들은 Rotating Block Schedule이라고하는 일정 유형을 구현합니다. 이것은 사람들이 8 개의 수업을받는 방법이지만 수업 일에는 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 and 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"이 있습니다. 이것은 단지 그날 모든 교실에서 담임과 점심 식사를 할 것임을 의미합니다 . 코드는 Day 0을 처리해야합니다. 다음은 Day 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는 * week *에 4 일만 있습니다. 차단 일정은 실제 학년과 동기화되지 않았습니다.
Maltysen

"0 일"은 언제 사용됩니까? 어느 주를 고르는 지, 지금까지 얼마나 많은 "0 일"이 발생했는지 어떻게 알 수 있습니까?
Zach Gates

@ZachGates 관련이 없습니까? 하나의 입력에 대해 하나의 출력 만 제공하면됩니다. 5 개의 고유 한 출력 만 있습니다.
mınxomaτ

2
@ZachGates 5 개의 가능한 입력이 있습니다. 해당하는 5 개의 출력이 챌린지에 그대로 나열됩니다.
Doorknob

답변:


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이 두 가지 방법으로 운영자에게 전화를 걸 수 있습니다. "소비"모드 및 "비소비"모드. "소비"모드는 요청 된 변수로 연산자를 호출 한 다음 변수를 버립니다. 비소비 모드는 연산자를 호출하고 변수는 그대로 유지합니다.

    ae각 요소를 호출하는 블록은 여덟 개의 변수 중 하나를 사용하여 거기에 머무르고 방해하기 때문에 일반적으로 원하는 것은 아닙니다 (배열-각).

    그러나 이것은 우리 ae 실제로 원하는 드문 상황입니다 (자세한 설명은 코드의 주석 참조).

  • 실제로 눈사람에는 "소비"와 "비소비"이외의 모드가 두 개 이상 필요하다고 생각하기 시작했습니다. 예를 들어 aa(기본적으로 배열 인덱싱)을 사용하면 두 가지 방법으로 만 호출 할 수 있습니다.

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

    (Snowman은 스택 / 배열 구조를 사용하지 않지만 여기서는 명확성을 위해 단순히 사용됩니다.)

    원하는 것이 일반적입니다 ["foo" "f"](예 : 색인 변수는 사용하지만 원래 변수는 사용하지 않음). 0"소비하지 말 것"모드를 사용하면 성가신 일을 없애는 것이 매우 복잡한 과정 입니다.

    여기서처럼 "소비하지 않음"모드에서 "배열-각"을 호출 할 때도 비슷한 일이 발생합니다. 어레이 및 블록 은 상기 블록의 실행 동안에 고착된다 . 어느 것이 ... 정말, 정말 이상합니다.

    다시 눈사람의 디자인 목표는 가능한 한 혼란스러운 것이기 때문에 이것이 문제인지 확실하지 않습니다.


2

CJam, 65 55 바이트

ri_5,m<0-_W<\?_4f+]"HomeroomLunch"8/.{N@{"Period "\N}%}

CJam 통역사 에서 온라인으로 사용해보십시오 .


1

파이썬 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)

빠른 해결책입니다.

파이썬 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

파이썬 3에서는 같은 양의 바이트이지만 파이썬 2에서는 도움이 될 것입니다. @Maltysen 그래도 추가하겠습니다. : P
Zach Gates

0

Pyth, 51 바이트

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.