Tantangan ini adalah hadiah NinjaBearMonkey untuk memenangkan Kawanan Blok Bangunan Bot saya! menantang dengan pengajuan Black Knight . Selamat, NinjaBearMonkey!
Tantangannya di sini cukup sederhana, tetapi memiliki berbagai pendekatan yang mungkin. Ceritanya bahwa di dunia Ilusi Isometrik , ada 6 jenis makhluk:
- Ninja, disingkat
N
- Beruang, disingkat
B
- Monyet, disingkat
M
- NinjaBears, disingkat
NB
- BearMonkeys, disingkat
BM
- NinjaBearMonkeys, disingkat
NBM
( NinjaBearMonkey , tentu saja, tipe terakhir, yang paling kuat.)
Tugas Anda adalah mengambil sensus makhluk-makhluk ini ketika mereka berbaris berdampingan, yaitu ketika string singkatan mereka digabungkan. Peringatannya adalah bahwa Anda perlu memastikan untuk tidak terlalu menghitung bagian-bagian dari beberapa makhluk sebagai makhluk terpisah yang kebetulan terlihat serupa. Makhluk itu akan berbaris sedemikian rupa sehingga:
- Instance dari
NBM
adalah 1 NinjaBearMonkey dan 0 makhluk lainnya. - Contoh yang
NB
tidak diikutiM
adalah 1 NinjaBear dan 0 makhluk lainnya. - Contoh yang
BM
tidak didahului olehN
adalah 1 BearMonkey dan 0 makhluk lainnya. - Kalau tidak, contoh dari
N
,,B
danM
Ninjas, Beruang, dan Monyet masing-masing.
Baris dibaca dari kiri ke kanan.
Jadi, misalnya, di garis makhluk NBMMBNBNBM
, ada 0 Ninja, 1 Beruang, 1 Monyet, 1 NinjaBear, 0 BearMonkeys, dan 2 NinjaBearMonkeys.
Tantangan
Tulis program atau fungsi yang mengambil string karakter N
,, B
dan M
, dan cetak atau kembalikan berapa banyak dari masing-masing dari 6 jenis makhluk yang ada di dalamnya.
Keluaran harus memiliki formulir
#N #B #M #NB #BM #NBM
dengan jumlah makhluk masing-masing menggantikan setiap #
tanda. Semua 6 hitungan harus ditunjukkan, dipisahkan oleh spasi, bahkan ketika mereka 0. Namun, mereka mungkin dalam urutan apa pun (misalnya #NBM
bisa didahulukan).
Juga:
- Input string hanya akan berisi karakter
N
,B
danM
. - Jika string kosong dimasukkan, maka semua jumlah adalah 0.
- Output secara opsional dapat berisi satu spasi awal dan / atau trailing, dan / atau baris baru trailing tunggal.
Pengajuan terpendek dalam byte menang.
Contohnya
Input: NB
Keluaran:0N 0B 0M 1NB 0BM 0NBM
Input: NBM
Keluaran:0N 0B 0M 0NB 0BM 1NBM
Input: NBMMBNBNBM
(contoh dari atas)
Output:0N 1B 1M 1NB 0BM 2NBM
Input: MBNNBBMNBM
Keluaran:1N 1B 1M 1NB 1BM 1NBM
Input: NNNMNBMMBMMBMMMNBMNNMNNNBNNNBNBBNBNMMNBBNBMMBBMBMBBBNNMBMBMMNNNNNMMBMMBM
Keluaran:17N 6B 14M 5NB 8BM 3NBM
NBMNBM
akan menjadi input yang benar-benar valid. Membaca dari kiri ke kanan jelas ada 2 NinjaBearMonkeys.Jawaban:
Pyth, 22 byte
Cara cukup hack untuk menyimpan 1 byte, terima kasih kepada @ Jakube.
Pyth, 23 byte
Demonstrasi.
Mencetak dalam urutan terbalik, dengan spasi tambahan dan tanpa tambahan baris baru.
.:"NBM")
adalah semua substring,_
menempatkannya dalam urutan yang benar,/zN
menghitung kejadian, dan=:zNd
menggantikan setiap kemunculan string yang dipertanyakan dengan spasi.sumber
JavaScript ES6, 86 byte
(Saya hanya harus menjawab ini.) Ia melewati setiap substring
NBM
, mulai dari substring yang lebih panjang, yang mengambil prioritas lebih tinggi. Ia mencari setiap kemunculan string tertentu dan menghapusnya (dalam hal ini menggantinya dengan jumlah saat ini sehingga tidak akan cocok lagi). Akhirnya menggantikan setiap substring dengan jumlah + string.Cuplikan Stack ini ditulis dalam ES5 yang setara dengan kode di atas untuk membuatnya lebih mudah untuk diuji dari browser apa pun. Ini juga kode yang sedikit tidak diubah. UI diperbarui dengan setiap penekanan tombol.
sumber
'NBM<newline>BM<newline>...<newline>N'.replace(/./g, ...)'
, di mana<newline>
s adalah baris baru literal dan'
s adalah backticks, membentuk string template ES6? Menghemat dua byte di regex (.
tidak cocok dengan baris baru).Python 2, 78
Varian dari jawaban Vioz- . Bersenang-senang dengan representasi string Python 2!
Menghitung kemunculan substring secara tidak langsung dengan membelahnya, menghitung bagian-bagian, dan mengurangi 1. Alih-alih mengganti substring dengan simbol filler, ganti string dengan daftar yang
split
dihasilkan. Kemudian, ketika kita mengambil representasi stringnya, bagian-bagian dipisahkan oleh spasi dan koma.sumber
Ruby,
166807268 karakterPenjelasan:
Penghitungan dilakukan secara terbalik. Ini karena semakin lama ninja, beruang, dan monyet lebih diutamakan daripada yang lebih pendek.
Untuk
NBM
,,BM
danNB
, urutannya akangsub!
keluar dari string asli dengan blok untuk menghitung berapa banyak urutan ini ada (ya, fungsi memodifikasi argumennya).BNBMM
tidak akan dihitung sebagaiNBM
danBM
bukanB
,NBM
danM
(karena ketikaNBM
akan dihapus, itu akan menempatkanB
danM
bersama-sama dan tidak akan ada cara untuk membedakannya). Awalnya saya mengembalikan string karakter tunggal (.gsub!('NBM'){c+=1;?|}
), tetapi saya menyadari saya hanya bisa mengembalikan hasil dari+=
(yang merupakan angka, jadi tidak bisa apa-apaN
B
M
).UntukSekarang ini adalah pengulangan (tidak tahu mengapa saya tidak memikirkan hal itu sejak awal), jadi ini dilakukan dengan cara yang sama.M
,,B
danN
, saya bisa hanyacount
berapa banyak dari mereka yang ada di string (tidak perlu menghapusnya melaluigsub!
).Solusi serupa di Ostrich ,
5451 karakter :Sayangnya bukan solusi yang valid, karena ada bug dalam versi Ostrich saat ini (yang sekarang sudah diperbaiki, tetapi setelah tantangan ini diposting).
sumber
%w(NBM BM NB M B N)
dan menghapus pemisahan.Jawa,
166162Dan dengan beberapa jeda baris:
Ini bekerja sangat sederhana. Lingkarkan token, ganti dengan titik dan hitung selama input mengandung beberapa. Hitung yang besar dulu, jadi yang kecil tidak mengacaukannya.
Saya awalnya mencoba mengganti sekaligus dan menghitung perbedaan panjangnya, tetapi butuh beberapa karakter seperti itu :(
sumber
println
Pernyataan saya sendiri lebih besar dari itu. Saya puas dengan itu: DString q[]=
keString[]q=
CJam,
363231 byteTerima kasih kepada @Optimizer untuk bermain golf 1 byte.
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
N*
->`
sudah cukup.R,
153134118Ini menjadi lebih lama dengan sangat cepat, tapi semoga saya bisa mencukurnya. Input adalah STDIN dan output ke STDOUT.
Edit Perubahan taktik. Singkirkan string perpecahan dan penghitungan bagian. Sekarang saya mengganti bagian-bagian dengan string yang lebih pendek daripada bagian. Perbedaan antara panjang string dikumpulkan untuk output.
Penjelasan
Uji coba
sumber
Pyth, 19 byte
Ini adalah campuran dari solusi Pyth @ isaacg dan trik Python @ xnor yang luar biasa.
Cobalah secara online: Demonstrasi atau Uji harness
Penjelasan
sumber
Julia,
10697 byteIni menciptakan fungsi tanpa nama yang mengambil string sebagai input dan mencetak hasilnya ke STDOUT dengan satu spasi tambahan dan tanpa tambahan baris baru. Untuk menyebutnya, berikan nama, mis
f=b->...
.Penjelasan + tidak dikumpulkan:
Contoh:
sumber
Python 2,
93888984 BytesMengambil pendekatan langsung.
Sebut seperti ini:
Outputnya seperti ini:
sumber
in
.SAS,
144 142 139129Penggunaan (7 byte ditambahkan untuk sysparm):
atau
Pemakaian:
Hasil:
sumber
cats('s/',z,'/x/')
di tempat's/'||strip(z)||'/x/'
.macro a i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%
data;i="&sysparm";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;
. Karena Anda sudah membaca darisysparm
, Anda bisa menjalankannya sebagai langkah data. Dan jika Anda berjalan dalam batch, Anda tidak perlurun;
.%macro a(i);i="&i";do z='NBM','NB','BM','N','B','M';a=count(i,z,'t');i=prxchange(cats('s/',z,'/x/'),-1,i);put a+(-1)z@;end;%mend;
PHP4.1, 92 byte
Bukan yang terpendek, tapi apa lagi yang Anda harapkan dari PHP?
Untuk menggunakannya, tetapkan kunci pada COOKIE, POST, DAPATKAN, SESI ...
Apporach adalah dasar:
Mudah kan?
sumber
JavaScript,
108116 byteHanya pendekatan yang lurus ke depan, tidak ada yang mewah
sumber
All 6 counts must be shown, separated by spaces, even when they are 0.
. Test case:N
Perl, 46
sumber
SpecBAS - 164
Menggunakan pendekatan yang sama seperti banyak orang lain. Baris 4 terus berputar di atas string (dari yang terbesar pertama), menggantikannya jika ditemukan.
SpecBAS memiliki beberapa sentuhan yang bagus pada ZX / Sinclair BASIC asli (pengulangan daftar, menemukan karakter) yang saya masih temukan.
sumber
C,
205186184 bytePendekatan yang sedikit berbeda berdasarkan mesin negara. dimana
t
negaraDiperluas
Fungsi tes
sumber
for(;;*s++){...}
alih-alihdo{...}while(*s++);
menyimpan beberapa byte? Anda juga tidak memerlukan karakter baris baru diprintf
.for(;*s;s++)
. Tapi saya perlu mengulang dengan nol karakter terakhir. Panggilan yang baik untuk menyimpan\n
, yang tidak diperlukan.C, 146
sumber
Haskell - 177 byte (tanpa impor)
(Maaf untuk necromancy internet di sini.)
Platform Haskell tidak memiliki pencarian string tanpa impor, dan saya ingin memamerkan dan mengeksploitasi fakta bahwa string yang dicari adalah semua substring dari satu (tanpa pengulangan), sehingga karakter pengelompokan dapat dilakukan dengan mengidentifikasi pasangan yang diizinkan untuk saling mengikuti, itulah yang
f
dilakukan di sini.Saya masih memerlukan daftar lengkap
l
pada akhirnya untuk memeriksa kesetaraan dan menampilkan persis seperti yang disyaratkan, tetapi tidak akan, jika tantangannya hanya melaporkan jumlah kemunculan yang mungkinwords
dalam urutan apa pun.sumber
Bash - 101
Lewati string sebagai argumen pertama.
Dijelaskan sedikit:
sumber
rs , 275 byte
Demo dan tes langsung.
Cara kerjanya sederhana tetapi sedikit aneh:
Ini secara kreatif menggunakan grup untuk mengubah input seperti:
ke
Baris selanjutnya:
Ini menggantikan urutan huruf kapital dengan garis bawah.
Ini hanya menyisipkan tanda pound pada awal baris.
Ini adalah bagian awal yang keren. Pada dasarnya ia mengambil urutan huruf kecil dan garis bawah, mengubahnya menjadi huruf besar, mengelompokkannya, dan menempatkannya di depan pound yang dimasukkan. Tujuan dari pound adalah untuk mengelola urutan yang sudah diproses.
Pound dimasukkan kembali pada awal baris.
Huruf kapital diganti dengan padanan teksnya dengan jumlah yang terkait. Karena bug di rs (saya tidak ingin mengambil risiko memperbaikinya dan didiskualifikasi), urutan kosong diubah menjadi
(^^)
, yang digantikan oleh 0 pada baris kedua hingga terakhir. Baris terakhir hanya menghilangkan pound.sumber
KDB (Q), 76 byte
Penjelasan
Uji
sumber
Haskell: 244 byte
sumber
p
dans
hanya sekali, jadi tidak perlu memberi nama (->a#[]=[]:a#"NBM"
, sama untukp
). BTW:words"N B M NB BM NBM"
bukannya daftar string menyimpan byte tambahan. Theimport
hanya untukintercalate
, itu lebih pendek te re menerapkan-itu:...putStrLn.tail.((' ':)=<<)$map...
dan menyingkirkanimport
. Letakkan semua penjaga|
dalam definisi#
dalam satu baris dan gunakan1<2
sebagai gantiTrue
:...#(b:m)|a==b=...l#m|1<2=[]...
...?
dapat didefinisikan lebih pendek dengan daftar pemahaman:c?t=sum[1|x<-c,x==t]
. Sekali lagi, Anda menggunakan?
hanya sekali, jadi gunakan tubuh secara langsung:...show(sum[1|x<-l#[],x==t])
.