pengantar
Beberapa hari yang lalu saya membutuhkan metronom untuk sesuatu. Saya tidak punya satu pun jadi saya mengunduh aplikasi dari App Store. Aplikasi ini memiliki ukuran 71 MB !!!
71 MB untuk membuat tic-toc ...?!
Jadi kode-golf muncul di benak saya dan saya bertanya-tanya apakah beberapa dari kalian bisa memperbaiki ini.
Tantangan
Golf beberapa kode yang menghasilkan suara. Suara apa yang agak tidak relevan. Jika diperlukan buat beberapa file suara ... tetapi bip Sistem akan melakukan pekerjaan dengan baik. ( Ini beberapa suara yang saya buat ... tidak ada yang istimewa. )
Input : Detak per menit output metronom.
Contoh
Ini adalah versi Java non-golf! Hanya untuk menunjukkan tugasnya kepada Anda.
public class Metronome {
public static void main(String[] args) throws InterruptedException {
int bpm = Integer.valueOf(args[0]);
int interval = 60000 / bpm;
while(true) {
java.awt.Toolkit.getDefaultToolkit().beep();
// or start playing the sound
Thread.sleep(interval);
System.out.println("Beep!");
}
}
}
Aturan
Anda tidak boleh menggunakan perpustakaan eksternal, hanya alat bahasa itu sendiri yang diperbolehkan.
Hanya byte dari kode sumber yang dihitung ... bukan file suara.
Ini adalah kode-golf , jadi pengiriman dengan jumlah byte paling sedikit menang!
EDIT:
Contoh output: Jadi sesuatu seperti ini akan menjadi output untuk tautan 120 bps :
beep()
output kedua dan konsol tidak persis IIRC instan. Baiksleep()
dikenal karena akurat.Jawaban:
Mathematica, 26 byte
Do
biasanya digunakan sebagai "untuk" loop dalam arti tersempit: ulangi potongan kode ini untuk masing-masingi
darix
key
... atau bahkan hanya mengulangi potongan kode inin
kali. Alih-alih angkan
kita bisa memberikannya tanpa batas meskipun untuk membuat loop tak terbatas. Tubuh loop adalahPause[Beep[];60/#]
yang hanya cara golf diBeep[];Pause[60/#]
mana#
argumen fungsi.Jika solusi yang diterima untuk meledakkan tumpukan panggilan pada akhirnya, kita dapat menyimpan satu byte dengan solusi rekursif:
sumber
~Do~∞
itu mungkin. SatuFor
loop hanya membuat saya menjadi 29 byte. (Juga, saya pribadi percaya bahwa versi 26-byte adalah satu-satunya yang valid.)~Do~∞
sepertinya tidak berfungsi ketika∞
berasal dari variabel. (Saya mencoba menggunakannya saat bermain golf di mesin kebenaran Anda.)Attributes[Do]
termasukHoldAll
, jadi dugaan saya adalah yang_~Do~∞
memiliki pola evaluasi khusus.Do[...,a]
manaa
memegang infinity benar-benar menunjukkan panggilan sebagaiDo[...,{a}]
.Pyth,
11109 byteTerima kasih kepada Adnan untuk mengingatkan saya tentang
#
.Forever (
#
), cetakC
kode har7
. Kemudian sleep (.d
)60
detik dibagi dengan (c
) input (Q
).sumber
7.
akan diuraikan sebagai angka.#pythnoob
JavaScript,
36 45 42 4134 byteDisimpan 1 byte berkat @RikerW
Disimpan 1 byte berkat @ETHproductions
Ini sebuah fungsi.
Jika saya menggunakan
`\7`
, SpiderMonkey mengeluh literal oktal sudah usang.Alternatif, 31 byte
Masalahnya adalah unsintables dilucuti tetapi ini harus bekerja.
sumber
Bash,
535541 byteTerima kasih kepada @Dennis karena mencukur 14 byte 1
Oke, waktu yang tepat: Aku payah bermain golf. Bantuan apa pun akan sangat dihargai.
1 sial. Tidak heran tidak ada yang bisa mengalahkan Dennis.
sumber
while 1
mungkin?while printf \\a
mungkin?bc
.read
. 3.echo
ada dengan kode 0, sehingga Anda dapat menggunakan pernyataan itu alih-alihtrue
.JavaScript ES6 (browser), 43 byte
Ini mungkin memperluas aturan:
Beri nama fungsi ini (misalnya
F=x=>...
) dan masukkan di konsol browser di halaman ini . Kemudian panggil fungsi dengan bps Anda, mis.F(60)
, Dan tunggu keajaiban terjadi. :-)Mengapa ini bekerja? Nah,
b.html
ada di folder yang sama dengan file bernama1
, yang merupakan file sampel suara dari OP. Saya tidak yakin apakah ini sesuai aturan (saya kira itu seperti versi shell; perlu dijalankan di lingkungan tertentu), tetapi layak dicoba.Versi lebih aman, 57 byte
Jika kode di atas tidak diizinkan karena alasan tertentu, coba ini sebagai gantinya:
Bekerja pada halaman mana saja!
sumber
05AB1E , 31 byte
Kode:
Jika saya memiliki built-in untuk menunggu N detik, ini bisa jadi 11 byte. Sayangnya, ini bukan masalahnya. Berikut penjelasannya:
Menggunakan penyandian ISO 8859-1.
sumber
time.sleep
dan.pop()
di tengah kode seperti itu. ;)naskah, 39 byte
Ada secara harfiah perintah yang disebut bip? Sweeeet!
Runnable hanya pada Mac OS X karena lisensi terbatas, tetapi untuk menjalankan, lakukan:
sumber
Python,
686757 byteDisimpan 1 byte berkat @FlagAsSpam
Disimpan 9 byte berkat @Adnan
Juga butuh 2 byte lebih sedikit setelah mengkonversi akhir baris ke format UNIX.
Versi yang lebih lama, yang sebenarnya menggunakan bpm sebagai argumen baris perintah (66 byte):
sumber
print"\7";
? Saya tidak yakin, tapi saya cukup yakin itu berhasil.a=input()
dana
menggantiint(sys.argv[1])
? Saya selalu berpikir bahwa Python 2 secara otomatis mengevaluasi input dan oleh karena itu tidak memerlukan konversi int, tetapi saya mungkin salah.input()
sebenarnya melakukan evaluasi otomatis. Saya lupa tentang fitur itu. Ini agak unpythonic - mungkin warisan dari masa lalu.time.sleep(60./a)
diganti dengantime.sleep(60./input())
, sementara sepenuhnya menghapusa=input()
?Otomatis , 56 byte
sumber
Vitsy, 14 byte
Mode Verbose (juru bahasa segera hadir):
Pada dasarnya, saya menggunakan
w
operator untuk menunggu sejumlah detik seperti yang ditentukan olehbpm/60
, terbungkus dalam infinite loop. Kemudian, saya membuat noise dengan output terminal karakter ASCII 7 (BEL
).sumber
java -jar Vitsy.jar <filename>
.C #, 118 byte
Solusi dasar.
sumber
System.Console.Beep();
, dan mencetak menggunakan karakterSystem.Console.Write('<\a character>');
.Java,
10382 byteTerima kasih kepada @Justin karena telah memangkas 21 byte!
Ya ampun.
Metode dan versi sampel program golf.
sumber
System.out.print('\7');
bukanjava.awt.Toolkit.getDefaultToolkit().beep();
?'\7'
adalah karakter bel, yang mengeluarkan suara saat dicetakKode Mesin GMC-4 , 21,5 byte
GMC-4 adalah komputer 4-bit oleh sebuah perusahaan bernama Gakken untuk mengajarkan prinsip-prinsip bahasa assembly dalam set instruksi dan komputer yang disederhanakan. Rutin ini mengambil input alamat memori data
0x5D
melalui0x5F
, dalam desimal big-endian (yaitu, satu digit per gigitan).Algoritma ini pada dasarnya menambahkan input ke memori dan menunggu 0,1s, sampai setidaknya 600, dan kemudian mengurangi 600 dan berbunyi bip, dalam loop tak terbatas. Karena GMC-4 memiliki banyak fungsi swap register tetapi tidak ada fungsi copy register , ini dilakukan dengan cara yang sulit.
Dalam hex (baris kedua adalah posisi di memori):
Dalam perakitan:
Penolakan:
Saya sebenarnya tidak memiliki GMC-4. Saya telah dengan cermat memeriksa program ini dengan dokumentasi dari online, tetapi saya mungkin telah melakukan kesalahan. Saya juga tidak tahu endianness. Sepertinya GMC-4 adalah big-endian, tapi saya tidak yakin. Jika ada yang memiliki GMC-4 dan dapat memverifikasi ini / katakan padaku endianness dari GMC-4, saya akan sangat menghargainya.
sumber
C, 48 byte
Solusi khusus Windows (fungsi Sleep (), lebih spesifik).
Saya juga (ab) menggunakan fakta bahwa printf () mengembalikan jumlah karakter yang dicetak untuk menggunakannya sebagai kondisi loop tak terbatas.
ADA karakter antara tanda kutip ganda dalam panggilan printf (), tetapi tidak ditampilkan di sini untuk beberapa alasan. Jika ragu, salin dan tempel ke Sublime Text 2 atau Notepad ++, karakter akan ditampilkan sebagai
BEL
.Ini dimulai sebagai solusi C ++ tetapi agak jatuh ke dalam C-subset dari C ++ (karena, Anda tahu,
Sleep()
sedikit lebih pendek daristd::this_thread::sleep_for(std::chrono::milliseconds())
) danprintf()
lebih pendek daristd::cout<<
).sumber
AppleScript 94 byte
Saya tahu saya sangat terlambat, dan ini adalah posting pertama saya di sini, tetapi apa pun itu.
Tidak Disatukan:
sumber
VBScript,
11366 byteProgram ini cukup sederhana; dibutuhkan input, gema karakter BEL, dan menunggu. Terima kasih kepada Niel karena telah mencukur hampir setengah dari program!
sumber
WScript.Echo CHR(7)
? Juga, maksud Anda60000
?Ruby,
3733 byteCukup mudah.
Ini adalah fungsi lambda. Jika Anda ingin 60 bpm, Anda akan melakukan:
m[60]
.sumber
$><<?\a
juga harus bekerja untuk bip. Dan tidak perlu untuk memberikan nama untuk proc Anda (semua solusi JavaScript dengan fungsi panah lemak juga meninggalkannya belum ditetapkan), Anda dapat menyebutnya anonim juga:->b{loop{$><<?\a;sleep 6e1/b}}[60]
.?\a
; apakah Anda memiliki Ruby 1.x? Jika demikian, dapatkah Anda menguji apakah ini berhasil?Japt, 30 byte
The
?
harus menjadi byte literal9A
. Uji secara online! (Maaf tentang pop-up yang menunda beberapa ketukan pertama; ini akan segera dihapus.)Bagaimana itu bekerja
sumber
Mumps, 18 byte
Baca BPM ke dalam variabel I, maka F {dengan dua spasi setelah} adalah infinate loop. Hentikan selama 60 detik / BPM, kemudian tulis $ CHR (7) {Ascii: BEL} ke output standar, berikan output audio yang diperlukan, kemudian mulai kembali pada infinite loop.
sumber
Java, 321 karakter
Kedengarannya sangat bagus. Hanya bekerja pada sistem dengan dukungan MIDI.
.
sumber
ChucK , 90 byte
Kebisingan putih yang dinyalakan dan dimatikan setiap dua kutu.
Penjelasan
Ini dibuat untuk menyalakan suara saat berdetak, kemudian mematikannya pada ketukan sesudahnya.
Versi9893 byte (peternak)Kebisingan putih dimainkan selama 10 milidetik per centang.
Ini dibuat sebagai klik dan bukannya derau konstan dihidupkan dan dimatikan.
sumber
Perl 5, 36 byte
Subrutin; gunakan sebagai
sumber
sleep
dalam hitungan detik, jadi Anda tidak dapat memiliki lebih dari 60 bip per menit, tidak yakin apakah itu persyaratan. Juga, Anda mungkin dapat menyimpan jumlah byte yang sama tetapi memiliki program lengkap dengan melakukan sesuatu seperti:$|=<>;{print"\a";sleep 60/$|;redo}
(tidak dapat mengujinya sekarang).sleep
. Tetapi itu berhasil bagi saya.Jolf, 7 byte, tidak bersaing
Saya menambahkan suara setelah tantangan yang sangat halus ini dibuat.
Jika Anda ingin menghapus suara ini, perhatikan hasilnya. Katakan nomor itu
x
. Jalankan perintah Jolf yang lain~CP"x"
, dan intervalnya akan dihapus.sumber
Zsh , 32 byte
Berdasarkan jawaban bash terkemuka, tetapi
source
bukanexec
s. Sumber TIO sumber$0:a
karena bagaimana file asli dieksekusi, tetapi itu akan bekerja tanpa itu.Cobalah online!
sumber
Bash + bc + > <> , 44 byte
Bermain dengan fakta bahwa juru <>> memungkinkan Anda menentukan waktu centang:
Kode> <> adalah
7o
dan harus menampilkan BELkarakter, menghasilkan bunyi bip sistem. Ini akan berulang sampai terputus.The
-t
nilai diatur ke (2 / RPM) / 60 sehingga seluruh kode dimainkan RPM * 60 kali per detik.sumber
bc
menginstal? Sepertinya$(bc -l<<<"2/$1/60")
tidak menghasilkan output apa pun. Saya akan menambahkannya ke daftar bahasa jawabannya. Saya belum dapat sepenuhnya menguji jawaban saya, jadi mungkin ada beberapa jenis kesalahan juga.SmileBASIC, 26 byte
Itu dapat memainkan instrumen midi umum, meskipun apa pun di atas 9 akan menggunakan lebih banyak byte
sumber
Stax, 17 byte
atau, dibongkar:
Program menghasilkan byte yang, ketika diumpankan melalui aplay alat baris perintah dengan pengaturan default, menghasilkan suara metronom. Input digunakan sebagai bpm
contoh:
Anda harus mendengar bunyi bip mengerikan pada bpm yang diinginkan
sumber