Trò chơi biển số Tây Ban Nha


26

Câu hỏi này dựa trên một câu hỏi tôi đã hỏi bằng tiếng Tây Ban Nha . Vâng, tôi đã yêu cầu một thuật toán bằng tiếng Tây Ban Nha. :)

Ở Tây Ban Nha, biển số xe hiện tại có mẫu này:

1234 XYZ

Trong đó XYZ là ba phụ âm được lấy từ bộ phụ âm Tây Ban Nha đầy đủ (ngoại trừ 'Ñ', tôi nghĩ vậy).

Đôi khi, khi đi du lịch cùng vợ, chúng tôi thường chơi một trò chơi. Khi chúng tôi nhìn thấy một tấm giấy phép, chúng tôi lấy ba phụ âm của nó và cố gắng tạo thành một từ có chứa ba phụ âm đó, xuất hiện theo thứ tự như trong biển số xe. Ví dụ (bằng tiếng Tây Ban Nha):

BCD
    BoCaDo (valid)
    CaBezaDa (not valid)
FTL
    FaTaL (valid)
    FLeTar (not valid)
FTR
    FleTaR (valid, wins)
    caFeTeRa (valid, loses)

Người chiến thắng là người sử dụng số lượng ký tự ít nhất, như bạn có thể thấy trong ví dụ trước.

Các thách thức

Viết chương trình hoặc hàm ngắn nhất nhận danh sách các từ và một bộ ba phụ âm và tìm từ ngắn nhất trong danh sách chứa ba phụ âm theo cùng một thứ tự. Đối với mục đích của trò chơi này, trường hợp không quan trọng.

  • Đầu vào cho danh sách từ (tham số đầu tiên) sẽ là một mảng của stringloại ngôn ngữ của bạn . Tham số thứ hai (ba phụ âm) sẽ là một tham số khác string. Nếu ngôn ngữ của bạn tốt hơn, hãy xem xét stringvới ba phụ âm là mục cuối cùng của toàn bộ danh sách các tham số. Đầu ra sẽ là một cái khác string.
  • Các từ trong danh sách từ sẽ không được phát minh hoặc từ vô hạn, chúng sẽ xuất hiện trong bất kỳ từ điển chuẩn nào. Nếu bạn cần một giới hạn, giả sử không có từ nào trong danh sách từ sẽ dài hơn 50 ký tự.
  • Nếu có một vài từ có cùng chiều dài có thể là câu trả lời hợp lệ, bạn có thể trả lại bất kỳ từ nào trong số chúng. Chỉ cần đảm bảo bạn trả về chỉ một từ hoặc một chuỗi trống nếu không có từ nào khớp với mẫu của ba phụ âm.
  • Bạn có thể lặp lại các phụ âm trong nhóm, vì vậy đầu vào hợp lệ cho ba phụ âm là cả FLRGGG.
  • Các phụ âm Tây Ban Nha hoàn toàn giống với tiếng Anh, với việc thêm "". Các nguyên âm giống nhau với sự kết hợp của các nguyên âm nhấn mạnh: "áéíóúü". Sẽ không có bất kỳ loại nhãn hiệu nào khác như "-" hoặc "'".
  • Bạn có thể cho rằng trường hợp sẽ luôn giống nhau trong cả danh sách từ và ba phụ âm.

Nếu bạn muốn kiểm tra thuật toán của mình bằng một bộ sưu tập các từ tiếng Tây Ban Nha thực sự, bạn có thể tải xuống một tệp (15,9 MB) từ Dropbox với hơn một triệu từ.

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

Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'

Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'

Input: 'hst', {'hastío' 'chest'}
Output: 'chest'

Đây là , vì vậy có thể chương trình ngắn nhất giúp tôi luôn đánh bại vợ mình! :)


Bao lâu các từ trong danh sách từ được đảm bảo?
Neil

2
Trong biển số xe thực tế, chữ Q cũng không được phép; và W là, mặc dù không phải là một lá thư Tây Ban Nha thích hợp
Luis Mendo

2
Chúng ta có thể giả sử các từ trong danh sách và ba chữ cái sẽ có trong một trường hợp không?
Jonathan Allan

