Tất cả các ô vuông khớp với chuỗi ký tự đại diện [đã đóng]


9

Điều này được lấy cảm hứng từ một phần của Bài toán nhóm 6 của cuộc thi ARML # 6.

Đây là thách thức:

Bạn được cung cấp một "chuỗi ký tự đại diện", đó là một chuỗi các chữ số và một ký tự khác. Một chuỗi khớp với chuỗi ký tự đại diện này bằng mã giả sau:

w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]

Ở đâu '?' là một nhân vật của sự lựa chọn của bạn.

Về mặt regex, chỉ cần tưởng tượng '?'để được '.'.

Thách thức là tìm tất cả các số vuông (yêu cầu lên tới 1 triệu) có biểu diễn chuỗi thập phân khớp với chuỗi ký tự đại diện này. "Ký tự đại diện" có thể là bất kỳ ký tự ASCII nào bạn chọn, miễn là nó không phải là một chữ số, rõ ràng.

Ví dụ: 4096khớp 4**64*9*nhưng 4114cũng không khớp.

Đầu vào

Đầu vào sẽ được đưa ra như một chuỗi khớp với biểu thức chính quy [0-9?]+. Đây có thể là một chuỗi, một mảng ký tự hoặc một mảng byte của các ký tự trong ASCII.

Đầu ra

Đầu ra sẽ là một danh sách / tập hợp / mảng số bất kỳ bạn muốn phân tách thành các ô vuông hoàn hảo và khớp với chuỗi ký tự đại diện.

Ví dụ về các đầu vào hợp lệ:

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]

Ví dụ về đầu ra hợp lệ:

[1, 4, 9]
1 4 9
1, 4, 9
1-4-9

Vân vân.

Thông số kỹ thuật

  • Bạn không được sử dụng nội dung để tìm danh sách các ô vuông trong một phạm vi nhất định
  • Áp dụng sơ hở tiêu chuẩn
  • Bạn phải có khả năng xử lý lên tới 1 000 000 (1 triệu)
  • Nếu được cung cấp với đầu vào 1******, nó là chính xác để in [1000000]. Nó cũng đúng để in[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
  • Trình tự ký tự đại diện sẽ không bao giờ bắt đầu với ký tự đại diện; nghĩa là, chúng sẽ luôn khớp với các chuỗi có cùng độ dài.

Các trường hợp thử nghiệm

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]

Chiến thắng

Gửi ngắn nhất (hợp lệ) (làm việc) trước ngày 14 tháng 2, hòa vốn bằng cách giành chiến thắng sớm nhất.


1
Tôi nghĩ rằng một khởi đầu tốt để làm cho điều này rõ ràng hơn sẽ là để xác định đó ?là được lựa chọn bởi người trả lời.
FryAmTheEggman

2
Tại sao 25một câu trả lời hợp lệ cho ***nhưng không cho *2*?
Neil

3
Tôi nghĩ rằng điều này sẽ sạch hơn nếu các số không bao giờ có các số 0 đứng đầu, do đó chỉ khớp các chuỗi có độ dài của chúng.
xnor

@Neil Đó sẽ là một vấn đề với giải pháp của riêng tôi. Tôi sẽ lấy gợi ý của xnor.
HyperNeutrino

Đầu vào có thể là một mảng gồm các số nguyên một chữ số và ký tự đặc biệt, chẳng hạn như {4, "w", "w", 6}(hoặc tốt hơn nữa {4, w, w, 6}), chứ không phải là một mảng các ký tự, chẳng hạn như {"4", "w", "w", "6"}?
Greg Martin

Câu trả lời:


0

05AB1E , 22 byte

Có lẽ rất nhiều phòng để cải thiện ở đây.
Bất kỳ chữ số nào cũng được dưới dạng ký tự đại diện.

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

Hãy thử trực tuyến!

Giải thích để đến sau khi chơi golf.


Điều này dường như để làm việc cho tất cả các đầu vào. Làm tốt lắm.
HyperNeutrino

1

Toán học, 44 byte

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

Đầu vào là danh sách các chữ số có _ký tự đại diện (không có dấu ngoặc kép). ví dụ{4, _, _, 6}

Giải trình

Range@1*^3

Tạo danh sách {1, 2, 3, ... , 1000}

... ^2

Làm vuông nó. (danh sách tất cả các ô vuông từ 1 đến 1.000.000)

IntegerDigits[ ... ]

Chia mỗi hình vuông thành một danh sách các chữ số.

