Tantangan ini pada dasarnya identik dengan yang satu ini hanya dengan satu perbedaan: sekarang diperbolehkan untuk mengacak huruf di mana saja dalam string.
Skenario
John memiliki nomor penting, dan dia tidak ingin orang lain melihatnya.
Dia memutuskan untuk mengenkripsi nomor tersebut, menggunakan langkah-langkah berikut:
Nomornya selalu merupakan urutan yang tidak menurun (mis. "1123"
)
Dia mengubah setiap digit menjadi kata-kata bahasa Inggris. (mis. "123" -> "ONETWOTHREE"
)
Dan kemudian, atur ulang surat secara acak. (mis. "ONETWOTHREE" -> "EEWOOHRNTET"
)
John merasa bahwa nomornya aman untuk melakukannya. Bahkan, enkripsi seperti itu dapat dengan mudah didekripsi :(
Tugas
Dengan diberikan string terenkripsi, tugas Anda adalah mendekripsi dan mengembalikan nomor aslinya.
Aturan
- Ini adalah kode golf, jadi jawaban tersingkat dalam byte menang
- Anda dapat mengasumsikan bahwa string input selalu valid
- String input hanya berisi huruf besar
- Nomor aslinya selalu diatur dalam urutan menaik
- Anda dapat mengembalikan nomor dalam format string atau integer
Huruf-huruf hanya akan dikocok di antara satu kata, bukan di antara seluruh string.Huruf-huruf dapat dikocok di mana saja dalam string.- Jumlahnya hanya dari 1 hingga 9 inklusif (
ONE
hinggaNINE
)
Kemungkinan String yang Tidak Diuraikan
Berikut adalah daftar string tepat setelah mereka dikonversi ke string dari angka-angka:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Contohnya
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(terima kasih, ETHproductions!)
sumber
"ONEWESTV" -> 27
(termasuk angka yang tidak benar-benar muncul)Jawaban:
Python 2 , 123 byte
Program lengkap yang mengambil input dan mencetak nomor John.
Cobalah online! atau lihat test-suite
Bagaimana?
Mari kita bekerja dengan contoh "NEONSEXTOWNII" (untuk menghasilkan 1269, dan jadilah Leisure Suite Larry -esque!)
Pertama
c=map(input().count,"OWHUFXSGIQ")
mengambil input dan menghitung jumlah masing-masingOWHUFXSGIQ
- ini adalah huruf yang muncul di setiap nomor dalam urutan menaik, dengan 2,4,6, dan 8 memiliki huruf "sendiri" mereka (WUXG
), ditambah huruf tambahan,Q
untuk menambahkan nol ke akhir dan membuat panjang daftar yang dihasilkan genap. Sebagai contoh:Entri untuk 1, 3, 5, 7, dan 9 perlu disesuaikan untuk memperbaiki kelimpahan surat-surat lainnya. Ini dilakukan oleh loop berikutnya:
Perhatikan bahwa entri yang akan disesuaikan adalah entri alternatif (1,3,5,7,9,1,3,5, ...), jadi kita dapat menambahkan dua ke variabel indeks pada setiap langkah dan modulo dengan 10 agar tetap di rentang jika kita perlu melintasi lebih dari sekali (yang kita lakukan). Untuk menghemat beberapa byte, kita bisa menambah satu dan modulo dengan 5 dan menggunakan indeks ganda.
Karena penyesuaian untuk 9 membutuhkan kerja paling banyak kita mulai dari sana - itu berada di indeks 8 jadi kita mulai dari
i=4
. String"71735539994"
kemudian memberikan indeks,j
dari nilai-nilai untuk dihapus pada setiap tahap (di mana kami telah memastikan indeks kesembilan akan berisi nol dengan menggunakan"Q"
saat membuatc
);c[i*2]-=c[int(j)]
melakukan penyesuaian masing-masing individu dani=-~i%5
bergeraki
ke indeks berikutnya (di mana-~i
ada-(-1-i)
ataui+1
menyimpan tanda kurung(i+1)%5
) menjagai*2
dalam batasc
.Jadi, pertama-tama kita kurangi angka pada indeks
j=7
dari pada indeksi*2=8
, dengan mengurangi jumlah "G" yang dihitung dari jumlah "I", menyesuaikan angka "SEMBILAN" dengan jumlah (benar) "EIGHT" s ( yang juga memiliki "Aku"). Kami kemudian pindah kei=0
(-~4%5 = (4+1)%5 = 0
), merujuk indeksi*2 = 0
yang untuk "ONE" dan mengurangi nilai yang ditemukan pada indeksj=1
entri yang menghitung "W" dan karenanya "DUA", menyesuaikan jumlah "O" turun. Pada akhir loop kami memiliki jumlah yang diperbaiki:jadi yang tersisa hanyalah mencetak apa yang
c
sekarang mewakili (1269
).i
sekarang kembali0
, jadi kami menambahkannya di awal loop dan menggunakannya sebagai digit kami:Kutu belakang
`i`
,, adalah singkatan Python2repr(i)
yang mendapatkan representasi string dari objek (karakter digit yang dipertanyakan sebagai string) dan mengalikan string dengan angka menciptakan string baru dari banyak pengulangan (di sini kami hanya menunjukkann=0
berbalik`i`
dari mengatakan"5"
to""
dann=1
turn keep mengatakan"6"
as"6"
, tetapi juga berfungsi untuk bilangan bulat positif yang lebih besar, jadi"3"*4
menjadi"3333"
misalnya.)sumber
05AB1E , 31 byte
Cobalah online!
Penjelasan
Sangat tidak efisien untuk input besar.
sumber
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: bisa Anda jelaskan sedikit, saya berjuang untuk memahami bagaimana string apa pun dapat dihasilkan.‘
membatasi string kata-kata yang dipisahkan spasi huruf besar terkompresi.Z
berartiZ
. Semua pasangan 2 simbol lainnya menunjukkan kata yang dikompresi dari kamus 05AB1E . Jadi misalnya€µ
diterjemahkan sebagaiONE
.2419
. Simbol yang kita butuhkan adalah simbol yang diikuti oleh24
dan19
dalam dokumen . Dalam kasus kami ini24=Ÿ
dan19=™
, demikianHELLO
juga‘Ÿ™‘
Retina ,
11297 byteCobalah online!
-12 byte terima kasih kepada @Neil
-3 byte dengan menggunakan kelas karakter L dalam transposisi
Bagaimana itu bekerja
Pada dasarnya, ini bergantung pada kenyataan bahwa huruf hanya digunakan dalam nama-nama angka tertentu. Misalnya
SIX
adalah satu-satunya nama yang berisiX
. Ini semakin rumit dengan kenyataan bahwa beberapa kata tumpang tindih dalam huruf, seperti keduanyaFIVE
danSEVEN
menggunakanV
. Ini dapat diperbaiki dengan mengidentifikasiFIVE
denganF(.*)V
.sumber
GH
danNO
akan berdekatan, kecuali untuk yang sebelumnya8
atau1
dari substitusi sebelumnya ...}`GH
8
akan berhasil8
- itu}
akan menyebabkan karakter diurutkan lagi, sehingga menempatkan yang tersisaG
danH
bersama - sama.NO -> 1
, yang nyaman.Kotlin 1.1 ,
359352331327325 bytepengajuan
Tidak berfungsi di TryItOnline karena Kotlin 1.1 tidak didukung
Uji
Logika
Saya menggunakan lembar di atas untuk mencari cara paling sederhana untuk menyelesaikan setiap huruf
Suntingan
sumber
var s=""
danreturn s
ker=""
danreturn r
dengan menggunakan kembali String-input, yang tidak lagi Anda perlukan pada saat itu? Saya tidak pernah diprogram di Kotlin sebelumnya, jadi bisa jadi saya berbicara omong kosong di sini. ; pfinal
default. Hmm, satu hal lagi yang bisa Anda mainkan golf: Tempatkanvar s=""
sebagai hal pertama dalam metode, dan gantikanval f=r.split("").
denganval f=r.split(s).
. Sekali lagi, tidak tahu apakah itu berhasil. Sayang sekali TIO belum mendukung v1.1, kalau tidak saya akan mencoba saran ini sendiri sebelum saya membuat diri saya terdengar bodoh ..Jelly , 37 byte
Cobalah online!
-1 terima kasih kepada Jonathan Allan .
sumber
NINEFIVE
,THREEFIVE
). Apakah ini bug, atau kodenya tidak efisien?Œ!
berarti "permutasi")...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 bytePenjelasan Kode:
-14 Terima kasih kepada Olivier Grégoire
sumber
Java 8,
346345344336327 byteCoba di sini.
Penjelasan umum:
Saya telah melihat kemunculan setiap karakter dalam alfabet:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(dengan mengurangiF=5
).O=1; N=9
.N
memiliki dua kejadianNINE
, saya harus melakukan tambahan-1
untuk setiap kejadianN
, jadi saya menggunakanI=9
sebagai gantinya (dengan mengurangi tiga pertandingan sebelumnya, bukan dua).Penjelasan Kode:
sumber
Perl 5 , 100 byte
Kode 99 byte + 1 byte untuk
-n
sakelar.Cobalah online!
sumber
Python 3 , 225 byte
Cobalah online!
Langsung: hapus digit yang diidentifikasi dengan huruf tertentu terlebih dahulu.
sumber
Python 3 , 125 byte
Cobalah online!
Setelah membaca tantangan terkait saya menyadari ini adalah variasi pada solusi Python mdahmoune , yang itu sendiri didasarkan pada solusi ES6 Draco18s , tapi hei, setidaknya kita dua byte.
Seperti solusi itu, kami menghitung jawabannya melalui kombinasi linear dari jumlah kemunculan huruf-huruf tertentu. Kami menyandikan kombinasi linear secara singkat dengan menuliskannya sebagai kata-kata di mana dua huruf pertama akan ditambahkan dan semuanya sesudahnya harus dikurangi. Terkadang diperlukan karakter untuk mengisi dua karakter pertama; kami menggunakan ini untuk menyembunyikan angka yang ingin kami hasilkan (yang tidak akan pernah terjadi di input, jadi tidak akan memengaruhi algoritme kami), yang kami ekstrak
min
.sumber
R, 154
Cobalah online!
sumber
Aksioma, 351 byte
ungolfed memberikan komentar
sumber