1
@LuisMendo W là một lá thư tiếng Tây Ban Nha từ năm 1969 .
walen

1
@walen Đó là lý do tại sao tôi nói "đúng" :-) Nó tồn tại trong tiếng Tây Ban Nha, nhưng cảm thấy xa lạ
Luis Mendo

Câu trả lời:


7

05AB1E , 10 8 byte

Đã lưu 2 byte nhờ Leo

ʒæså}éR`

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

Giải trình

ʒ         # filter list, keep only members for which the following is true
  så      # input is in the
 æ        # powerset of the current word
    }     # end filter
     é    # sort by length
      R   # reverse
       `  # push separately (shortest on top)

headCuối cùng tôi đã sử dụng để lưu một byte nhưng điều đó sẽ tạo ra một danh sách trống nếu không có kết quả khớp.


3
3ù #keep only those of length 3tại sao bạn cần cái này
Leo

1
@Leo: Tôi không, điều đó thật ngớ ngẩn với tôi. Cảm ơn :)
Emigna

6

MATL , 30 29 byte

xtog!s2$S"1G!'.*'Yc!@gwXXn?@.

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

Giải trình

x         % Implicitly take first input (string with three letters). Delete.
          % Gets copied into clipboard G, level 1
t         % Implicitly take second input (cell array of strings defining the
          % words). Duplicate
o         % Convert to numeric array of code points. This gives a matrix where
          % each string is on a row, right-padded with zeros
g         % Convert to logical: nonzeros become 1
!s        % Sum of each row. This gives the length of each word
2$S       % Two-input sort: this sorts the array of strings according to their
          % lengths in increasing order
"         % For each word in the sorted array
  1G      %   Push first input, say 'xyz'
  !       %   Transpose into a column vector of chars
  '.*'Yc  %   Concatenate this string on each row
  !       %   Transpose. This gives a char array which, when linearized in
          %   column-major order, corresponds to 'x.*y.*z.*'
  @g      %   Push corrent word
  w       %   Swap
  XX      %   Regexp matching. Gives a cell array with substrings that match
          %   the pattern 'x.*y.*z.*'
  n       %   Number of matchings
  ?       %   If non-zero
    @     %     Push cell array with current word, to be displayed as output
    .     %     Break loop
          %   Implicit end (if)
          % Implicit end (for)
          % Implicitly display stack

6

PHP , 111 byte

$y=array_map(str_split,preg_grep("#".chunk_split($_GET[1],1,".*")."#",$_GET[0]));sort($y);echo join($y[0]??[]);

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


2
Biển số phải là một chuỗi, không phải là một mảng. Nhưng bạn không nên sửa đổi.
Tít

@Titus đã sửa !!
Jörg Hülsermann

You can suppose the case will always be the same in both the word list and the three consonants.- không cần sửa đổi regex. Bạn đã thử wordwrapthay vì join(str_split())?
Tít

@Titus ý tưởng hay
Jörg Hülsermann

5

Thạch ,  12 11  10 byte

ŒPċðÐfLÞḣ1

Một chương trình đầy đủ chấp nhận danh sách các danh sách các ký tự chữ thường (các từ) và một danh sách các ký tự chữ thường (các chữ cái) và in ra các từ đầu tiên trong số các từ ngắn nhất chứa một chuỗi con bằng với các chữ cái (hoặc không có gì nếu không tồn tại ).

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

Làm sao?

ŒPċðÐfLÞḣ1 - Main link: words; characters
   ðÐf     - filter keep words for which this is truthy:
ŒP         -   the power-set (all sub-sequences of the word in question)
  ċ        -   count (how many times the list of characters appears)
           - ...note 0 is falsey while 1, 2, 3, ... are truthy
       Þ   - sort by:
      L    -  length
        ḣ1 - head to index 1 (would use Ḣ but it yields 0 for empty lists)
           - implicit print (smashes together the list of lists (of length 1))

1
Nếu tôi hiểu chính xác lời giải thích của bạn, điều này sẽ từ chối một từ như "borracho" cho một chuỗi các phụ âm của "brc", bởi vì "brc" không phải là một chuỗi con của "brrc"
Leo