... ~Cases~#

Tìm những cái phù hợp với mẫu được chỉ định bởi đầu vào.

Print@@@ ...

In chúng.


Điều này dường như để làm việc cho tất cả các trường hợp thử nghiệm. Làm tốt lắm.
HyperNeutrino

1

Brachylog , 23 byte

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

Hãy thử trực tuyến!

Giải trình

@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

Định dạng đầu vào khác nhau, 13 byte

Tùy thuộc vào những gì bạn coi là hợp lệ làm đầu vào, bạn có thể làm điều này:

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

Hãy thử trực tuyến!

về cơ bản là phần thứ hai của câu trả lời ở trên, với một danh sách là đầu vào chứa các chữ số và các biến có ký tự đại diện.

Tôi không xem xét điều này hợp lệ mặc dù chỉ có 26 tên biến trong Brachylog (chữ in hoa), vì vậy điều này sẽ không hoạt động nếu bạn có nhiều hơn 26 wilcard.


Điều này dường như để làm việc cho tất cả các đầu vào. Làm tốt lắm. Tuy nhiên, tôi sẽ coi đây là 24 byte vì bắt buộc phải có đối số 1 byte. Tôi không chắc cách ghi điểm cho việc này sẽ làm việc mặc dù.
HyperNeutrino

1
@AlexL. Đối số chỉ ở đó để cho biết tên của biến đầu ra (bạn có thể sử dụng một chữ cái viết hoa khác nếu bạn muốn). Điều này tương tự với câu trả lời trong Prolog / ngôn ngữ với các hàm trong đó vị ngữ / hàm được đặt tên nhưng bạn không thực sự đếm số byte bạn sử dụng khi bạn gọi nó.
Gây tử vong

Được chứ. Tôi không chắc liệu người ta có nên chấm điểm là 24 hay không vì đối số là cần thiết (nếu không nó chỉ trả về true.), nhưng tôi chưa sử dụng các ngôn ngữ yêu cầu điều này trước đây. Tôi sẽ cố gắng tìm một số tài liệu tham khảo để xác định làm thế nào tôi nên ghi điểm này, nhưng sẽ rất hợp lý nếu chấm điểm đó là 23, vì vậy tôi sẽ giữ nó ở mức đó.
HyperNeutrino

1

Perl 6 , 30 26 byte

Cảm ơn @ b2gills cho -4 byte!

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

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

Sử dụng dấu chấm dưới dạng ký tự đại diện, để đầu vào có thể được sử dụng làm biểu thức chính quy:

{                            }   # 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

Hãy thử trực tuyến .

Một biến thể chấp nhận dấu hoa thị dưới dạng ký tự đại diện (như được đề xuất bởi phiên bản trước của mô tả tác vụ) sẽ là 42 byte:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}

Tôi đã trình bày lại các quy tắc và bạn có thể chọn bất kỳ ký tự đại diện nào. Tôi đang chấm điểm này là 38 byte.
HyperNeutrino

Ừm, làm thế nào để bạn sử dụng này? Tôi không biết gì về Perl.
HyperNeutrino

@AlexL.: Cảm ơn, tôi đã cập nhật câu trả lời (và thêm một lời giải thích nữa). Đó là một lambda; bạn có thể gọi nó trực tiếp (ví dụ { ... }("9*9***")) hoặc gán nó cho một biến / ký hiệu để sử dụng sau. Lưu ý rằng Perl 6 là một ngôn ngữ riêng biệt với Perl, vì vậy nó sẽ không hoạt động với trình thông dịch Perl.
smls

Tôi đã từng sử dụng sudo apt-get install rakudomột trình thông dịch Perl6 được cho là ... Khi tôi đặt perl6lệnh vào thiết bị đầu cuối của mình, nó bắt đầu một trình thông dịch Perl6, nhưng tôi không biết cách sử dụng nó. Tôi biết đó là lambda, nhưng tôi không biết gọi nó như thế nào.
HyperNeutrino

@AlexL.: Tôi đã thêm một liên kết "Dùng thử trực tuyến" hiển thị nó dưới dạng một tập lệnh đầy đủ mà bạn có thể chạy perl6 foo.p6. Bạn cũng có thể kiểm tra nó trong một vỏ oneliner, nhưperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls

1

Ruby, 54 byte

Hàm có một đối số chuỗi. Hãy thử trực tuyến.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}

Bạn có thể lưu một byte bằng cách sử dụng i * i thay vì i ** 2
GB

