Pedoman
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" -> "ENOWTOHEETR"
)
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 antara satu kata, bukan antara seluruh 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
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
sumber
Jawaban:
Jelly ,
3837 byteTautan monadik yang mengambil daftar karakter (string) dan mengembalikan integer.
Cobalah online!
Penggunaan sebuah sangat berbeda metode untuk Pietu1998 Jelly jawaban ,
namun memiliki jumlah byte yang sama(saya benar-benar berpikir itu mungkinitu berakhir kurang)!Tidak mengandalkan monotonitas dari nomor asli (jadi input
HTREEWTONOE
akan berfungsi misalnya).Bagaimana?
Pertama-tama perhatikan bahwa kata-kata itu sendiri (dan oleh karena itu setiap anagram daripadanya) semuanya dapat diubah menjadi yang panjang 4 dengan menghapus Rs, Gs dan Ss dan mengganti setiap Os dengan dua karakter (katakan "12") dan setiap Xs dengan tiga karakter ( katakan "345").
Kami kemudian dapat memetakan produk dari ordinals karakter-karakter tersebut ke angka 1 hingga 9 menggunakan modulo aritmatika, tergantung pada pilihan kami ("12345"), kemudian mencari ini dalam daftar digit yang disusun ulang. Kode sebenarnya dilemparkan ke karakter pertama dan kemudian menggantikan ordinals, tetapi juga dimungkinkan dalam 37 byte dengan karakter, misalnya "DIAAE" ( coba ).
sumber
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 byte-4 bytes: Lagipula golf itu saya lupa sebariskan variabel sekali pakai. Kentut otak.
-2 byte: Indentasi spasi ganda → indentasi tab tunggal (terima kasih kepada Coty Johnathan Saxman); perhatikan bahwa ini tidak ditampilkan dengan benar dalam jawaban.
Tidak disatukan (kompatibel dengan python 3):
Pencari angka ajaib:
Penjelasan:
Saya punya perasaan bahwa saya bisa menghancurkan bit ASCII bersama-sama dan merangkumnya entah bagaimana untuk menentukan kapan saya memiliki kata penuh. Awalnya saya mencoba mengotak-atik
3**ord(letter)
dan membandingkan dengan hasil yang diharapkan, tetapi menghasilkan beberapa angka yang sangat besar. Saya pikir itu akan tepat untuk memaksa beberapa parameter sedikit, yaitu modulus (untuk memastikan jumlahnya kecil) dan pengganda untuk menyebarkan angka secara berbeda di sekitar kisaran modulus.Saya akhirnya mengubah variabel pengali menjadi variabel yang mempengaruhi daya itu sendiri karena (dari coba-coba) yang entah bagaimana berhasil memberi saya jawaban golf yang sedikit lebih pendek.
Dan di atas Anda melihat hasil dari kekerasan itu dan sedikit bermain golf secara manual.
Alasan memilih
3**x
awalnya adalah karena saya tahu Anda bisa mewakili setiap nomor di sana. Digit yang paling sering diulangi oleh angka apa pun adalah dua (thrEE, sEvEn, NiNe, dll), jadi saya memutuskan untuk menganggap setiap input sebagai nomor basis-3. Dengan cara itu saya dapat (secara mental) merepresentasikan mereka sebagai sesuatu seperti10100000000010020000
(tiga; a 1 dit
slot, 1 dir
slot, 1 dih
slot, dan 2 die
slot). Setiap angka dengan cara ini mendapatkan representasi unik yang dapat dengan mudah disatukan dengan iterasi string dan menjumlahkan beberapa angka, dan akhirnya independen dari urutan huruf yang sebenarnya. Tentu saja, ini tidak menjadi solusi yang ideal, tetapi solusi saat ini masih ditulis dengan pemikiran ini.sumber
\x83
,\x8e
dan\x92
dalam string.SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
. Ini berfungsi jika saya menaruhcoding
komentar di sana, tetapi itu mendapatkan 15 byte tambahan.Python 2 ,
131127 byteCobalah online!
Berdasarkan versi yang diperbaiki dari solusi JavaScript Draco18s .
sumber
vars
!PHP , 164 byte
Cobalah online!
PHP , 179 byte
berdasarkan pendekatan sebelumnya periksa terlebih dahulu angka genap dan kemudian angka ganjil dalam urutan meningkat
Cobalah online!
PHP , 201 byte
Cobalah online!
sumber
ENOOWTWTOWOT
$i++<9
dan$i
bukannya$i<10
dan++$i
(-1 byte);_405162738[$i]
bukannya$i%2?$i/2+4:$i/2-1
(-4 byte) ($i/2+~($i%2*-5)
akan bekerja juga, tapi itu satu byte lebih lama.)Javascript (ES6),
288150144 byteLebih lama dari
duaentri JS lainnya, tapi saya pikir saya akan menjatuhkan pendekatan yang menarik yang mungkin bekerja untuk seseorang dalam bahasa lain.Pada dasarnya kita dapat menentukan hal berikut:
Kemunculan huruf-huruf ini menyiratkan bahwa digit itu ada di nomor aslinya. Dari sini kita dapat menyimpulkan sisa digit:
Termasuk dua kasus rumit:
Baik
1
dan9
daerah Sulit relatif. Untuk SATU,E
muncul lebih dari sekali dalam beberapa kata (SEVEN
memiliki dua) seperti halnyaN
(NINE
), jadi kami terjebak dengan pemeriksaanO
yang terjadi di dua tempat lain, untungnya keduanya sederhana.Bagi SEMBILAN, sembilan sulit tidak masalah bagaimana Anda mengirisnya.
Jadi kita berakhir dengan peta ini:
9 dapat melakukan back-reference siX, eiGht, dan Five (dengan 5 back-referencing untuk) dengan penugasan variabel, menghemat byte. Berkat Neil untuk ini, ia menggunakan beberapa fitur JS Saya sangat tidak terbiasa dengan (tanda centang untuk pengupasan menjadi
('
dua, misalnya) dan benar-benar datang lebih dekat dengan ide saya mencoret-coret di atas kertas sebelum mencoba untuk kode itu (Saya meninggalkan 9 sebagai "apa yang tersisa", memikirkannya sebagai "jika saya melihatX
saya dapat menghapusnya danS
dan danI
dari string, maka ..." sehingga setelah empat kasus sederhana 3 berikutnya akan menjadi sederhana).Alasan entri ini menarik adalah karena dapat menangani string yang dikocok sebagai input. yaitu, alih-alih kata-kata individual yang dikocok, kita dapat mengocok seluruh string, yang menurut saya awalnya dilakukan John:
sumber
s.split(t).length-1
, 2 byte menggunakans.repeat(n>0&&n)
(mengapa n masih kurang dari nol? Menyimpan 7 byte). Simpan banyak byte dengan mendeklarasikang
dalam ruang lingkups
sehingga Anda tidak harus terus melewatinya, dan lebih baik lagi Anda bisa menjadikannya sebagai tagged template, yang menyimpan total 55 byte (sebelum 9 koreksi). Simpan lebih byte dengan menyimpan nilai-nilai diulang dalam temporaries, dan saya mencukur beberapa off menggunakanmap
:s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
.Mathematica, 133 byte
memasukkan
keluaran
sumber
c@#[[i]]
bukanc[#[[i]]]
? Anda mungkin dapat menyimpan byte lain dengan menggunakan sintaks infix~
padaTable
.C #, 218 byte
Versi pendek:
Versi yang diperluas:
Coba ONLINE!
Menjadi entri pertama saya, saya tidak yakin tentang aturan ... Saya hanya menghitung ukuran kelas yang digunakan untuk de-crypt, bukan kode yang mengujinya, kan?
Edit
Dan untuk bersenang-senang - inilah yang saya mulai lakukan, tidak membaca aturan lengkap: S - Lihat di IdeOne . Itu de-crypts bahkan ketika karakter dari satu digit dapat diacak ke setiap tempat di string.
Edit 2
Disingkat menurut tips oleh TheLethalCoder. Terima kasih!
Edit 3
Dan sekarang Titus mencukur beberapa byte lagi. Terima kasih!
sumber
public static
. Anda dapat mengonversi ke metode anonim sepertis=>{<do stuff>return"";}
. Anda dapat menggunakanvar
beberapa kali, mendeklarasikan variabel secara bersamaan menghemat byteint i=1,j;
. Membuat array dari string dan membelahnya biasanya lebih pendek (meskipun saya belum memeriksa dalam kasus ini) yaitu"ONE|TWO".Split('|')
. Anda dapat menggunakan<0
sebagai gantinya==-1
s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
JavaScript (ES6),
142139 BytesDisimpan 3 Bytes berkat Neil .
Saat ini tidak memanfaatkan angka yang selalu diatur dalam urutan menaik
sumber
"axbxc".split`x`.join``
. Bagaimana ini disebut? Tampaknya tidak dapat menemukan apa pun di google.split
danjoin
x=`foo${5+5}bar`
), mereka ditandai ketika Anda memanggil fungsi menggunakan mereka tanpa parens:foo`foo${5+5}bar`
yang sama denganfoo(['foo','bar'], 10)
f(s.slice(y))
selalu merupakan string sehingga Anda tidak perlu''+
sebelumnya.Jelly , 38 byte
Cobalah online!
Penjelasan
sumber
"EIGHTNINE"
3
dengan2.2
menggunakan batas atas yang lebih kecil, yang memungkinkan Anda untuk menghitung 789 dengan mudah tanpa mengubah prinsip kerja.2
akan menyenangkan, tetapi hampir tidak akan gagal untuk input tertentu dengan banyak enam.Javascript (ES6), 221 byte
Cuplikan kode contoh:
sumber
Retina , 160 byte
Cobalah online! Secara longgar didasarkan pada jawaban PowerShell @ TessellatingHeckler.
sumber
Retina , 88 byte
Cobalah online!
Penjelasan
sumber
PowerShell , 182 byte
Cobalah online!
Kode tidak dikerjakan tetapi tidak berfungsi:
misalnya
(?<3>[THRE]{5})
cocok dengan kelas karakterTHRE
, sehingga dapat cocok dengan mereka di luar urutan, dan harus mencocokkan salah satu dari karakter ini lima kali bersebelahan, dan grup tangkap bernama '3' untuk memetakan nama dengan angka.Kompresi yang belum sempurna dengan menukar teks berulang
})|(?<
untuk az
.sumber
C ++,
296, 288 byteVersi pendek:
Versi lengkap:
Coba ONLINE!
Sunting:
1) 200-> 296 byte, untuk memasukkan namespace dan definisi N dalam hitungan, seperti yang disarankan oleh orlp 2) 296-> 288, untuk menggunakan makro, terima kasih kepada Zacharý
sumber
N
danusing namespace std;
ke dalam jumlah byte Anda.Q
tepat setelah itu tanpa tambahan lainnya.Ruby,
138114110 byteHitungan byte mencakup 1 byte untuk
-p
opsi.Apa?
Ini:
adalah regex literal yang, melalui interpolasi string, mengevaluasi untuk:
Jika kita menetapkan itu untuk
regex
, sisa kode agak mudah untuk dipahami: Setiap kecocokan dalam input diganti dengan jumlah kelompok penangkap, diekstraksi dari variabel magis$~
yang berisi data pencocokan saat ini:Cobalah online!
sumber
Java 8,
198256 byte+58 byte .. karena regex dari versi sebelumnya tidak berfungsi dengan baik (itu juga cocok dengan "EEE"; "EEN"; dll.)
Penjelasan:
Coba di sini.
sumber
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
adalah bahwa ia juga cocokEEN
pada akhir test case dengan bagian EIGHT dan SEMBILAN .. Dan saya ragu ada sebuah regex untuk mencocokkan semua ini:ENO|EON|NEO|NOE|OEN|ONE
tanpa juga cocokEEE;EEN;EEO;...
untuk semua angka yang lebih pendek dari 40 byte .. Mungkin saya bisa melakukan sesuatu menggunakansubstring
dan membalikkan memeriksa angka, tapi saya tidak benar-benar punya waktu untuk mencari tahu sekarang ..Java (OpenJDK 8) , 181 byte
Cobalah online!
Saya mengambil kebebasan untuk menggunakan kembali template TIO Kevin Cruyssen . Semoga Anda tidak keberatan;)
sumber
s.substring
. Bagian terburuknya adalah, saya menggunakans.substring
jawaban saya saat ini, lol .. Ah well, +1 dari saya. Senang sudah hampir akhir pekan ..05AB1E ,
3631 byteCobalah online!
Lihat itu dijalankan dengan debug: TIO Dengan Debug
sumber
FURONESEV
pengembalianFUR1SEV
:(Perl 5 , 102 + 1 (-n) = 103 byte
Cobalah online!
sumber
map{...}
sering dapat diganti denganmap...,
,length
dany///c
biasanya dipertukarkan juga (tidak selalu lebih kecil bila tidak bekerja pada$_
meskipun!), Bukanwhile
,++$,x s/^$i//
lebih pendek, dan jika Anda mengubah-n
ke-p
Anda dapat menambahkan ke `$ \` bukan meneleponprint
! Cobalah online!Python 3 ,
238236 byteCobalah online!
Solusi brute-force, tidak memanfaatkan non-penurunan angka.
Terima kasih untuk @Mr. Xcoder untuk menghemat 2 byte!
sumber
def f(s):
dalam jumlah byte Anda, ini bukan fungsi anonymouoswhile len(s)>0
denganwhile len(s)
e
ke dalam header fungsi untuk -1 byte. Juga,exec
dan daftar pemahaman mungkin menghemat byte pada indentasi.PHP, 141 byte
versi yang lebih lama, 151 byte :
loop melalui digit dari 1 hingga 9, menghitung karakter unik dalam kata dan mengurangi jumlah karakter non-unik, mencetak digit saat bepergian.
Meskipun sedang mencetak saat bepergian, jumlah digit harus disimpan agar
9
kasing berfungsi.Jalankan sebagai pipa dengan
-nR
atau coba online .Ini akan menghemat 4 byte lagi untuk menyimpan jumlah digit
$a[$i]
sebagai ganti$a[$i+48]
dan menggunakan ASCII1
dan7
(dalam tanda kutip) alih-alih karakter digit itu sendiri.kerusakan
ONE
bukan satu-satunya kata denganO
, jadi ia harus mengurangi jumlah untukW
(hanya muncul diTWO
) danU
(hanya muncul diFOUR
) dan sebagainya.NINE
khusus, karena tidak ada cara untuk mengurangi jika saya menggunakan huruf (yang akan membutuhkanI-X-G-F+U
atauN-O-S+W+U+X
), jadi saya menggunakan jumlah digit sebagai gantinya.PHP, 160 byte
mengasumsikan semua input huruf besar; karakter dapat diacak di seluruh.
Jalankan sebagai pipa dengan
-nR
atau coba online .penjelasan
loop melalui kata-kata digit, menghitung kemunculan karakter unik mereka dalam input dan dalam proses mengurangi jumlah karakter lain. "Karakter lain" dapat berarti semua karakter lain dalam kata; tetapi hanya dengan mempertimbangkan yang akan dibutuhkan kemudian disimpan 19 byte.
Mengubah
str_repeat
loop ke loop gabungan disimpan 5 byte.Dan menggunakan variabel variabel untuk jumlah digit disimpan 8 lainnya.
kerusakan
sumber