@Leo ah, vâng, tôi nghĩ rằng nó sẽ thất bại ...
Jonathan Allan

@Leo - cũng đã được sửa (kiểm tra "tồn tại" cho toàn bộ tập hợp sức mạnh của từng từ) nhưng nó có thể không được đánh gôn hoàn toàn ...
Jonathan Allan

5

Pyth - 22 21 19 12 11 byte

h+f/yTQlDEk

-1 Cảm ơn Maltysen.

Mất 2 dòng làm đầu vào. 1 là chuỗi 3 chữ cái (chữ thường) và thứ 2 là danh sách các từ viết thường.

Hãy thử nó ở đây

Giải trình:

h+f/yTQlDEk
       lDE   # Sort word list by length
  f          # Filter elements T of the word list...
    yT       # by taking the powerset...
   /  Q      # and checking whether the 3-letter string Q is an element of that.
 +        k  # Add empty string to the list (in case no results found)
h            # And take the first result (the shortest)

Giải pháp 19 byte cũ:

h+olNf/-T"aeiou"QEk                       

@Jonathan ALLan: Đã sửa! Cảm ơn đã chỉ ra rằng.
Maria

1
@Jonathan ALLan: Có vẻ như anh ấy đã chỉnh sửa câu hỏi để làm rõ rằng nó sẽ trả về một chuỗi trống trong trường hợp đó. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp.
Maria

1
Chúng tôi có một toán tử meta sắp xếp theo D, vì vậy bạn có thể thay thế olN bằng lD
Maltysen

5

Brachylog v2, 11 byte

tlᵒ∋.&h⊆.∨Ẹ

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

Chức năng trình. (Liên kết TIO có một đối số dòng lệnh để chạy một chức năng như thể nó là một chương trình đầy đủ.)

Giải trình

Chỉ cần một bản dịch trực tiếp của đặc điểm kỹ thuật một lần nữa

tlᵒ∋.&h⊆.∨Ẹ
t            The last element of {standard input}
   ∋.        contains the return value as an element
     &       and
      h      the first element of {standard input}
       ⊆.    is a subsequence of the return value
         ∨   alternate behaviour if no solution is found:
          Ẹ  return empty string
  ᵒ          tiebreak override: favour answers that have a low
 l           length

Bạn thực sự gần như có thể trả lời bằng h⊆.&t∋- hoán đổi thứ tự đánh giá có nghĩa là Brachylog sẽ chọn câu trả lời ngắn nhất theo mặc định (vì ràng buộc đầu tiên mà nó thấy là ràng buộc , có "bẻ khóa" khá thuận tiện như một bản bẻ khóa mặc định) - nhưng trong trường hợp đó, Brachylog thuật toán đánh giá không may đi vào một vòng lặp vô hạn nếu câu trả lời không thực sự được tìm thấy. Vì vậy, gần một nửa câu trả lời được dành riêng để xử lý trường hợp không có câu trả lời thích hợp. Ngay cả sau đó, lᵒghi đè tiebreak (về mặt kỹ thuật là một loại, sử dụngBẻ khóa mặc định của các phần tử ưa thích ở gần đầu danh sách) chỉ có hai byte; ba cái còn lại xuất phát từ nhu cầu xuất một chuỗi trống cụ thể khi không tìm thấy đầu ra, trái ngược với giá trị trọng tâm "không có giải pháp" mặc định của Brachylog (vì cuối cùng .sẽ ẩn nếu chúng ta không phải tuân theo ).

Thật thú vị, có một tính năng đã được triển khai trước đây trong Brachylog sẽ lưu một byte ở đây. Tại một thời điểm, bạn có thể trích xuất các thành phần từ đối số đầu vào sử dụng ?₁, ?₂vv cú pháp; điều đó sẽ cho phép bạn sắp xếp lại chương trình tlᵒ∋.⊇?₁∨Ẹ, chỉ có 10 byte. Thật không may, việc triển khai được sử dụng không thực sự hiệu quả (và khiến nhiều chương trình hoạt động khác bị hỏng), vì vậy nó đã được hoàn nguyên. Mặc dù vậy, bạn có thể nghĩ chương trình là "khái niệm" dài 10 byte.