Điều này dường như không hoạt động bởi vì thứ hai #là làm cho phần còn lại của dòng bình luận.
HyperNeutrino

@AlexL Ồ, nó hoạt động tốt. repl.it/FJCV
Mực giá trị

ohhhh được rồi tôi chỉ không biết cách kiểm tra Ruby. Lời xin lỗi của tôi. Điều này dường như để làm việc cho tất cả các đầu vào. Làm tốt lắm!
HyperNeutrino

0

Mẻ, 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

Sử dụng ?như ký tự đại diện. Hoạt động bằng cách tạo 1000 tệp. Tên của tệp là số vuông và phần mở rộng của tệp là số vuông có $hậu tố. Điều này là do khớp mẫu của Batch đếm số ?s là tùy chọn, do đó 1?sẽ khớp cả hai 116; các $do đó buộc trận đấu để được chính xác. Tuy nhiên, chúng tôi không muốn xuất ra $, vì vậy chúng tôi chỉ xuất tên tệp mà không có phần mở rộng.


0

JavaScript (ES6), 68 66 byte

EDIT: Cập nhật giải pháp của tôi dưới đây sau khi được truyền cảm hứng từ câu trả lời của JungHwan Min . Bây giờ nó là tuân thủ ES6.

Đưa đầu vào trong các định dạng '1..4'.là ký tự đại diện.

