Semua kotak yang cocok dengan urutan wildcard [ditutup]

9

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, 4096cocok 4**6dan 4*9*tetapi 4114tidak 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.

HyperNeutrino
sumber
1
Saya pikir awal yang baik untuk membuat ini lebih jelas adalah dengan menentukan yang ?akan dipilih oleh penjawab.
FryAmTheEggman
2
Mengapa 25jawaban yang valid untuk ***tetapi tidak untuk *2*?
Neil
3
Saya pikir ini akan lebih bersih jika angka tidak pernah memiliki angka nol di depan, jadi hanya cocok dengan urutan panjangnya.
xnor
@ Neil Itu akan menjadi masalah dengan solusi saya sendiri. Saya akan menerima saran xnor.
HyperNeutrino
Bisakah input menjadi array bilangan bulat satu digit dan karakter khusus, seperti {4, "w", "w", 6}(atau lebih baik lagi {4, w, w, 6}), daripada array karakter, seperti {"4", "w", "w", "6"}?
Greg Martin

Jawaban:

0

05AB1E , 22 byte

Mungkin ada banyak ruang untuk perbaikan di sini.
Non-digit tidak apa-apa sebagai wildcard.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

Cobalah online!

Penjelasan yang akan datang setelah bermain golf lebih lanjut.

Emigna
sumber
Tampaknya ini berfungsi untuk semua input. Kerja bagus.
HyperNeutrino
1

Mathematica, 44 byte

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

Input adalah daftar digit dengan _(tanpa tanda kutip) sebagai wildcard. misalnya{4, _, _, 6}

Penjelasan

Range@1*^3

Buat daftar {1, 2, 3, ... , 1000}

... ^2

Susun itu. (daftar semua kotak dari 1 hingga 1.000.000)

IntegerDigits[ ... ]

Pisahkan setiap kotak menjadi daftar angka.

... ~Cases~#

Temukan yang cocok dengan pola yang ditentukan oleh input.

Print@@@ ...

Cetak mereka.

JungHwan Min
sumber
Tampaknya ini berfungsi untuk semua kasus uji. Kerja bagus.
HyperNeutrino
1

Brachylog , 23 byte

@e:{@$|,}a#0:{c.~^#I,}f

Cobalah online!

Penjelasan

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

Format input berbeda, 13 byte

Bergantung pada apa yang Anda anggap valid sebagai input, Anda dapat melakukan ini:

#0:{c.~^#I,}f

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.