4

Haskell 129 125 74 byte

import Data.List
l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0

TÍN DỤNG để @nimi


1
Bạn có thể thay thế bên phải mapfilterbằng một sự hiểu biết danh sách. Như bạn đã có Data.Listtrong phạm vi, bạn có thể sử dụng sortOn lengthvà chọn phần đầu để tìm phần tử có độ dài tối thiểu. Cuối cùng, tạo ymột hàm infix. Tất cả điều này làm fkthừa l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0.
nimi

bạn đúng! Tôi mới bắt đầu chơi golf! Cảm ơn!
Davide Spataro

1
Một điều nữa: nếu bạn chuyển đổi nhập Data.Lists, bạn có thể sử dụng argminthay vì sortOnvà lưu !!0: l#w=argmin length[...]. Data.Listsnhiều chức năng hay
nimi

3

Perl, 53 byte

Mã 48 byte + 5 cho -paF.

$"=".*";($_)=sort{$a=~y///c-length$b}grep/@F/,<>

Điều này đem đến một thực tế rằng danh sách nội suy vào m//khai thác sử dụng các $"biến làm thay đổi chuỗi đầu vào ban đầu từ psrđể p.*s.*rsau đó được phù hợp cho mỗi từ khác và được sắp xếp trên length.

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


Nếu tôi chèn "adsd" vào danh sách của bạn, chương trình của bạn sẽ không tìm thấy nó. Ký tự đầu tiên cần tìm không cần phải là ký tự đầu tiên trong từ.
Charlie

@CarlosAlejo Đầu vào cần một dòng mới, hoạt động ổn rồi: Hãy thử trực tuyến! . Điều đó đã làm tôi mất cảnh giác, vì <<<nhà điều hành thêm điều đó cho tôi tại dòng lệnh!
Dom Hastings

3

JavaScript (ES6), 77 75 72 byte

Có 3 phụ âm cvà danh sách các từ ltrong cú pháp currying (c)(l). Cả hai đầu vào được dự kiến ​​trong cùng một trường hợp.

c=>l=>l.map(w=>x=!w.match([...c].join`.*`)||!x[w.length]&&x?x:w,x='')&&x

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


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))cho 72, tôi nghĩ
LarsW

@LarsW Thật vậy, cảm ơn! Tuy nhiên, tôi đã chọn một cách tiếp cận khác để tuân thủ quy tắc mới: hoặc một chuỗi trống nếu không có từ nào khớp với mẫu của ba phụ âm .
Arnauld

3

R, 101 byte

Lần đầu chơi golf! Tôi chắc chắn rằng điều này có thể được cô đọng bằng cách nào đó

Lấy chuỗi x và vectơ ký tự y của các đầu vào có thể

w=pryr::f((b=y[sapply(gsub(paste('[^',x,']'),'',y),function(l)regexpr(x,l))>0])[which.min(nchar(b))])

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

Chỉnh sửa: Phiên bản của tôi là 135, cảm ơn Scrooble cho -34!


1
Chào mừng đến với PPCG! Điều này trông giống như một đoạn mã trong đó đầu vào là các biến được mã hóa cứng. Câu trả lời cần phải là chương trình đầy đủ hoặc chức năng có thể gọi được. Bạn có thể xem cái này (hoặc các câu trả lời R khác) cho các phương thức I / O có thể.
Martin Ender

2

Võng mạc , 58 byte

O#$^`¶.+
$.&
s`^((.)(.)(.).*¶(?-s:(.*\2.*\3.*\4.*)))?.*
$5

Hãy thử trực tuyến! Lấy ba phụ âm trên một dòng và sau đó là danh sách các từ trên tất cả các dòng tiếp theo. Giải thích: Osắp xếp danh sách ¶.+không bao gồm dòng đầu tiên được khóa #bằng số $theo $.&chiều dài. Một trận đấu sau đó được tìm kiếm cho một dòng bao gồm ba phụ âm theo thứ tự. Nếu một dòng phù hợp tồn tại hơn dòng cuối cùng, tức là ngắn nhất, dòng đó trở thành đầu ra, nếu không thì đầu ra trống. Các ?-s:tạm thời tắt ảnh hưởng của s`để chỉ một dòng là lần xuất hiện.