Thay vì lặp lại thành 1e6 và căn bậc hai, cái này lặp lại thành 1e3 và hình vuông.

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}$`))

Tạo một mảng các số từ 0 đến 1e6 sau đó lọc nó theo các số vuông và khớp với mẫu.

Nó rất chậm vì nó luôn lặp lại thành 1e6.


Tôi không nghĩ rằng **đang làm việc, bởi vì nó đem lại cho tôi một "SyntaxError: expected expression, got '*'".
HyperNeutrino

@AlexL. Các quy tắc dường như đã thay đổi. Các quy tắc trước đây đề nghị tôi có thể chọn ký tự đại diện.
George Reith

Bạn chỉ cần hỗ trợ tối đa 1e6...
HyperNeutrino

Ngoài ra, tôi đã thay đổi các quy tắc trở lại; vấn đề không nằm ở quy tắc, bởi vì **nhà điều hành không tồn tại, ít nhất là không phải với hệ thống của tôi.
HyperNeutrino

@AlexL. Ah xin lỗi tôi nghĩ bạn có nghĩa là đầu vào **. Có nó là ES7 tôi sẽ cập nhật tiêu đề ở đây là danh sách các trình duyệt hiện nay hỗ trợ developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
George Reith

0

Perl, 42 45 38 byte

EDIT: làm rõ bởi Alex, chúng ta có thể sử dụng dấu chấm làm ký tự đại diện để loại bỏ thao tác y //.

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

EDIT: giải pháp sử dụng dấu hoa thị làm ký tự đại diện và mong đợi chuỗi ký tự đại diện trên STDIN

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

Điều này chắc chắn để lại rất nhiều cơ hội để cải thiện, nó khá đơn giản. Biểu thức ký tự đại diện được dự kiến ​​là đối số dòng lệnh, với ký tự đại diện dấu chấm (còn gì nữa không?).

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"

Câu hỏi xác định rằng các ký tự đại diện được đưa ra dưới dạng dấu hoa thị. Có phải một bản sửa đổi trước đó của câu hỏi cho phép chọn ký tự đại diện của riêng bạn?
smls

1
@smls: Câu hỏi vẫn chỉ định chọn ký tự đại diện của riêng bạn mặc dù nó không nằm trong phần quy tắc: Ký tự được sử dụng làm ký tự đại diện không nhất thiết phải là dấu hoa thị, nó có thể là bất kỳ ký tự ASCII nào bạn chọn, miễn là nó Rõ ràng không phải là một chữ số.
Emigna

Vâng, tôi đã nhầm lẫn bởi điều đó. Sau đó, nó nói rõ rằng ký tự đại diện cần phải là dấu hoa thị. Tôi đoán định nghĩa với regex là hàng đầu. Tôi sẽ sửa lại giải pháp của mình.
daniel

1
Thật ra, câu được trích dẫn bởi @Emigna khá rõ ràng rằng chúng ta có thể chọn ký tự đại diện của riêng mình, phải không?
cười

Để làm rõ, ký tự đại diện có thể là bất cứ điều gì bạn muốn. Tôi vô tình làm rối các quy tắc khi nghỉ ngơi giải thích.
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)]))))

Yêu cầu đầu vào như '4..6'.


Bạn có thể lưu 3 byte bằng cách sử dụng import rere.findall; tối ưu hóa với from...import *không thực sự tối ưu hóa nó trong trường hợp này.
HyperNeutrino

Cung cấp đầu vào 1...., nó đưa ra 1 4 916 25như là câu trả lời hợp lệ, không đúng. Vui lòng sửa chương trình của bạn.
HyperNeutrino

Khắc phục trường hợp bằng cách tham gia vào "\ n".
Carra

Điều này không làm việc cho 1....... Nó trả lại [], nhưng nó sẽ cho [1000000]. Điều này có thể được sửa chữa với chi phí 0 byte bằng cách sử dụng range(0, 1001)chứ không phải range(0, 1000).
HyperNeutrino

Điểm hay, tôi vừa kiểm tra tất cả các trường hợp thử nghiệm từ mô tả :)
Carra

0

k - 28 ký tự

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

Sử dụng ?như ký tự đại diện. Các likesử dụng chức năng ?như một ký tự đại diện, và chức năng này tạo ra một danh sách 1001 hình vuông đầu tiên (được bao gồm để 1M), phôi tất cả chúng thành các chuỗi, và sau đó kiểm tra nơi họ phù hợp với mô hình.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196

Tôi nhận được lỗi này cho nó : type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":". Bạn có thể cung cấp một liên kết đến một bộ kiểm tra làm việc hoặc xem nếu có vấn đề?
HyperNeutrino

@AlexL. Nó hoạt động với tôi ở chế độ k kdb +
C. Quilley

Hừm. Tôi sẽ thử kiểm tra nó với các thông dịch viên khác nhau.
HyperNeutrino

0

bash + tiện ích Unix, 33 byte

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

Cái này sử dụng '.' như nhân vật ký tự đại diện.

Chương trình dc in các số vuông trong một vòng lặp vô hạn:

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.

Đầu ra dc được dẫn đến grep, chỉ in các ô vuông phù hợp với mẫu yêu cầu.

Điều này hoạt động khi tôi chạy nó trên hệ thống Linux hoặc OS X thực tế (nhưng nó không hoạt động tại TIO, có lẽ vì chương trình dc cố gắng lặp lại mãi mãi và tôi nghi ngờ TIO hết dung lượng ngăn xếp cho đệ quy và / hoặc có một vấn đề với đường ống không bao giờ kết thúc).


Tôi đang chạy cái này với Linux Mint 17.3 Rosa và nó không kết thúc. Tôi nghĩ vấn đề là với lệnh không bao giờ kết thúc dc.
HyperNeutrino

Tôi nghi ngờ đó thực sự là bộ đệm gây ra vấn đề. Tôi không có phiên bản Linux đó, nhưng bạn có thể thử thay thế grep bằng grep - line-buffered (để khiến mỗi dòng được in khi nó được in). [Tất nhiên, điều đó thêm một số byte.]
Mitchell Spector

Tôi đã thêm đối số grep, nhưng nó không tạo ra sự khác biệt. Tôi đã thử đặt --line-bufferedhai bên của ^$1$nó, nhưng nó cũng không hoạt động.
HyperNeutrino

@ AlexL. Cảm ơn bạn đã cố gắng. Tôi không biết sự khác biệt là trong kernel hay trong phiên bản bash tôi đang chạy. Tôi đã làm cho nó hoạt động trong TIO bằng cách buộc kết thúc đầu vào của grep bằng cách sử dụng head, như sau: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1 sed s/./0/g<<<$1| grep ^ $ 1 $ Điều này sử dụng độ dài của mẫu để giới hạn số lượng đang được kiểm tra (mẫu 4 ký tự chỉ kiểm tra tối đa 9999, v.v.). Đây là một liên kết TIO: tio.run/nexus/ Mạnh
Spector Mitchell

Cảm ơn bạn đã sửa chữa. Tôi không nghĩ rằng giải pháp hiện tại sẽ thực sự hoạt động (mặc dù tôi không có nhiều kiến ​​thức về bash), vì có vẻ như nó cần tính toán tất cả các giá trị trước khi đưa nó vào grep. Tuy nhiên, vì hiện tại nó không phải là giải pháp ngắn nhất, tôi sẽ giữ nó ở mức 33 byte để ghi điểm. Nó xuất hiện để làm việc cho tất cả các đầu vào, vì vậy công việc tốt!
HyperNeutrino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.