Blok Programımı Yazdır


11

Lisem ve diğerleri, Dönen Blok Programı adı verilen bir tür program uygular. Bu, insanların 8 derse sahip olmasının bir yoludur, ancak bir okul gününde 6 dönemi vardır.

Blok programında tekrar tekrar tekrarlanan ve haftanın gerçek günleriyle hiçbir ilgisi olmayan dört gün vardır. Her birine bir numara atanır [1-4].

Zamanlama çalışma şekli tüm sabah sınıfları, dönemleri listesi olmasıdır 1-4: [1, 2, 3, 4]. Bu sadece listeyi döndürmek İlk gün için zamanlama veya Gün 1. gün geri kalanı: [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3].

Ancak, sabahın son dönemi “düşürülür” ve o gün o öğretmeni göremezsiniz. Dolayısıyla günler şunlardır: [1, 2, 3], [2, 3, 4], [3, 4, 1], [4, 1, 2].

Öğleden sonra aynıdır, bu dönemlerde kullandığı hariç 5-8yerine: [5, 6, 7], [6, 7, 8], [7, 8, 5], [8, 5, 6].

Senin görevin

Tüm bu dönüşü takip etmek zordur, bu nedenle girdi olarak hangi gün verildiği programımı yazdırmak için bir program yazmanız gerekir. Kodunuz Homeroom ve Lunch'i doğru noktalara yerleştirmelidir. İşte tam da kod girişleri için sahip olması gerekir çıktı 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

Ama Bekle - Bir şey daha!

Bazen, okulun ilk gününde veya diğer özel günlerde okulumun "Gün 0" ı vardır. Bu sadece o gün tüm derslerime evde ve öğle yemeğinde sahip olacağım anlamına geliyor . Kodunuzun 0. Günlerle ilgilenmesi gerekir. Gün 0 için çıktı:

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

Bu bayt en kısa kodu kazanır!


Haftada 4 gün var mı? Yoksa ilk Cuma geri dönecek 1, 2, 3, 5, 6, 7mi?
Zach Gates

@ZachGates * haftasında * sadece 4 gün. Blok zamanlama, gerçek okul haftası ile senkronize olmayacaktır.
Maltysen

"0. Gün" ne zaman kullanılır? Hangi haftayı seçtiğimizi ve şu ana kadar kaç "Gün 0" meydana geldiğini nasıl bilebiliriz?
Zach Gates

@ZachGates Bu alakasız değil mi? Bir giriş için sadece bir çıkış sağlamanız gerekir. Sadece 5 ayrı çıkış vardır.
mınxomaτ

2
@ZachGates 5 olası giriş vardır. Bunlara karşılık gelen 5 çıktı, meydan okumada kelimesi kelimesine listelenmiştir.
Kapı tokmağı

Yanıtlar:


3

Kardan Adam 1.0.2 , 190 bayt

}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

En soldaki sütun aslında oldukça hoş görünüyor, değil mi?

...

... şaka yapıyorum, PHP'den daha çok program yapmayı tercih ederim.

"Okunabilir" sürüm:

}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

Düşünceler ve düşünceler:

  • Öncelikle, kesinlikle yeni satırlar basmanın daha güzel bir yolunu kullanmam gerekiyor. Çünkü girintili bir blokta satırsonu olan dizeler çok çirkin.

  • aeİle yaptığım hüneri seviyorum - nadiren gerçek Kardan Adam kodundan büyük harf aealmadan operatörü görüyorsunuz E. (Ayrıca nadiren benim tarafımdan yazılmayan Snowman kodunu görüyorsunuz, ancak bu konu dışında.)

    Deneyimsiz olanlar için, Snowman'ın operatörleri çağırmanın iki yolu vardır. "Tüketim" modu ve "tüketmeme" modu. "Tüket" modu operatörü istenen değişkenlerle arayacak ve değişkenleri atacaktır. Tüketim dışı modu operatörü arar ve değişkenleri olduğu gibi bırakır.

    Bu genellikle ae(dizi-her) ile istediğiniz şey değildir , çünkü her öğede aradığınız blok orada kalacak ve sekiz değişkenden değerli olanı kullanarak yolunuza girecektir.

    Ancak bu nadir bir durum olduğu olduğu ae olduğu (daha fazla açıklama için kod yorumlara bakınız) aslında ne istediğimizi.

  • Gerçekten, gerçekten Snowman'ın sadece "tüket" ve "tüketme" dışında ikiden fazla moda ihtiyacı olduğunu düşünmeye başladım. Örneğin, aa(temelde dizi indeksleme) ile, onu çağırmanın yalnızca iki yolu vardır:

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

    (Kardan adam bir yığın / dizi yapısı kullanmaz, ancak bu sadece açıklık sağlamak için kullanılır.)

    İstediğiniz oldukça yaygındır ["foo" "f"](yani dizin değişkenini tüketir, ancak orijinalini değil). 0Eğer "tüketmeyin" modunu kullanırsanız bu sinir bozucu kurtulmak için süper kıvrımlı bir süreçtir .

    Benzer bir şey, burada yapıldığı gibi "tüketme" modunda "dizi-her" ifadesini çağırdığınızda da olur. Dizi ve blok , adı geçen bloğun yürütülmesi sırasında bile etrafta dolaşır . Bu ... gerçekten, gerçekten garip.

    Sonra tekrar, Snowman'ın tasarım amacı mümkün olduğunca kafa karıştırıcı olacak, bu yüzden bunun bir sorun olup olmadığından emin değilim.



1

Python 3, 193 192 182 168 165 bayt

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)

Sadece hızlı bir çözüm.

Python 2, 161 bayt

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 döngüsünü bir"\n".join
Maltysen

Python 3'teki aynı bayt miktarı, ancak Python 2'de yardımcı olacaktır. @Maltysen Yine de ekleyeceğim. : P
Zach Gates

0

Pyth, 51 bayt

"Homeroom"j"Lunch
"c2jb+L"Period "+J?QP.<S4tQS4+L4J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.