1
Tôi không thể quyết định nếu đó là ba rốn hay ba vú.
Charlie

@CarlosAlejo Bạn có nghĩ đến Eccentrica Gallumbits không?
Neil

Tôi đã nghĩ về người ngoài hành tinh từ Total Recall, nhưng Eccentrica cũng có thể là một lựa chọn ... :)
Charlie

2
@CarlosAlejo Rõ ràng Mary là một sự tôn kính đối với Eccentrica Gallumbits.
Neil

1

Pip , 17 byte

@:qJ`.*`N_FI#_SKg

Lấy danh sách từ làm đối số dòng lệnh và phụ âm từ stdin. Hãy thử trực tuyến!

Giải trình

                   g is list of cmdline args (implicit)
              SKg  Sort g using this key function:
            #_      Length of each item (puts shortest words first)
          FI       Filter on this function:
  q                 Line of input
   J`.*`            joined on regex .* (turns "psr" into `p.*s.*r`)
        N_          Count regex matches in item (keeps only words that match)
@:                 Get first element of result (using : meta-operator to lower precedence)
                   If the list is empty, this will give nil, which results in empty output

1

Java 8, 132 126 byte

s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}

-6 byte nhờ @Nevay .

Giải trình:

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

s->a->{              // Method with two String-array parameters and String return-type
  String r="";       //  Result-String, starting empty
  for(String x:a)    //  Loop over the words
    r=(x.length()<r.length()
                     //   If a word is smaller than the current `r`,
      |r.isEmpty())  //   or `r` is still empty
      &x.matches(r.format(".*%s.*%s.*%s.*",s))?
                     //   And if the word is valid
       x             //    Change `r` to the current word
      :              //   Else:
       r;            //    Leave `r` the same
  return r;}         //  Return the result

1
126 byte:s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
Nevay 18/03/18


0

MATL , 28 27 26 byte

x"l1G@g3XNXm/@gn*v]&X<2Gw)

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

x- Hoàn toàn lấy đầu vào đầu tiên (chuỗi có ba chữ cái) và xóa nó. Được sao chép vào clipboard G, cấp 1 tự động (phần này được lấy cảm hứng từ câu trả lời của @Luis Mendo ).

" - Hoàn toàn lấy đầu vào thứ hai (mảng ô của các từ), lặp qua nó.

l - Đẩy 1 để sử dụng sau

1G - Đẩy đầu vào đầu tiên (giả sử 'psr')

@g - Đẩy từ hiện tại dưới dạng mảng

3XN- nchoosek- Nhận tất cả kết hợp 3 chữ cái từ

Xm- Xem mã số giấy phép 'psr' có phải là một trong những kết hợp này không. Trả về 0 cho sai và 1 cho đúng.

/- Chia 1 (mà chúng tôi đã đẩy trước đó) bằng kết quả này. Thay đổi 0 thành Infs

@gn - Lấy độ dài của từ hiện tại

*- Nhân chiều dài với kết quả chia. Trả về độ dài như khi từ chứa 3 ký tự, nếu không thì trả vềInf

v - nối các kết quả này theo chiều dọc thành một mảng duy nhất

] - vòng lặp gần

&X< - lấy chỉ mục của giá trị tối thiểu từ mảng đó, tức là chỉ mục nơi tìm thấy từ chứa các chữ cái và có độ dài tối thiểu

2G - Đẩy đầu vào thứ hai một lần nữa

w - Đưa chỉ số tối thiểu trở lại trên cùng của ngăn xếp

) - Lập chỉ mục thành mảng các từ có chỉ mục tối thiểu, trả về từ hợp lệ với độ dài tối thiểu

(Ngõ ra ngầm định.)


Lớn hơn:

x"@g1Gy3XNXm1w/wn*v]&X<2Gw)

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
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.