Saya seorang mentor di RubyLearning dan salah satu latihan yang kami berikan kepada siswa kami adalah latihan "Tuna Rungu" dari buku Chris Pine, " Learn to Program ". Berikut uraiannya:
Tulis program Nenek Tuli. Apa pun yang Anda katakan kepada nenek (apa pun yang Anda ketikkan), ia harus menjawab dengan: "Hah ?! Bicaralah, Nak!", Kecuali Anda meneriakkannya (ketikkan semua huruf besar). Jika Anda berteriak, dia bisa mendengarmu (atau setidaknya menurutnya begitu) dan berteriak: "Tidak, tidak sejak 1938!"
Untuk membuat program Anda benar-benar dapat dipercaya, mintalah nenek berteriak tahun yang berbeda setiap kali; mungkin setiap tahun secara acak antara 1930 dan 1950. (Bagian ini opsional, dan akan jauh lebih mudah jika Anda membaca bagian tentang penghasil angka acak Ruby di akhir bab metode.) Anda tidak dapat berhenti berbicara dengan nenek sampai Anda teriak "BYE".
Setelah beberapa kali pengulangan, saya mencoba melihat seberapa kecil saya bisa mendapatkan ini dan sekarang memilikinya hingga 112 karakter:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Saya ingin tahu seberapa sedikit karakter ini dapat dicapai dalam bahasa pilihan Anda, karena saya pikir Ruby sudah melakukannya dengan sangat baik di sini.
Sunting: Solusi Perl yang diposting di bawah ini mengarah ke
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
yang merupakan 92 karakter untuk ekspresi + 2 lebih banyak untuk opsi n
dan l
.
Jawaban:
Perl, 85
91Jalankan dengan
perl -nE '<code goes there>'
(n
dihitung dalam ukuran program):Tanda seru itu sangat mahal ...Suntingan yang disarankan oleh IK:
-l
opsi global serta dua karakter program: -3.$=
, dibatasi menjadi bilangan bulat: -4.(Dan itu masih belum sesuai dan saya terlalu mengantuk untuk mencari tahu mengapa. Oh well, hitungan terakhir setidaknya benar)
sumber
$=
dan menggunakan regexp untuk "BYE" akan menurunkannya menjadi 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 Karakter
Ada petunjuk untuk diperbaiki?
sumber
s=''
, menyusun ulang pernyataan Anda di loop sementara Anda, dan menempatkan keseluruhan loop sementara pada satu baris: gist.github.com/3787809 Jika Anda benar-benar ditentukan, Anda bisa simpan 2 karakter dengan menggunakan python 3 (raw_input () -> input (), tetapi cetak -> print ())131 karakter di PowerShell:
W / spasi putih:
Meremas 18 karakter dari saran Joey.
BTW, 'Belajar Program' adalah buku pemrograman pertama yang pernah saya baca sampul depan.
sumber
if...
ke dalam pemeriksaan bersyaratfor()
seperti ini:for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
Juga, spesifikasi mengatakan 1930-1950.C # - 234 Chars
Lebih mudah dibaca:
sumber
Befunge - 27x6 = 162 karakter
EDIT: Benar-benar melewatkan bagian "BYE". Versi baru segera hadir.
EDIT 2: Sebenarnya, itu membuatnya agak terlalu rumit untuk keterampilan Befunge saya yang sedikit. Saya mungkin mencoba lagi nanti, tetapi saya tidak bisa memikirkan cara sederhana untuk mengimplementasikannya saat ini.
sumber
C # - 194 BIAYA
Dengan spasi putih:
Dengan beberapa inspirasi dari Nellius dan fR0DDY.
Tolong beri tahu saya jika itu dapat ditingkatkan.
sumber
Main()
). Juga, saya pikir Anda ingin orangtua dalam?:
ekspresi untuk mendapatkan!
keduanya. Saya menambahkan jawaban dengan ini dan EOL (tapi masih bocor).Main();
solusinya ... tidak ada orang waras yang akan menggunakan program ini cukup lama untuk itu menjadi masalah.D: 246 Karakter
Lebih Jelas:
sumber
javascript, 142 karakter, 29 di antaranya melakukan tahun acak
sumber
Awk: 97 karakter
sumber
Windows PowerShell,
121117Karena sifat tugas ini terlihat cukup identik dengan solusi Ty Auvil , meskipun ditulis secara independen:
Terima kasih kepada SpellingD untuk sarannya,
sumber
if
gantinya seperti ini:for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}
Haskell (189)
Yang aneh adalah, kode Haskell biasanya jauh lebih pendek daripada kode C yang sebanding ketika menulis program 'serius'.
sumber
Char
dengan menggunakanany(`elem`['a'..'z'])s
untuk menguji huruf kecil.APL (76)
sumber
C # - 345 Karakter
Bahasa kasar sialan: :-)
sumber
P
. Dan ini tidak mendeteksi huruf besar dengan benar. Saya bisa berteriak dan masih tidak bisa mendengar saya. Anda dapat mempersingkat metode utama menjadiwhile(t(Console.ReadLine()));
. Anda dapat menggunakanusing C=System.Console;
di awal untuk mempersingkat akses keReadLine()
danWriteLine()
keC.ReadLine()
danC.WriteLine()
.C # - 196 karakter (tapi bocor)
using System;class P{static void Main(){var s=Console.ReadLine();if(s!="BYE"){Console.Write((s==s.ToUpper()?"No, not since 19"+new Random().Next(30, 51):"Huh?! Speak up, sonny")+"!\n");Main();}}}
Itu @ Richard's (bocor) jawaban dengan dua parens (lihat di bawah) dan a \ n ditambahkan di sana untuk mendapatkan EOL dalam kedua kasus. Kalau tidak,
" + "
hanya ruang terbuang.Diformat
UPDATE: untuk mengklarifikasi komentar saya tentang parens yang diperlukan, inilah yang saya dapatkan tanpa parens (yaitu dengan solusi asli @ Richard):
Dan dengan parens:
Tak satu pun dari ini menggunakan tambahan saya
\n
.sumber
Bash:
136128 karakterAlternatif terbatas:
132123 karakterAnda dapat berbicara dengan tuli tanpa batas, tetapi percakapan dengan kode nanti dibatasi oleh tumpukan panggilan. (Dalam pengujian saya akan dihentikan setelah 4989 panggilan.)
sumber
Javascript -
133131130128127121 karakterversi golf dari solusi www0z0ks
Sunting: Menyimpan enam karakter lainnya dengan tip hebat ini
sumber
g=/[a-z]/.test(i)?'Huh?!...':'No...'
dan Anda menyimpan 2 karakter.Math.ceil()
lebih pendek dariMath.floor()
. Hanya mengubah tahun dasar untuk menjaga interval tidak berubah:Math.ceil(Math.random()*21+1929)
.Clojure -
160154 KarakterBekerja untuk bermain golf sedikit lebih. Saran diterima.
Jalankan melalui REPL
sumber
Q, 115
pemakaian
sumber