Pages

Selasa, 20 Mei 2014

Bahas Soal "Ready for Challenge?" TOKI Learning

Source : http://tokilearning.org/problem/1642


Ready for Challenge?

Batas Waktu1 detik
Batas Memori32 MB

Deskripsi

Diberikan sebuah pertanyaan, jawablah dengan YA atau TIDAK.

Format Masukan

Satu baris string S yang merupakan sebuah pertanyaan.

Format Keluaran

Satu baris berisi jawaban dari pertanyaan yang diajukan. Jawaban berupa YA atau TIDAK.

Contoh Masukan 1

Apakah Ammar ganteng?

Contoh Keluaran 1

YA

Contoh Masukan 2

Apakah ada orang yang lebih ganteng daripada Ammar?

Contoh Keluaran 2

TIDAK

Contoh Masukan 3

Apakah semua orang ganteng?

Contoh Keluaran 3

TIDAK

Contoh Masukan 4

Apakah hanya ada satu orang di muka bumi yang memang ganteng?

Contoh Keluaran 4

YA

Contoh Masukan 5

Apakah kegantengan itu bersifat mutlak?

Contoh Keluaran 5

YA

Contoh Masukan 6

Apakah orang yang belum ganteng dapat menjadi ganteng jika berhasil menyelesaikan soal ini?

Contoh Keluaran 6

YA

Contoh Masukan 7

Apakah orang yang tidak berhasil menyelesaikan soal ini juga ganteng?

Contoh Keluaran 7

TIDAK

Contoh Masukan 8

Apakah setiap orang memang diharuskan menjadi ganteng?

Contoh Keluaran 8

YA

Contoh Masukan 9

Apakah kegantengan itu hanya sebatas permainan?

Contoh Keluaran 9

TIDAK

Contoh Masukan 10

Apakah semua ini serius?

Contoh Keluaran 10

TIDAK

Batasan

  • Panjang string S minimal 1 dan tidak lebih besar daripada 1000.
  • Karakter pada string S hanya berupa huruf kecil, huruf kapital, spasi, dan tanda tanya.
  • Dijamin bahwa string S tidak memiliki spasi pada awal maupun akhir string dan tidak terdapat adanya 2 spasi yang letaknya bersebelahan.
  • Dijamin bahwa terdapat tepat satu karakter tanda tanya pada S dan terletak di akhir string.


Perhatikan setiap case yang ada, YA atau TIDAK jawaban terlihat dari banyaknya kata pada setiap kalimat/case yang diberikan.
Jika jumlah kata pada case yang diberikan ganjil maka keluaran YA
Jika jumlah kata pada case yang diberikan genap maka keluaran TIDAK

Namun hal yang membuang-buang waktu jika harus membuat algoritma penghitung kata lagi. Cara yang tepat adalah dengan memperhatikan Batasan yang diberikan.
Dikatakan bahwa

  • Panjang string S minimal 1 dan tidak lebih besar daripada 1000.
  • Karakter pada string S hanya berupa huruf kecil, huruf kapital, spasi, dan tanda tanya.
  • Dijamin bahwa string S tidak memiliki spasi pada awal maupun akhir string dan tidak terdapat adanya 2 spasi yang letaknya bersebelahan.
  • Dijamin bahwa terdapat tepat satu karakter tanda tanya pada S dan terletak di akhir string.
Dari batasan yang diberikan kita dapat memanfaatkan jumlah spasi yang ada ditengah kalimat.
Jika jumlah kata genap maka jumlah spasi ganjil dan sebaliknya

Hal yang dilakukan untuk menyelesaikan kasus ini adalah memperhatikan setiap karakter yang diinput. Dari batasan didapat bahwa setiap kalimat selalu diakhiri dengan tanda tanya (?)

untuk sementara dapat dibuat code sbb

repeat
    read(c);
    if(c=' ') then <kosong>
until(c='?');

Masih ada code yang kosong. Yang akan diisi pada <kosong> adalah banyaknya spasi yang ada pada kalimat.
Sebagian orang akan berpikir mengisi bagian kosong diatas dengan
     i:=i+1; atau inc(i);
Mari kita analisa keluaran akhir i
Jika i=1,3,5,7,9,11,dst maka cetak TIDAK dan i=2,4,6,8,10,dst maka cetak YA.
Untuk lebih menghemat penggunaan memori maka cara diatas dapat diganti dengan penggunaan booelan. Caranya dengan mengganti keaadaan boolean setiap spasi ditemukan.
Mis. "

Contoh Masukan 1

Apakah Ammar memang ganteng?
Kita misalkan booelan b diinisialkan bernilai TRUE
ketika spasi pertama ditemukan ubah menjadi FALSE
ketika spasi kedua ditemukan ubah menjadi TRUE
ketika spasi ketiga ditemukan ubah menjadi FALSE

Didapat jika hasil akhir booelan FALSE maka jumlah spasi ganjil dan sebaliknya
sehingga bagian <kosong> dapat diisi dengan b:=not(b); 
maka code sementara