Ini terinspirasi oleh bagian dari kompetisi Tim ARML 2016 Problem # 6.
Inilah tantangannya:
Anda diberi "urutan wildcard", yang merupakan urutan digit dan karakter lain. Sebuah string cocok dengan urutan wildcard ini dengan pseudocode berikut:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Dimana '? adalah karakter pilihan Anda.
Dalam hal regex, bayangkan saja '?'
itu '.'
.
Tantangannya adalah untuk menemukan semua angka kuadrat (persyaratannya hingga 1 juta) yang representasi desimalnya cocok dengan urutan wildcard ini. "Karakter wildcard" dapat berupa karakter ASCII pilihan Anda, asalkan bukan digit, jelas.
Misalnya, 4096
cocok 4**6
dan 4*9*
tetapi 4114
tidak cocok.
Memasukkan
Input akan diberikan sebagai urutan yang cocok dengan regex [0-9?]+
. Ini bisa berupa string, array karakter, atau array byte karakter di ASCII.
Keluaran
Output akan berupa daftar / set / array angka apa pun yang Anda inginkan, yang merupakan kuadrat sempurna dan cocok dengan urutan wildcard.
Contoh input yang valid:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Contoh output yang valid:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
dll.
Spesifikasi
- Anda tidak boleh menggunakan builtin untuk menemukan daftar kotak dalam rentang tertentu
- Celah Standar Berlaku
- Anda harus dapat menangani hingga 1 000 000 (1 juta)
- Jika diberikan dengan input
1******
, sudah benar untuk mencetak[1000000]
. Juga benar untuk mencetak[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Urutan wildcard tidak akan pernah dimulai dengan karakter wildcard; artinya, mereka akan selalu mencocokkan string dengan panjang yang sama.
Uji Kasus
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Kemenangan
Pengajuan terpendek (valid) (bekerja) paling lambat 14 Februari, diikat oleh pemenang pengajuan paling awal.
?
akan dipilih oleh penjawab.25
jawaban yang valid untuk***
tetapi tidak untuk*2*
?{4, "w", "w", 6}
(atau lebih baik lagi{4, w, w, 6}
), daripada array karakter, seperti{"4", "w", "w", "6"}
?Jawaban:
05AB1E , 22 byte
Mungkin ada banyak ruang untuk perbaikan di sini.
Non-digit tidak apa-apa sebagai wildcard.
Cobalah online!
Penjelasan yang akan datang setelah bermain golf lebih lanjut.
sumber
Mathematica, 44 byte
Input adalah daftar digit dengan
_
(tanpa tanda kutip) sebagai wildcard. misalnya{4, _, _, 6}
Penjelasan
Buat daftar
{1, 2, 3, ... , 1000}
Susun itu. (daftar semua kotak dari 1 hingga 1.000.000)
Pisahkan setiap kotak menjadi daftar angka.
Temukan yang cocok dengan pola yang ditentukan oleh input.
Cetak mereka.
sumber
Brachylog , 23 byte
Cobalah online!
Penjelasan
Format input berbeda, 13 byte
Bergantung pada apa yang Anda anggap valid sebagai input, Anda dapat melakukan ini:
Cobalah online!
yang pada dasarnya adalah bagian kedua dari jawaban di atas, dengan daftar sebagai input yang berisi digit dan variabel di mana wildcard berada.
Saya tidak menganggap ini valid karena hanya ada 26 nama variabel di Brachylog (huruf besar), jadi ini tidak akan berfungsi jika Anda memiliki lebih dari 26 kartu wil.
sumber
true.
), tetapi saya belum pernah menggunakan bahasa yang memerlukan ini sebelumnya. Saya akan mencoba mencari beberapa referensi untuk menentukan bagaimana saya harus mencetak skor ini, tetapi masuk akal untuk menilai itu sebagai 23, jadi saya akan tetap melakukannya.Perl 6 ,
3026 byteBerkat @ b2gills untuk -4 byte!
Menggunakan dot sebagai karakter wildcard, sehingga input dapat digunakan sebagai regex:
Cobalah online .
Varian yang menerima tanda bintang sebagai wildcard (seperti yang disarankan oleh revisi tugas sebelumnya) adalah 42 byte:
sumber
{ ... }("9*9***")
), atau menugaskannya ke variabel / simbol untuk digunakan nanti. Perhatikan bahwa Perl 6 adalah bahasa yang terpisah dari Perl, sehingga tidak akan berfungsi dengan penerjemah Perl.sudo apt-get install rakudo
mendapatkan penerjemah Perl6 yang seharusnya ... Ketika saya menempatkanperl6
sebagai perintah ke terminal saya, itu memulai apa yang tampaknya menjadi penerjemah Perl6, tetapi saya tidak tahu bagaimana menggunakannya. Saya tahu ini lambda, tapi saya tidak tahu bagaimana menyebutnya.perl6 foo.p6
. Anda juga dapat mengujinya di oneliner shell, sepertiperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Ruby, 54 byte
Fungsi yang mengambil argumen string. Cobalah online.
sumber
#
adalah membuat komentar selanjutnya.Batch, 109 byte
Digunakan
?
sebagai wildcard. Bekerja dengan membuat 1000 file. Nama file adalah angka kuadrat, dan ekstensi file adalah angka kuadrat dengan$
sufiks. Ini karena pencocokan pola Batch menghitung trailing?
s sebagai opsional, sehingga1?
akan cocok dengan keduanya1
dan16
; yang$
oleh karena itu memaksa pertandingan tepatnya. Namun, kami tidak ingin menampilkan$
, jadi kami hanya menampilkan nama file saja tanpa ekstensi.sumber
JavaScript (ES6),
6866 byteEDIT: Memperbarui solusi saya di bawah ini setelah terinspirasi oleh jawaban JungHwan Min . Sekarang sesuai dengan ES6.
Mengambil input dalam format di
'1..4'
mana.
wildcard.Alih-alih beralih ke 1e6 dan kuadrat rooting yang satu ini beralih ke 1e3 dan kotak.
Tampilkan cuplikan kode
JavaScript (ES7),
7169 byteBuat array angka dari 0 hingga 1e6 lalu filter dengan angka yang kuadrat dan cocok dengan polanya.
Sangat lambat karena selalu beralih ke 1e6.
Tampilkan cuplikan kode
sumber
**
itu berhasil, karena itu memberi saya"SyntaxError: expected expression, got '*'"
.1e6
...**
operator tidak ada, setidaknya tidak dengan sistem saya.**
. Ya itu ES7 Saya akan memperbarui judul di sini adalah daftar peramban yang saat ini didukung developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Perl,
424538 byteEDIT: klarifikasi oleh Alex, kita dapat menggunakan periode sebagai karakter wildcard yang mencukur operasi y //.
EDIT: solusi yang menggunakan asterisk sebagai karakter wildcard dan mengharapkan urutan wildcard pada STDIN
Yang ini menyisakan banyak ruang untuk perbaikan, ini cukup mudah. Ekspresi wildcard diharapkan sebagai argumen baris perintah, dengan karakter wildcard periode (apa lagi?).
sumber
Python 3 -
9897 byteMembutuhkan input seperti '4..6'.
sumber
import re
danre.findall
; optimasi denganfrom...import *
sebenarnya tidak mengoptimalkannya dalam hal ini.1....
, memberikan1 4 9
dan16 25
sebagai jawaban yang valid, yang tidak benar. Harap perbaiki program Anda.1......
. Itu kembali[]
, tetapi harus memberi[1000000]
. Ini dapat diperbaiki dengan biaya 0 byte dengan menggunakanrange(0, 1001)
daripadarange(0, 1000)
.k - 28 karakter
Digunakan
?
sebagai karakter wildcard. Thelike
penggunaan fungsi?
sebagai wildcard, dan fungsi ini membuat daftar 1001 kotak pertama (untuk menjadi inklusif untuk 1M), gips mereka semua untuk string, dan kemudian cek di mana mereka cocok dengan pola.sumber
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. Bisakah Anda memberikan tautan ke test suite yang berfungsi atau melihat apakah ada masalah?bash + Utilitas Unix, 33 byte
Ini menggunakan '.' sebagai karakter wildcard.
Program dc mencetak angka kuadrat dalam loop tak terbatas:
Output dc disalurkan ke grep, yang mencetak hanya kotak yang cocok dengan pola yang diperlukan.
Ini berfungsi ketika saya menjalankannya pada sistem Linux atau OS X yang sebenarnya (tetapi tidak bekerja di TIO, mungkin karena program dc mencoba untuk muncul kembali selamanya, dan saya menduga TIO kehabisan ruang stack untuk rekursi dan / atau memiliki masalah dengan pipa tidak pernah berakhir).
sumber
dc
.--line-buffered
di kedua sisi^$1$
, tetapi tidak berhasil.sed s/./0/g<<<$1
| grep ^ $ 1 $ Ini menggunakan panjang pola untuk membatasi angka yang sedang diuji (pola 4-karakter hanya memeriksa hingga 9999, dll.). Berikut ini tautan TIO: tio.run/nexus/…grep
. Namun, karena saat ini bukan solusi terpendek, saya akan menyimpannya pada 33 byte untuk penilaian. Tampaknya bekerja untuk semua input, pekerjaan yang sangat bagus!