Pemain game papan tradisional Go mengukur keterampilan mereka dalam sistem peringkat :
- Pemain baru dalam game ini peringkat ke-30 kyu (tertulis
30k
) dan maju menghitung mundur ke 1 kyu (tertulis1k
). Ini dianggap peringkat siswa . - Seorang pemain dapat mempromosikan dari 1 kyu ke 1 Dan peringkat (ditulis
1d
), dan kemudian kemajuan menghitung sampai ke-7 Dan peringkat (ditulis7d
). Ini adalah peringkat utama . - Pemain yang sangat terampil masa lalu
7d
dapat mempromosikan ke peringkat dan profesional 11p
, dan kemajuan penghitungan hingga peringkat profesional Dan ke 9 (tertulis9p
). Ini adalah peringkat tertinggi.
Singkatnya: peringkat diperintahkan 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
Tugas
Mengingat dua string antara { 30k
, ..., 1k
, 1d
, ..., 7d
, 1p
, ..., 9p
} sebagai input, output yang lebih tinggi pangkat dua. (Jika keduanya sama, cukup output salah satu input.)
(Seperti biasa, I / O fleksibel - jawaban Anda bisa berupa fungsi atau program penuh, membaca input dengan cara yang masuk akal dan menghasilkan output dengan cara yang masuk akal.)
Ini adalah kode-golf : tujuannya adalah untuk meminimalkan jumlah byte kode Anda.
Uji kasus
(Format:. input1 input2 output
)
29k 9k 9k
21k 27k 21k
6d 1p 1p
5d 17k 5d
1k 1d 1d
1d 1d 1d
1d 2d 2d
9p 1d 9p
2d 30k 2d
1p 1k 1p
1d 1p 1p
1p 2d 1p
7p 8p 8p
30k 30k 30k
4 k
atau4K
lebih.)30k
,29k
,1k
,1d
dan sebagainya, jadi saya tidak akan membiarkan variasi di sana.Jawaban:
JavaScript (ES7), 58 byte
Membawa dua string dalam sintaks currying
(a)(b)
.Cobalah online!
Bagaimana?
Fungsi helper g () menerjemahkan string input s menjadi skor.
1) Kami mencari s [1] ke dalam string "_dp" . Ini memberi:
2) Kami cube hasil ini, yang berarti 1 dan -1 tidak berubah tetapi memberikan 8 untuk peringkat Dan profesional .
3) Kami mengalikan bagian desimal dari peringkat.
sumber
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Jelly , 14 byte
Tautan monadik yang menerima daftar string * (seperti yang dijelaskan) yang menghasilkan peringkat tertinggi ditemukan.
* Juga berfungsi dengan angka selain dua.
Cobalah online! Atau lihat test-suite .
Bagaimana?
Urutkan oleh fungsi kunci dan mengembalikan paling kanan (yaitu maksimum).
Huruf , , dan masing-masing memiliki tata cara , , dan . Dalam biner, memiliki delapan bit yang ditetapkan sementara yang lain tidak, maka dengan bitwise ATAU dengan 8 kita mendapatkan 107, 108, dan 120 masing-masing - ini sekarang dalam urutan yang diperlukan untuk mengurutkan kelas yang mereka identifikasi.d p 107 100 112 107k d hal 107 100 112 107
Peringkat amatir berada dalam urutan menurun sehingga untuk melengkapi fungsi kunci kami, kami dapat menggabungkan pengidentifikasi kelas kami dengan angka yang diberikan dalam string, meniadakan jika string berakhir dengan (misalnya -> saat -> ). Dalam kode ini diperlukan penyimpanan pengenal kelas dan eksponensial minus satu untuk perkalian - - yang byte.16k 16
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Untuk memperbaiki ini, kita dapat menggunakan minus dua sebagai gantinya dan melipatgandakan elemen bersama-sama, yang dapat dicapai dengan satu perkalian.
Tabel tindakan fungsi-kunci ...
sumber
2^8=256
, yaitu ASCII, afaik. Bukankah Anda membutuhkan lebih dari satu byte untuk menyimpan karakter unicode?Jelly ,
1110 byteTerinspirasi untuk kembali ke papan gambar oleh Arnauld!
Tautan monadik yang menerima daftar string * (seperti yang dijelaskan) yang menghasilkan peringkat tertinggi ditemukan.
Cobalah online! Atau lihat test-suite .
Bagaimana?
Urutkan oleh fungsi kunci dan mengembalikan paling kanan (yaitu maksimum).
Fungsi kunci pertama-tama mengubah setiap k menjadi N menggunakan atom diad
y
, menerjemahkan, dengan daftar dua karakter⁾kN
(kode Jelly untuk['k','N']
) dan kemudian mengevaluasi string sebagai monad dengan argumen sembilan (dengan menggunakan kodev9
).Dalam Jelly:
N
adalah atom monadik yang meniadakan inputnya9 30N
tersebut tidak benar-benar menggunakan sembilan dan menghasilkan bilangan bulat-30
d
adalah atom diad yang menghasilkan hasil divmod Python dari dua nilai - pasangan hasil pembagian integer dan modulo9 7d
menghasilkan dipasangkan dengan yang merupakan[0,7]
p
adalah atom dyadic yang melakukan produk Cartesian, yang mencakup kisaran terindikasi 1-indeksasi inputnya9 p3
menghasilkan produk Cartesian[1,2,3]
dan[1,2,3,4,5,6,7,8,9]
yang mana[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
Setelah evaluasi tersebut dilakukan dengan menggunakan string untuk dibandingkan, kita harus dapat membandingkan hasilnya; karena int tidak dapat dibandingkan dengan daftar, kita perlu membungkus nilai yang dinegasikan dalam daftar, tetapi karena pemesanan masih akan berfungsi setelah
p
daftar diratakan (misalnya[[1,1],[1,2],...]
->[1,1,1,2]
) kita dapat menggunakan atom monadik bita-tunggal yangF
diterapkan untuk semua evaluasi.Tabel input ke nilai kunci mereka adalah sebagai berikut:
Komentar kode:
sumber
MATL ,
30282523 byteCobalah online!
(-2 byte terima kasih kepada Luis Mendo)
(lain -3 byte mengganti
v&X>
dengan>
, kali ini berdasarkan jawaban Luis Mendo ini)(-2 byte menggunakan
&)
sintaks)Penjelasan:
Kurangi 'k' dari karakter terakhir (beri n = -7, 0, 5 untuk 'd', 'k', 'p' masing-masing).
Hitung v = n ^ 2 + 6n-1 (masing-masing memberi 7, -1, 54).
Lipat gandakan nilai v dengan angka peringkat aktual (sehingga level k mendapatkan produk negatif, level d berubah dari 7 menjadi 49, level p dari 54 ke atas).
Lakukan itu untuk kedua input string, bandingkan produk
Dapatkan string input yang sesuai dengan produk yang lebih besar
Alternatif, metode yang lebih mudah:
23 byte
Cobalah online!
sumber
Haskell ,
7371 byteCobalah online!
Seperti biasa bagi saya, implementasi lurus ke depan daripada apa pun khususnya golf-y. Fungsi "(#)" mengambil dua peringkat sebagai string dan mengembalikan yang lebih besar. Hanya berfungsi dengan format yang ditentukan dalam pertanyaan.
(Saya juga sudah mencoba versi menggunakan
comparing
danmaximumBy
tapi itu akhirnya menjadi 3 byte lebih lama - sialan Andabase
dan nama fungsi yang kadang-kadang dapat dibaca manusia!)(Saran terapan oleh Amfibologis dan Lynn)
sumber
True
ke1<2
.(-x)
bisa0-x
.r(x,_)=x+7
!0-x
bisa `-x`)Python 2 , 54 byte
Cobalah online!
Menggunakan metode Arnauld . Pemetaan
int(x,27)%9-3
hanya tergantung pada huruf terakhirx
, karena semua digit tetapi yang terakhir berkontribusi kelipatan9
. Dibutuhkan:Ini adalah margin yang nyaris tidak cukup
1p
untuk dikalahkan oleh pengali7d
, peringkat tertinggi, ketika ditafsirkan dalam basis 26.Saya menemukan ini dengan ekspresi kasar dari bentuk ini dan beberapa lainnya.
Python 2 , 64 byte
Cobalah online!
sumber
R , 73 byte
Cobalah online!
as.double
alih-alihstrtoi
karena yang terakhir tidak menangani spasi / poin dan saya tidak bisa memikirkan karakter lain yang valid untuk digantid
rank
alih-alihorder
, karena mereka sama ketika hanya ada dua elemensumber
L
di tempat.
tetapi itu tidak berfungsi baik ... akan memberi tahu Anda jika saya dapat menemukan sesuatu yang lain.Jelly , 13 byte
Ini sangat berbeda dari jawaban Jelly saya yang lain , jadi saya memposting ini secara terpisah.
Mengambil input sebagai daftar dua (atau lebih) string.
Cobalah online!
Berkomentar
sumber
Julia 0,7
10093 byteIni bukan cara yang paling efisien, (kontras @ sundar's Julia 0,6 jawaban ) tetapi itu bagus karena ini murni numerik. Juga menggunakan pengiriman (meskipun sayangnya hanya sekali)
Kode yang sangat mirip berfungsi di 0,6 Cobalah secara online
Bagaimana:
Caranya ada pada
!(z)
fungsi.Ini memetakan nilai UTF-8:
k
menjadi angka negatif, jadi itu mundurd
menjadi angka positifp
menjadi angka positif yang lebih besarSeperti yang ditunjukkan:
Hasil tes
sumber
.~[a,b]
itu mungkin! Btw, saya pikir Anda dapat mengganti collect (r) dengan[r...]
dan menyimpan beberapa byte.Int[r...]
daripadaInt([r...])
menyimpan beberapa. Terima kasihargmax
denganindmax
) pada Julia 0.6 juga. Anda dapat memasukkan Cobalah secara online! tautan jika Anda mau.Haskell , 64 byte
Cobalah online!
Ekspresi
gcd(fromEnum c)28-3
memetakan karakter ke penggandaIdenya adalah untuk mengambil nilai karakter mereka
[107,100,112]
dan memilih28
untuk memiliki faktor yang semakin besar yang sama dengan mereka, dipermudah tetapi yang pertama menjadi prima. Metode ini menghemat 2 byte daripada menulis pemetaan secara eksplisit .Built-in
reads
digunakan untuk memisahkan jumlah dan peringkat.(Sebenarnya, pemisahan langsung dari Sara J adalah satu byte lebih pendek, memberikan 63 byte .)
Langkah take-the-large-one mengambil jumlah byte yang mengganggu dalam solusi saya. Saya mencoba pendekatan lain seperti iterasi dari peringkat dalam urutan menurun dan mengambil yang pertama adalah unsur
[a,b]
, tetapi ternyata lebih lama.sumber
MATL ,
2827 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Jelly , 16 byte
Mengambil input sebagai daftar dua string.
Cobalah online! (semua kasus uji)
Bagaimana?
Kode ASCII dari karakter peringkat dikonversi ke pengali dengan rumus berikut:mc m
Pemberian yang mana:
Berkomentar
Formula alternatif
Untuk 16 byte juga, kita dapat menggunakan:
Cobalah online!
sumber
JavaScript (ES6),
5554 byte-1 byte terima kasih kepada @Shaggy
Cobalah secara Online!
Penjelasan
sumber
f("2d")("1d")
, tetapi menggantinyad:1
dengand:2
memperbaikinya.Ruby ,
5246 bytePort langsung dari jawaban xnor.
Cobalah online!
EDIT: -6 byte dengan menyadari saya bisa menggunakan Proc
sumber
C # (Visual C # Compiler) ,
136135 byteCobalah online!
-1 Byte terima kasih kepada TheLethalCoder
Perluasan:
sumber
a=>b=>
.PadLeft
membutuhkanchar
dan menggunakan107
bukannya'k'
tidak ada bedanya.Perl,
4638 byteJalankan sebagai
perl -pae '...'
. Mengambil input dari stdin, dipisahkan spasi pada satu baris.Lakukan beberapa pergantian untuk membuat perbandingan "lebih mudah". Substitusi substitusi pada dasarnya sama dengan mengganti
p
dengan nol tambahan dank
dengan tanda negatif utama. Jadi10k
menjadi-10
(jadi urutannya terbalik) dan3p
menjadi30
(sehingga dip
atas segalanya). Maka itu hanya perbandingan angka sederhana.Berkat DomHastings untuk
$`
/$'
saran, yang mencukur 8 byte.sumber
/ /
dan menggunakan `` $ `` `dan$'
: Cobalah online!R ,
6562 byteCobalah online!
Ini datang sedikit lebih pendek dari jawaban R sebelumnya, dan memanfaatkan fungsi statistik R dengan baik :-)
-3 byte berkat Robin Ryder saran 's untuk menggunakan
ordered
bukanfactor
Mengambil input dari stdin (meskipun tautan TIO sedikit merestrukturisasi untuk kemudahan pengujian). Pemain jajaran masukan ke dalam sebuah memerintahkan
factor
semua jajaran, kemudian mengambil maks.Outputnya seperti:
sumber
factor
dan benar-benar ketinggalanordered
.Java 8,
128122121 byte-6 byte terima kasih kepada @SaraJ .
Cobalah online. (Lihat bagian bawah output di TIO-link untuk melihat nilai yang dipetakan.)
Penjelasan:
sumber
Haskell ,
757068 byteCobalah online!
-5 bytes
terima kasih kepada @Laikoni-2 bytes
berkat @ ASCII sajasumber
(read$init k)
bisaread(init k)
. Fungsi bantu lebih pendek daripada menggunakancase of
: Coba online!Python 2 , 61 byte
Menggunakan algoritma Arnauld.
Cobalah online!
Jawaban sebelumnya, 73 byte
Cobalah online!
sumber
Julia 0,6 ,
757165 byteCobalah online!
(-4 byte, parsing dalam 0,6 otomatis mendeteksi sebagai Int)
(-6 byte, gunakan
(search("_dp",s[2])-1)^3)
berdasarkan jawaban JS Arnauld, bukan((c=cmp(s[end],'k'))^2*6+4c-1)
)sumber
Retina 0.8.2 , 29 byte
Cobalah online! Menerima sejumlah peringkat dan menghasilkan yang tertinggi. Penjelasan:
Sortir garis ...
... menggunakan kunci yang ditentukan ...
... dalam urutan terbalik.
Kunci dibuat dari baris input sebagai berikut: a) huruf (profesional) dan pangkat b) pangkat di unary c) huruf kyu (di mana berlaku). Karena ini adalah jenis terbalik, peringkat profesional dan
p
mengurutkan sebelum peringkatd
dan peringkat kyū yang dimulai dengan1
karena huruf kyū dibiarkan di akhir. Di dalam peringkat tersebut, peringkat (profesional) dan mengurutkan dalam urutan menurun karena panjangnya string unary, namun jejakk
untuk peringkat kyū menyebabkan mereka mengurutkan dalam urutan naik.Pilih baris pertama, yang sekarang peringkat terbesar.
sumber
J, 39 byte
Cobalah online!
penjelasan
sumber
Python , 59 byte
Fungsi tanpa nama yang menerima iterable dari string yang mengembalikan yang maksimal oleh peringkat Go. Berfungsi seperti jawaban Jelly saya (hanya menggunakan seluruh string yang dievaluasi sebagai integer di basis 26 untuk menghemat byte).
Cobalah online!
sumber
C (gcc) , 95 byte
Cobalah online!
sumber
Perl 6 , 35 byte
Cobalah online!
Pendekatan yang agak berbeda untuk semua hal pencarian dan kubus ini. Pada dasarnya string pengganti:
...k -> -...
,p -> 0
,d
dihapus. Dengan demikian pemula mendapat skor minus, dans mendapatkan peringkat mereka dan pro mendapatkan peringkat * 10. Menggunakan What'sStar membuat kami dapat melakukan penutupan, danmax
mengambil fungsi pembanding.sumber
05AB1E , 12 byte
.V
(mengevaluasi sebagai kode 05AB1E) terinspirasi oleh pendekatan serupa @Arnauld dalam jawabannya Jelly .Masukan sebagai daftar dua (atau lebih) dari string yang valid.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
k
muncul daftar dan item, dan mendorong indeks item dalam daftar. Karena stack tidak mengandung daftar,"30k"
through"1k"
akan selalu menghasilkan-1
. Dikalikan dengan jumlah mereka, itu akan menjadi kisaran .d
memeriksa apakah suatu nomor adalah non-negatif (>= 0
). Karena ini adalah kebenaran untuk semua,"1d"
melalui"7d"
akan selalu menghasilkan1
. Dikalikan dengan jumlah mereka, itu akan menjadi kisaran .p
dan menggunakan°
akan menggunakan 10 pangkat jika adalah angka yang benar, jika tidak tetap sama. Jadi jika adalah atau , ia akan tetap atau setelah menggunakan , tetapi (karena kami telah menghapus ) dengan akan menjadi . Dikalikan dengan jumlah mereka, melalui akan daftar ."2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Lihat semua nilai yang dipetakan di sini.
sumber
Scala ,
3076154 byteTerima kasih banyak kepada Kevin Crujissen dan ASCII - hanya untuk pekerjaan mereka pada jawaban ini, yang membuatnya turun ~ 250b.
Beberapa optimasi algoritme untuk fungsi pemesanan jawaban 61b.
Uji kasus di sini: Coba online!
Jawaban lama 61 byte
Caranya adalah dengan menghitung jarak antara
rank letter
dani
(kode char105
). Kemudian kita menggunakan jarak ini sebagai skor ( dan = 5, kyu = 2, pro = 7) yang kita kalikan dengan jumlah peringkat. Kemudian kita mengambil maksimum pada input array menggunakan fungsi penilaian.Coba juga online!
sumber
var f: Function1[String, Function1[String, String]]=
. 247 byte .PHP ,
10098 byte(-2 byte dengan mengubah deklarasi fungsi)
Untuk menjalankannya:
Contoh:
Atau Coba online!
PHP (7.4), 74 byte
Cobalah online!
Bagaimana?
Mirip dengan pendekatan Arnauld , tetapi dalam PHP. Saya menggunakan fungsi untuk mengonversi setiap peringkat ke nilai numerik dan membandingkan serta menampilkan yang dengan nilai lebih tinggi.
Nilai peringkat berasal dari posisi karakter string kedua input
!!dp
, dikurangi satu dan kemudian ditenagai menjadi 3 dan dikalikan dengan bagian integer dari string input.Jadi misalnya, posisi karakter kedua
1p
yangp
di!!dp
adalah 3, berkurang satu dan bertenaga untuk 3 akan 8. Jadi bilangan bulat bagian dari semua*p
jajaran akan dikalikan dengan 8. cara ini1p = 8
,2p = 16
, ...,9p = 72
.Untuk semua
*d
peringkat, bagian integer akan dikalikan dengan 1 (atau tidak ada perkalian). Ini berarti1d = 1
, ...,7d = 7
.Dan untuk semua
*k
dan**k
peringkat, posisi karakter kedua di!!dp
akan sama denganfalse
yang sama dengan 0 (tidak eksplisit), dikurangi satu dan didukung oleh 3, berarti bagian integer akan dikalikan dengan -1. Ini berarti30k = -30
, ...,1k = -1
.Ini adalah usaha golf pertama saya, tidak yakin seberapa buruk itu!
sumber
Excel VBA, 129 byte
Fungsi jendela VBE Segera anonim yang mengambil input jangkauan
A1:A2
dan keluaran ke konsol.Penjelasan
sumber