Motivasi
Dalam tantangan ini, tugas Anda adalah mengalikan dua string, ini secara alami memperkenalkan cara untuk mengambil akar kuadrat dari string.
Bagaimana cara kerjanya?
Diberikan string (misalnya pub
) hal pertama yang perlu Anda lakukan, adalah menentukan kode ASCII untuk setiap karakter:
"pub" -> [112, 117, 98]
Selanjutnya Anda memetakan kode-kode ini ke kisaran [0..94]
dengan mengurangi 32
setiap nilai:
[112, 117, 98] -> [80, 85, 66]
Sekarang Anda perlu menemukan untuk setiap nilai modulo root-nya 95
(mis. 40*40 % 95 = 80
, Anda juga bisa memilih 55
):
[80, 85, 66] -> [40, 35, 16]
Dan akhirnya Anda akan memetakannya kembali ke rentang [32..126]
dan mengubahnya kembali menjadi string:
[40, 35, 16] -> [72, 67, 48] -> "HC0"
Memang "HC0" ⊗ "HC0" = "pub"
Anda bisa memverifikasi dengan solusi dari tantangan lain di sini .
Yang akrab dengan aritmatika modular mungkin memperhatikan bahwa modulo root kuadrat 95
tidak selalu ada, misalnya tidak ada root untuk 2
. Dalam kasus seperti itu, akar kuadrat dari suatu string tidak didefinisikan dan program / fungsi Anda mungkin crash, loop tanpa batas dll.
Untuk kenyamanan Anda, inilah daftar karakter yang memiliki akar kuadrat (yang pertama adalah spasi):
!$%&)+03489:>CDGLMQVW]`bjlpqu
Aturan
- Anda akan menulis sebuah program / fungsi yang mengambil string (atau daftar karakter) sebagai argumen dan mengembalikan setiap akar kuadrat jika ada
- Anda dapat berasumsi bahwa input selalu memiliki akar kuadrat
- Input dapat terdiri dari string kosong
- Input akan berada dalam kisaran yang dapat dicetak (
[32..126]
) - Outputnya dicetak ke konsol atau Anda mengembalikan string jika akar kuadrat ada
- Jika akar kuadrat tidak ada, perilaku program / fungsi Anda dibiarkan tidak terdefinisi
- Jika Anda memilih untuk mencetak root ke konsol, baris baru atau spasi putih tidak apa-apa
Uji kasus
Perhatikan bahwa ini bukan satu-satunya solusi:
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
0-94
(itu kisaran yang dapat dicetak), itu salah ketik - maaf tentang itu.Jawaban:
sh + coreutils, 58 byte
Cobalah online!
Akar kuadrat modular biasanya tidak unik; kami memiliki 2 atau 4 pilihan untuk setiap karakter kecuali
. Kita tidak perlu untuk menerjemahkan
,
!
,4
,l
karena masing-masing sudah merupakan akar kuadrat dari dirinya sendiri. Untuk karakter yang tersisa, kami memilih gambar yang tidak perlu melarikan diri untuk shell atautr
.sumber
Python 3,
5756 bytetranslate
menggunakan pemetaan dari "ordinal Unicode ke ordinal Unicode". Jadi, kita tidak perluchr
/ord
konversi. Catatan: tidak mogok saat char tidak memiliki root.Disimpan 1 byte berkat @ jonathan-allan
Nilai pemetaan adalah root terbesar di kisaran 0..94 dari kunci. Untuk mendapatkan root paling sedikit (seperti pada contoh), gunakan:
(61 byte)
sumber
32
danfor
.Python 2 , 80 byte
Cobalah online!
Melempar IndexError jika tidak ada root.
sumber
Japt ,
1615 byteCobalah online!
Menyimpan byte dengan melihat jawaban 05AB1E (menggunakan
L
= 100 alih-alih95
). Sekarang Japt adalah yang terpendek, kejadian yang cukup langka :-DPenjelasan
sumber
Mathematica, 94 byte
Cobalah online!
sumber
Jelly ,
181716 byteCobalah online! (dilengkapi dengan footer test-suite)
Disimpan 2 byte dengan melakukan penulisan ulang lengkap.
Juga pertama kali saya menemukan digunakan untuk}
.Penjelasan
Kode pertama menghitung semua karakter persegi, dan kemudian memetakannya ke akar kuadrat masing-masing.
sumber
95Ḷ²%95+32iЀO+31Ọ
pada dasarnya apa jawaban Japt saya lakukan, meskipun solusi Anda dua byte lebih pendek ...JavaScript, 82 byte
Berkolaborasi dengan @ETHproductions
Input dan output dalam bentuk array char.
Cuplikan tes
Tampilkan cuplikan kode
sumber
05AB1E , 17 byte
Algoritma ini sangat mirip dengan jawaban Jelly dan Japt (Punya sesuatu yang lain sebelumnya tapi itu hanya membuat saya sampai 19 byte)
Penjelasan
Cobalah online!
sumber
Mathematica, 60 byte
Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output. Kesalahan pada input yang tidak valid.
sumber
Perl 6 , 53 byte
Cobalah online!
sumber
Mathematica 82 Bytes
Menggunakan kemampuan Solve untuk melakukan aritmatika modular.
sumber