Anda tahu bagaimana Anda mendapatkan pesan suara dan koneksi orang itu tidak bagus, dan Anda mencoba mencari cara untuk memanggil mereka kembali, tetapi Anda tidak yakin apakah itu "5" atau "8" yang mereka kata?
Itulah tantangan ini.
Berita baiknya adalah bahwa penelepon membacakan nomor mereka dua kali, tetapi rusak di kedua tempat.
Program Anda harus mengambil input seperti ini:
5551231234 / 5551231234
Di mana sepuluh digit pertama adalah pertama kalinya nomor telepon dikatakan dalam pesan suara dan set kedua adalah yang kedua kali dikatakan. Hanya ... itu akan terlihat lebih seperti ini:
555?ABC1_36? / 55?522_1?234
- Angka yang diikuti oleh tanda tanya berarti bahwa itu adalah tebakan terbaik untuk digit itu (mis. "5?" Berarti "mungkin angka 5, bandingkan dengan yang diulang").
- Garis bawah menunjukkan angka yang hilang yang diketahui, sesuatu yang terlalu kabur oleh statis untuk diuraikan sama sekali.
- Surat hanya itu: surat. Perlakukan mereka sebagai digit masing-masing
- ABC -> 2, DEF -> 3, GHI -> 4, JKL -> 5, MNO -> 6, PQRS -> 7, TUV -> 8, WXYZ -> 9
- Semua input sampel menggunakan huruf besar (Anda dapat dengan aman menghilangkan panggilan ToUpper ())
- Jika bahasa Anda berfungsi lebih baik dalam huruf kecil, Anda dapat dengan bebas menggunakan huruf kecil untuk input dan menghilangkan panggilan ToLower (). Catat itu dalam jawaban Anda.
Anda juga dapat menerima panggilan penilaian berikut:
5? / _ -> 5 //5 is the best guess we have, use it
5? / 5? -> 5 //uncertain, but matching
5? / 4? -> ? //conflict
5 / 4 -> ? //conflict
5? / 4 -> 4 //solid information overrides possible value
5 / 4? -> 5 //solid information overrides possible value
_ / _ -> ? //no information available
Selain itu Anda dapat mengasumsikan bahwa semua input akan berisi nomor telepon sepuluh digit, tidak termasuk tanda tanya. Input yang bukan sepuluh digit (mis. 1234567 / 1234567
) Dapat diperlakukan sebagai tidak dapat diselesaikan (output falsey) atau menimbulkan kesalahan.
Memasukkan
Satu baris karakter 0-9A-Z _?/
, seperti dijelaskan di atas.
Keluaran
Jika dapat diuraikan menjadi satu nomor telepon sepuluh digit yang valid, keluarkan nomor telepon itu. Kalau tidak, output beberapa bentuk indikasi kesalahan (misalnya -1, false, atau baris kosong).
Kemenangan terpendek, seperti biasa.
Input sampel:
1234567890 / 1234567890
1234567890? / 1234567890
123456789_ / 1234567890
1234567890? / 123456789_
1234567890 / 1234567890?
1234567890 / 123456789_
123456789_ / 1234567890?
1234567890? / 1234567890?
1234567890? / 1234567891?
123456789_ / 123456789_
555CALLUS1 / 5552255871
404_12?6039 / 4041?1560_9
_GETREVENGE / 16?36?_2838_
1?691460_50 / 16_14609?50
61?08977211 / 612?897725?1
40?0INSTA__ / 8?00_NSTI?LL
3985_534?10 / 39?8?5053_10
7__7294?737 / 7797299?_37
28?897_384?1 / _8?89763861
271168090_ / 27116800?09
6802?148343 / 67?01148343
94_11628?2?6? / 9491162_47?
17?4285_689 / 1__26?52689
6_311?95_38 / 6731194?7?38
380?7DRAGON / 3807378?5?66
4?647_93236 / 5646?6?9__36
365?268898_ / 366267?7?984
GRATEDBATE / IRATEDBATE
5307_079?93 / ____8_____
535_3_0255 / 52?5_3_024?5
55_____088 / 54?2397207?7?
6_48398_95 / _946?398?6_5?
_0_312_3_1 / 81?53123?1?71
____1_____ / 64?255?508?61
8427820607 / 6?424?8?__6?07
50_3707__6 / 52?8375?74?56
615___8255 / 62?526?983?2?1?
__652618__ / 8365261__0
149___933_ / 1_9677?92?31
___7?281562 / 3438?28154?2
5?7?7?___8?3?7?4 / 57_855837_
605_272481 / 605427__81
86?569__731 / 88560?0?7721
1__91654?15 / 17?9?9165715
800NWABODE / 80069ABI?DE
8___9017_0 / 8_2494?12?9_
_024?5?91?470 / 304?17908?7_
42510704_2 / 4_51070492
9338737_89 / 93_873PLUS
327762_401 / 327_MASH01
33093_2058 / 3309_12058
4061_33578 / 40619_3578
559_383197 / 559938_197
94_9746084 / 9459746_84
1_37655238 / 163POLKA_T
_672FRIZZY / 767237499_
8_76318872 / TIP63188_2
51_8404321 / 5178404_21
358_030314 / 358603_314
2597_85802 / 25979_5802
77141_1408 / 7714_91408
330858_457 / 330_586457
4686079_39 / 46_6079239
86457508_6 / 8_45750826
523226626_ / _23BANNANA
_ISSY_ISSY / 44__9548?79?
6?00B_YJILT / 800289KILL?
2?52803___0 / 1526?0390?61?
FI?ND___T?HE / EAS?T?EREGGS?
0_231?95_38 / 0723194?7?38
0?647_39236 / 0646?6?3__36
025?267798_ / 06?6265?9?984
0061_33578 / _0619_3578
Saya hanya mengasuransikan bahwa setiap kemungkinan edge-case tertutup (11 entri pertama), tetapi selain itu, ini cukup acak.
Memperbarui
Empat entri di bagian bawah ditambahkan dengan angka nol di depan (atas saran Jonathan Allan).
Output yang benar untuk input sampel:
Berdasarkan output dari entri Jonathan Allan (output yang diformat adalah ideal).
" / "
, atau dapatkah kita menganggapnya sebagai dua input standar?Jawaban:
Jelly , 84 byte
+4 byte - Saya pikir ini mungkin harus berperilaku sama dalam semua kasus, jadi saya telah mengubah bilangan bulat pencarian keypad kembali ke digit-karakter menggunakan
+49Ọ
.Fungsi yang mengambil string dalam format yang ditentukan dan mengembalikan nomor telepon sebagai daftar karakter atau nol jika tidak valid. Sebagai sebuah program, ini dicetak seolah-olah itu sebuah string.
Cara kerjanya, mereka dapat mengulangi angka lebih banyak kali
(misalnya
"123456789_ / 123456789_ / 1234567890"
)... atau bahkan hanya mengatakannya sekali, dan logika yang didefinisikan akan berlaku.
Cobalah online! , atau lihat semua input sampel .
Bagaimana?
sumber
55_____088 / 54?2397207?7?
harus diselesaikan5523972088
: semua digit yang hilang ada dan angka yang tidak pasti di sebelah kanan tersedia di sebelah kiri. Semua kasus sederhana berjalan.Python 2 ,
314307274 byteCobalah online!
sumber
Python 3,
549530509453449410406394393391 byteSaya yakin ini bisa diperbaiki, tapi ini awal:
Saya menggunakan
str.translate
untuk surat-surat, dan fungsi pembungkusg
untuk membuat input dalam format yang saya inginkan. Fungsi sebenarnyaf
adalah rekursif, dan akan gagal untuk input yang ambigu. Saya masih memiliki banyak repitisi di sana, jadi saya yakin ada banyak ruang untuk perbaikan.Perbaikan:
str.isnumeric
dalam argumen kata kunciT==q!=O
)not(e or z)
menjadie+z in(e,z)
.(E,Z)
sumber
map(chr,range(65,91))
sekalipun.JavaScript (ES6),
180190188 byteEdit:
+10+9 byte untuk mematuhi aturan output falsyMengambil dua string input dalam sintaks currying
(a)(b)
. Mengembalikan salah satufalse
atau string yang mewakili nomor telepon yang ditebak.Bagaimana itu bekerja
Langkah # 1 - Mengurai string input
Kami pertama-tama mendefinisikan
F()
fungsi yang menerjemahkan string ke dalam array bilangan bulat dengan menerapkan aturan berikut:Yang bisa diartikan sebaliknya sebagai berikut:
Kami berlaku
F()
untuk keduanyaa
danb
. Ini memberi kita sepasang bilangan bulat (x, y) untuk setiap digit dalam nomor telepon, sesuai dengan dua interpretasi yang mungkin.Langkah # 2 - Menebak angka
Untuk setiap pasangan (x, y) , kami menghitung:
Jika x == 0 , itu berarti bahwa kedua input adalah karakter garis bawah. Jadi, digitnya tidak diketahui dalam hal ini.
Jika x! = 0 , kami dapat menyimpulkan digit dengan aman jika salah satu dari kondisi berikut ini benar:
Dua kondisi terakhir dapat digabungkan
!(d % x)
. Maka rumus terakhir:Jika benar, kami mengonversi x kembali ke angka tebakan dengan menghitung (x - 1) DAN 15 .
Uji kasus
(Hanya 50 yang pertama karena cuplikan konsol tidak dapat mendukung lebih banyak riwayat keluaran.)
Tampilkan cuplikan kode
sumber
1234567890? / 1234567890?
harus memutuskan untuk1234567890
. Saat ini output kode Anda123456789?
yang bahkan kurang informatif daripada input.Assume: 5? / 5? -> 5 //uncertain, but matching
Perl 5 , 211 byte
... tanpa lekukan dan \ n baris baru
Cobalah online!
sumber
83652618?0
) daripada semacam nilai kesalahan atau kesalahan.?
untuk menunjukkan bahwa tidak ada cara untuk menyelesaikan informasi yang hilang, yang kemudian akan jatuh ke bagian Keluaran:...Otherwise output some form of error indication (e.g. -1, false, or an empty line).
Retina,
150140136 byteDisimpan beberapa byte berkat Kritixi Lithos
Cobalah secara Online!
Penjelasan:
Baris pertama mengubah semua
?
input menjadi#
dan semua huruf menjadi setara numerik mereka. Kami kemudian menghapus spasi dan/
dari input. Dua baris berikutnya menangani kasus "tebak vs. kepastian" (mis.5? \ 4
Akan diganti oleh4 \ 4
). Setelah menghapus semua#
s, baris 8 dan 9 berurusan dengan_
case "number vs. " (_ \ 3
menjadi3 \ 3
). Kemudian, jika kedua bagian dari senar cocok, kami menyimpan 10 digit pertama. Jika tidak, nomor telepon tidak valid sehingga kami menghapus semuanya.Solusi 160 byte alternatif yang berfungsi untuk nomor telepon yang panjangnya sewenang-wenang (dan ukurannya sama): TIO
sumber
(/|_)
to[/_]
untuk menghemat 1 byte. Juga saya pikir Anda bisa menggunakan;
bukanx
sehingga[^x]
bisa menjadi\w
PHP,
251236 bytemengambil input dari baris perintah; jalankan dengan
-nr
atau coba online .kerusakan
bermain golf
preg_replace
pertama: -8 bytejoin
: -2$$k
bukannya$t[$k]
: -5sumber
PHP, 200 + 8 byte
terinspirasi oleh solusi Arnaulds .
mengambil input dari argumen baris perintah; jalankan dengan
-nr
atau coba online .modifikasi untuk memenuhi batasan keluaran kesalahan: (cetak
X
untuk nomor yang tidak lengkap):|48
(-3 byte)echo chr(...);
dengan$r.=...;echo$r>1e10?X:$r;
(+11 bytes)kerusakan
bermain golf
preg_replace_callback
(-10 byte)join
pembatas yang dihapus (-7)$x
tugas sampai akhir (-2)sumber
Perl 5
-pl
, 173 byteCobalah online!
sumber