Fatalisasi
sumber
Tampaknya ini berfungsi untuk semua input. Kerja bagus. Namun, saya akan menganggap ini 24 byte karena argumen 1-byte diperlukan. Saya tidak yakin bagaimana skor untuk ini akan berhasil.
HyperNeutrino
1
@AlexL. Argumen hanya ada di sana untuk memberi tahu nama variabel output (Anda dapat menggunakan huruf besar lain jika Anda mau). Ini mirip dengan jawaban dalam Prolog / bahasa dengan fungsi di mana predikat / fungsi dinamai tetapi Anda tidak benar-benar menghitung byte yang Anda gunakan saat Anda menyebutnya.
Fatalkan
Baik. Saya tidak yakin apakah seseorang harus memberi skor 24 karena argumen itu diperlukan (jika tidak, ia akan kembali 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.
HyperNeutrino
1

Perl 6 , 30 26 byte

Berkat @ b2gills untuk -4 byte!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

Menggunakan dot sebagai karakter wildcard, sehingga input dapat digunakan sebagai regex:

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

Cobalah online .

Varian yang menerima tanda bintang sebagai wildcard (seperti yang disarankan oleh revisi tugas sebelumnya) adalah 42 byte:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}
seseorang
sumber
Saya telah menyatakan kembali aturan, dan Anda dapat memilih karakter wildcard. Saya mencetak ini sebagai 38 byte.
HyperNeutrino
Um, bagaimana Anda menggunakan ini? Saya tidak tahu apa-apa tentang Perl.
HyperNeutrino
@AlexL .: Terima kasih, saya telah memperbarui jawabannya (dan menambahkan penjelasan juga). Itu adalah lambda; Anda bisa memanggilnya langsung (mis. { ... }("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.
smls
Saya biasa sudo apt-get install rakudomendapatkan penerjemah Perl6 yang seharusnya ... Ketika saya menempatkan perl6sebagai 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.
HyperNeutrino
@AlexL .: Saya menambahkan tautan "Coba online" yang menunjukkannya sebagai skrip lengkap yang dapat Anda jalankan perl6 foo.p6. Anda juga dapat mengujinya di oneliner shell, sepertiperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls
1

Ruby, 54 byte

Fungsi yang mengambil argumen string. Cobalah online.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}
Nilai Tinta
sumber
Anda dapat menyimpan byte dengan menggunakan i * i alih-alih saya ** 2
GB
Tampaknya ini tidak berfungsi karena yang kedua #adalah membuat komentar selanjutnya.
HyperNeutrino
@ AlexL Oh, itu berfungsi dengan baik. repl.it/FJCV
Nilai Tinta
ohhhh oke saya tidak tahu cara menguji Ruby. Permintaan maaf saya. Tampaknya ini berfungsi untuk semua input. Kerja bagus!
HyperNeutrino
0

Batch, 109 byte

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

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, sehingga 1?akan cocok dengan keduanya 1dan 16; yang $oleh karena itu memaksa pertandingan tepatnya. Namun, kami tidak ingin menampilkan $, jadi kami hanya menampilkan nama file saja tanpa ekstensi.

Neil
sumber
0

JavaScript (ES6), 68 66 byte

EDIT: 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.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

JavaScript (ES7), 71 69 byte

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

Buat array angka dari 0 hingga 1e6 lalu filter dengan angka yang kuadrat dan cocok dengan polanya.

Sangat lambat karena selalu beralih ke 1e6.

George Reith
sumber
Saya tidak berpikir **itu berhasil, karena itu memberi saya "SyntaxError: expected expression, got '*'".
HyperNeutrino
@AlexL. Aturannya tampaknya telah berubah. Aturan sebelumnya menyarankan saya untuk memilih karakter wildcard.
George Reith
Anda hanya perlu mendukung hingga 1e6...
HyperNeutrino
Selain itu, saya mengubah aturan kembali; masalahnya bukan dengan aturan, itu karena **operator tidak ada, setidaknya tidak dengan sistem saya.
HyperNeutrino
@AlexL. Ah maaf saya pikir Anda maksudkan inputnya **. Ya itu ES7 Saya akan memperbarui judul di sini adalah daftar peramban yang saat ini didukung developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
George Reith
0

Perl, 42 45 38 byte

EDIT: klarifikasi oleh Alex, kita dapat menggunakan periode sebagai karakter wildcard yang mencukur operasi y //.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

EDIT: solusi yang menggunakan asterisk sebagai karakter wildcard dan mengharapkan urutan wildcard pada STDIN

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

Yang ini menyisakan banyak ruang untuk perbaikan, ini cukup mudah. Ekspresi wildcard diharapkan sebagai argumen baris perintah, dengan karakter wildcard periode (apa lagi?).

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"
daniel
sumber
Pertanyaan menentukan bahwa wildcard diberikan sebagai tanda bintang. Apakah revisi sebelumnya atas pertanyaan memungkinkan pemilihan karakter wildcard Anda sendiri?
smls
1
@smls: Pertanyaannya masih menentukan memilih wildcard Anda sendiri meskipun tidak ada di bagian aturan: Karakter yang digunakan sebagai wildcard tidak perlu menjadi asterisk, itu bisa berupa karakter ASCII pilihan Anda, asalkan jelas bukan angka.
Emigna
Ya, saya bingung dengan itu. Kemudian, jelas mengatakan karakter wildcard harus menjadi tanda bintang. Saya kira definisi dengan regex memimpin. Saya akan merevisi solusi saya.
daniel
1
Hm sebenarnya, kalimat yang dikutip oleh @Emigna cukup jelas bahwa kita dapat memilih karakter wildcard kita sendiri, bukan?
smls
Untuk memperjelas, karakter wildcard dapat berupa apa pun yang Anda inginkan. Saya tidak sengaja mengacaukan aturan ketika menyatakan kembali penjelasannya.
HyperNeutrino
0

Python 3 - 98 97 byte

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

Membutuhkan input seperti '4..6'.

Carra
sumber
Anda dapat menyimpan 3 byte dengan menggunakan import redan re.findall; optimasi dengan from...import *sebenarnya tidak mengoptimalkannya dalam hal ini.
HyperNeutrino
Masukan yang diberikan 1...., memberikan 1 4 9dan 16 25sebagai jawaban yang valid, yang tidak benar. Harap perbaiki program Anda.
HyperNeutrino
Perbaiki kasus dengan bergabung di "\ n".
Carra
Ini tidak berhasil 1....... Itu kembali [], tetapi harus memberi [1000000]. Ini dapat diperbaiki dengan biaya 0 byte dengan menggunakan range(0, 1001)daripada range(0, 1000).
HyperNeutrino
Poin bagus, saya baru saja memeriksa semua test case dari deskripsi :)
Carra
0

k - 28 karakter

{s(&:)($:s:s*s:!1001)like x}

Digunakan ?sebagai karakter wildcard. The likepenggunaan 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.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196
C. Quilley
sumber
Saya mendapatkan kesalahan ini untuk itu: 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?
HyperNeutrino
@AlexL. Ini berfungsi untuk saya dalam mode kdb + 's
C. Quilley
Hmm. Saya akan mencoba mengujinya dengan penerjemah yang berbeda.
HyperNeutrino
0

bash + Utilitas Unix, 33 byte

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

Ini menggunakan '.' sebagai karakter wildcard.

Program dc mencetak angka kuadrat dalam loop tak terbatas:

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

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).

Mitchell Spector
sumber
Saya menjalankan ini dengan Linux Mint 17.3 Rosa, dan itu tidak berakhir. Saya pikir masalahnya adalah dengan perintah yang tidak pernah berakhir dc.
HyperNeutrino
Saya menduga itu sebenarnya buffering yang menyebabkan masalah. Saya tidak memiliki versi Linux itu, tetapi Anda dapat mencoba mengganti grep dengan grep --line-buffered (menyebabkan setiap baris dicetak karena itu digenggam). [Tentu saja, itu menambahkan sejumlah byte.]
Mitchell Spector
Saya menambahkan argumen grep, tetapi tidak ada bedanya. Saya mencoba meletakkan --line-buffereddi kedua sisi ^$1$, tetapi tidak berhasil.
HyperNeutrino
@ AlexL.Terima kasih sudah mencoba. Saya tidak tahu apakah perbedaannya ada di kernel atau di versi bash yang saya jalankan. Saya mendapatkannya untuk bekerja di TIO dengan memaksa diakhirinya input grep menggunakan head, sebagai berikut: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1 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/…
Mitchell Spector
Terima kasih atas perbaikannya. Saya tidak berpikir solusi saat ini akan benar-benar bekerja (walaupun saya tidak memiliki banyak pengetahuan tentang bash), karena tampaknya perlu menghitung semua nilai sebelum memasukkannya ke dalam 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!
HyperNeutrino