แผ่นป้ายทะเบียนเกมสเปน


26

คำถามนี้จะขึ้นอยู่กับคำถามที่ผมถามในภาษาสเปน ใช่ฉันขออัลกอริทึมเป็นภาษาสเปน :)

ในสเปนแผ่นป้ายทะเบียนปัจจุบันมีรูปแบบดังนี้:

1234 XYZ

ที่ XYZ เป็นพยัญชนะสามตัวที่นำมาจากชุดพยัญชนะสเปนเต็มรูปแบบ (ยกเว้น 'Ñ' ฉันคิดว่า)

บางครั้งเมื่อเดินทางกับภรรยาของฉันเรามักจะเล่นเกม เมื่อเราเห็นป้ายทะเบียนเราใช้พยัญชนะสามตัวและพยายามสร้างคำที่มีพยัญชนะทั้งสามปรากฏตามลำดับเดียวกันกับในแผ่นป้ายทะเบียน ตัวอย่าง (เป็นภาษาสเปน):

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

ผู้ชนะคือผู้ที่ใช้จำนวนอักขระน้อยที่สุดอย่างที่คุณเห็นในตัวอย่างสุดท้าย

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดที่ได้รับรายการคำและชุดของพยัญชนะสามตัวและค้นหาคำที่สั้นที่สุดในรายการที่มีพยัญชนะสามตัวตามลำดับเดียวกัน สำหรับจุดประสงค์ของเกมนี้เคสไม่สำคัญ

  • อินพุตสำหรับรายการคำ (พารามิเตอร์แรก) จะเป็นอาร์เรย์ของstringประเภทภาษาของคุณ พารามิเตอร์ที่สอง (สามพยัญชนะ) stringจะเป็นอีก หากดีกว่าสำหรับภาษาของคุณให้ลองstringใช้ตัวอักษรสามตัวในรายการสุดท้ายของรายการพารามิเตอร์ทั้งหมด stringการส่งออกจะเป็นอีก
  • คำในรายการคำจะไม่ถูกประดิษฐ์หรือคำที่ไม่มีที่สิ้นสุดพวกเขาจะคำที่ปรากฏในพจนานุกรมมาตรฐานใด ๆ หากคุณต้องการขีด จำกัด สมมติว่าไม่มีคำใดในรายการคำที่มีความยาวเกิน 50 อักขระ
  • หากมีหลายคำที่มีความยาวเท่ากันซึ่งอาจเป็นคำตอบที่ถูกต้องคุณสามารถคืนหนึ่งคำใด ๆ ตรวจสอบให้แน่ใจว่าคุณส่งคืนคำเดียวหรือสตริงว่างถ้าไม่มีคำที่ตรงกับรูปแบบของพยัญชนะสามตัว
  • คุณสามารถทำซ้ำพยัญชนะในกลุ่มดังนั้นปัจจัยการผลิตที่ถูกต้องสำหรับสามพยัญชนะทั้งสองและFLRGGG
  • เสียงพยัญชนะภาษาสเปนเหมือนกันทุกประการกับภาษาอังกฤษด้วยการเพิ่ม "Ñ" เสียงสระที่เหมือนกันกับ adition ของเสียงสระเครียด: "áéíóúü" จะไม่มีเครื่องหมายประเภทอื่นเช่น "-" หรือ "'"
  • คุณสามารถสมมติว่ากรณีและปัญหาจะเหมือนกันทั้งในรายการคำและพยัญชนะทั้งสาม

หากคุณต้องการทดสอบอัลกอริทึมของคุณด้วยชุดคำศัพท์ภาษาสเปนจริง ๆ คุณสามารถดาวน์โหลดไฟล์ (15.9 MB) จาก Dropboxด้วยคำศัพท์กว่าล้านคำ

กรณีทดสอบ

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'

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดอาจช่วยให้ฉันชนะภรรยาของฉันได้เสมอ! :)


คำต่าง ๆ ในรายการคำรับประกันได้นานเท่าไหร่?
Neil

2
ในแผ่นป้ายทะเบียนจริงตัวอักษรQ ไม่ได้รับอนุญาตทั้ง; และWคือแม้ว่าจะไม่ใช่ตัวอักษรสเปนที่ถูกต้อง
Luis Mendo

2
เราขอสมมติคำในรายการและตัวอักษรสามตัวทั้งหมดในกรณีเดียวได้หรือไม่?
Jonathan Allan

1
@LuisMendo Wได้รับจดหมายสเปนตั้งแต่ 1969
walen

1
@ วาเลนนั่นคือเหตุผลที่ฉันพูดว่า "เหมาะสม" :-) มันมีอยู่ในสเปน แต่ก็รู้สึกต่างชาติ
Luis Mendo

คำตอบ:


7

05AB1E , 10 8 ไบต์

บันทึก 2 ไบต์ขอบคุณLeo

ʒæså}éR`

ลองออนไลน์!

คำอธิบาย

ʒ         # 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)

ฉันจะใช้headในตอนท้ายบันทึกไบต์ แต่ที่จะส่งออกรายการที่ว่างเปล่าถ้าไม่มีการแข่งขัน


3
3ù #keep only those of length 3ทำไมคุณต้องการสิ่งนี้
Leo

1
@Leo: ฉันไม่ได้โง่ที่ฉัน ขอบคุณ :)
Emigna

6

MATL , 30 29 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!


2
หมายเลขทะเบียนควรเป็นสตริงไม่ใช่อาร์เรย์ แต่คุณไม่ต้องการตัวปรับแต่ง
ติตัส

@ คงที่ตำแหน่ง !!
JörgHülsermann

You can suppose the case will always be the same in both the word list and the three consonants.- ไม่จำเป็นต้องใช้ตัวดัดแปลง regex คุณได้ลองwordwrapแทนjoin(str_split())?
ติตัส

@Titus ความคิดที่ดี
JörgHülsermann

5

เจลลี่ ,  12 11  10 ไบต์

ŒPċðÐfLÞḣ1

โปรแกรมเต็มรูปแบบที่ยอมรับรายการของอักขระตัวพิมพ์เล็ก (คำ) และรายการของอักขระตัวพิมพ์เล็ก (ตัวอักษร) และพิมพ์คำแรกของคำที่สั้นที่สุดซึ่งมีลำดับย่อยเท่ากับตัวอักษร (หรือไม่มีอะไรถ้าไม่มีอยู่) )

ลองออนไลน์!

อย่างไร?

Œ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
ถ้าฉันเข้าใจคำอธิบายของคุณถูกต้องคำนี้จะปฏิเสธคำเช่น "borracho" สำหรับลำดับตัวอักษรของ "brc" เนื่องจาก "brc" ไม่ใช่สตริงย่อยของ "brrc"
Leo

@Lo โอ้ใช่จับได้ดีฉันคิดว่ามันจะล้มเหลว ...
Jonathan Allan

@Leo - มันคงที่ (ตรวจสอบว่า "มีอยู่" สำหรับทั้งชุดคำศัพท์แต่ละคำ) แต่มันอาจจะไม่สมบูรณ์นัก ...
Jonathan Allan

5

Pyth - 22 21 19 12 11 ไบต์

h+f/yTQlDEk

-1 ขอบคุณ Maltysen

ใช้ 2 บรรทัดเป็นอินพุต ตัวที่ 1 คือสตริงตัวอักษร 3 ตัว (ตัวพิมพ์เล็ก) และตัวที่สองคือรายการตัวพิมพ์เล็กของคำ

ลองที่นี่

คำอธิบาย:

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)

โซลูชัน 19 ไบต์แบบเก่า:

h+olNf/-T"aeiou"QEk                       

@JonathanAllan: แก้ไขแล้ว! ขอบคุณสำหรับการชี้ให้เห็นว่า
Maria

1
@JanathanAllan: ดูเหมือนว่าเขาจะแก้ไขคำถามเพื่อชี้แจงว่ามันควรจะคืนสตริงว่างในกรณีนั้น ฉันแก้ไขคำตอบของฉันแล้ว
Maria

1
เรามีโอเปอเรเตอร์เรียงลำดับตามใน D ดังนั้นคุณสามารถแทนที่ olN ด้วย lD ได้
Maltysen

5

Brachylog v2, 11 ไบต์

tlᵒ∋.&h⊆.∨Ẹ

ลองออนไลน์!

ฟังก์ชั่นการส่ง (ลิงก์ TIO มีอาร์กิวเมนต์บรรทัดคำสั่งเพื่อเรียกใช้ฟังก์ชันราวกับว่าเป็นโปรแกรมเต็มรูปแบบ)

คำอธิบาย

เป็นเพียงการแปลโดยตรงของข้อกำหนดอีกครั้ง ...

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

จริงๆแล้วคุณสามารถตอบได้ด้วยh⊆.&t∋- การสลับลำดับการประเมินหมายความว่า Brachylog จะเลือกคำตอบที่สั้นที่สุดตามค่าเริ่มต้น (ตามข้อ จำกัด แรกที่เห็นคือซึ่งมี "shortest" ที่สะดวกกว่าเป็นการเริ่มต้นการเบรค) - แต่ในกรณีนั้น Brachylog ขั้นตอนวิธีการประเมินผลน่าเสียดายที่จะเข้าสู่วงวนไม่สิ้นสุดหากไม่พบคำตอบจริง ดังนั้นเกือบครึ่งหนึ่งของคำตอบก็คือการจัดการกรณีที่ไม่มีคำตอบที่เหมาะสม แม้กระทั่งในตอนนั้นlᵒไทเบรคเบรคจะแทนที่ (ซึ่งเป็นเทคนิคการเรียงลำดับการใช้งานตัวเลือกเริ่มต้นขององค์ประกอบที่ต้องการใกล้กับจุดเริ่มต้นของรายการ) มีเพียงสองไบต์ อีกสามคนมาจากความต้องการที่จะส่งออกสตริงว่างโดยเฉพาะเมื่อไม่พบเอาท์พุทเมื่อเทียบกับค่าเริ่มต้นของ Brachylog "ไม่มีการแก้ปัญหา" ค่ารักษาการณ์ (เพราะสุดท้าย.จะเป็นนัยถ้าเราไม่ต้องทำตามด้วย)

ที่น่าสนใจคือมีฟีเจอร์ที่เคยนำมาใช้ใน Brachylog ก่อนหน้านี้ซึ่งจะมีการบันทึกไบต์ไว้ที่นี่ เมื่อถึงจุดหนึ่งคุณสามารถแยกองค์ประกอบจากการโต้แย้งการป้อนข้อมูลที่ใช้?₁, ?₂ฯลฯ ไวยากรณ์; ที่จะช่วยให้คุณสามารถจัดเรียงโปรแกรมtlᵒ∋.⊇?₁∨Ẹใหม่ซึ่งมีขนาดเพียง 10 ไบต์ น่าเสียดายที่การใช้งานที่ใช้ไม่ได้ผลจริง (และทำให้โปรแกรมที่ใช้งานไม่ทำงานจำนวนมาก) ดังนั้นจึงถูกเปลี่ยนกลับ คุณสามารถนึกถึงโปรแกรมว่าเป็น "แนวคิด" ยาว 10 ไบต์ได้


4

Haskell 129 125 74 ไบต์

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

เครดิตไปที่ @nimi


1
คุณสามารถแทนที่ขวาสุดmapและfilterด้วยความเข้าใจในรายการ เมื่อคุณมีData.Listขอบเขตแล้วคุณสามารถใช้sortOn lengthและเลือกส่วนหัวเพื่อค้นหาองค์ประกอบที่มีความยาวน้อยที่สุด ในที่สุดทำyฟังก์ชั่นมัด ทั้งหมดนี้จะทำให้fและฟุ่มเฟือย:k l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
nimi

คุณถูก! ฉันเพิ่งเริ่มเล่นกอล์ฟ! ขอบคุณ!
Davide Spataro

1
หนึ่งที่เพิ่มเติม: ถ้าคุณเปลี่ยนการนำเข้าData.Listsคุณสามารถใช้argminแทนsortOnและบันทึก:!!0 มีฟังก์ชั่นที่ดีมากมายl#w=argmin length[...]Data.Lists
nimi

3

Perl, 53 ไบต์

48 รหัสไบต์ + -paF5

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

นี้ใช้ประโยชน์จากความจริงที่ว่ารายการหยันเข้าไปในm//ผู้ประกอบการใช้ประโยชน์จาก$"ตัวแปรที่เปลี่ยนแปลงสายป้อนเริ่มต้นจากpsrการที่จะถูกจับคู่แล้วสำหรับแต่ละคำเพิ่มเติมและจะถูกจัดเรียงบนp.*s.*rlength

ลองออนไลน์!


หากฉันแทรก "adsd" ลงในรายการของคุณโปรแกรมของคุณจะไม่สามารถค้นหาได้ อักขระตัวแรกที่พบไม่จำเป็นต้องเป็นตัวแรกในคำ
Charlie

@CarlosAlejo ข้อมูลที่ป้อนต้องขึ้นบรรทัดใหม่ต่อท้ายทำงานได้แล้ว: ลองออนไลน์! . แต่นั่นก็ทำให้ฉันระวังตัวในขณะที่<<<โอเปอเรเตอร์เสริมว่าสำหรับฉันที่บรรทัดคำสั่ง!
Dom Hastings

3

JavaScript (ES6), 77 75 72 ไบต์

จะใช้เวลา 3 พยัญชนะcและรายชื่อของคำในไวยากรณ์ความดีความชอบl (c)(l)อินพุตทั้งสองคาดว่าในกรณีเดียวกัน

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

กรณีทดสอบ


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))สำหรับ 72 ฉันคิดว่า
LarsW

@ LarsW แน่นอนขอบคุณ! แต่ฉันได้เลือกอีกวิธีหนึ่งเพื่อให้สอดคล้องกับกฎใหม่: หรือสตริงที่ว่างเปล่าถ้าไม่มีคำตรงกับรูปแบบของสามพยัญชนะ
Arnauld

3

R, 101 ไบต์

เล่นกอล์ฟเป็นครั้งแรก! ฉันแน่ใจว่าสิ่งนี้สามารถย่อตัวได้

รับสตริง x และเวกเตอร์อักขระ y ของอินพุตที่เป็นไปได้

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

ลองออนไลน์!

แก้ไข: รุ่นของฉันคือ 135 ขอบคุณ Scrooble สำหรับ -34!


1
ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่าตัวอย่างข้อมูลที่อินพุตอยู่ในตัวแปรฮาร์โค้ด คำตอบต้องเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่เรียกได้ คุณสามารถดูได้ที่นี้ (หรือคำตอบ R อื่น ๆ ) สำหรับวิธี I / O ที่เป็นไปได้
Martin Ender

2

เรติน่า 58 ไบต์

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

ลองออนไลน์! ใช้พยัญชนะสามตัวในหนึ่งบรรทัดจากนั้นรายการคำในบรรทัดถัดไปทั้งหมด คำอธิบาย: Oเรียงลำดับรายการ¶.+โดยไม่รวมบรรทัดแรกที่ป้อนคีย์#เป็นตัวเลข$ตาม$.&ความยาว จากนั้นจะทำการค้นหาคู่ที่มีสามพยัญชนะตามลำดับ หากมีเส้นที่เหมาะสมมากกว่าเส้นสุดท้ายคือสั้นที่สุดเส้นดังกล่าวจะกลายเป็นเอาต์พุตมิฉะนั้นเอาต์พุตจะว่างเปล่า ?-s:จะปิดชั่วคราวผลของการs`เพื่อให้มีเพียงหนึ่งบรรทัดจะถูกจับคู่


1
ฉันไม่สามารถตัดสินใจได้ว่าเป็นปุ่มท้องสามอันหรือหน้าอกสามอัน
Charlie

@CarlosAlejo คุณคิดว่า Eccentrica Gallumbits โดยบังเอิญหรือไม่?
Neil

ฉันคิดถึงคนต่างด้าวจาก Total Recall แต่ Eccentrica อาจเป็นตัวเลือก ... :)
Charlie

2
@CarlosAlejo Apparently Mary เป็นการแสดงความเคารพต่อ Eccentrica Gallumbits
Neil

1

Pip , 17 ไบต์

@:qJ`.*`N_FI#_SKg

รับรายการคำเป็นอาร์กิวเมนต์บรรทัดคำสั่งและพยัญชนะจาก stdin ลองออนไลน์!

คำอธิบาย

                   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 ไบต์

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 ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองออนไลน์

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 bytes: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


0

MATL , 28 27 26 ไบต์

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

ลองออนไลน์!

x- รับอินพุตโดยปริยาย (สตริงที่มีสามตัวอักษร) และลบทิ้ง รับการคัดลอกไปยังคลิปบอร์ด G ระดับ 1 โดยอัตโนมัติ (ส่วนนี้ได้รับแรงบันดาลใจจากคำตอบของ @Luis Mendo )

" - รับอินพุตที่สองโดยนัย (อาร์เรย์ของคำ) วนซ้ำไปเรื่อย ๆ

l - กด 1 เพื่อใช้ในภายหลัง

1G - ดันอินพุตแรก (พูดว่า 'psr')

@g - กดคำปัจจุบันเป็นอาร์เรย์

3XN - nchoosek - รับการรวมกันของ 3 ตัวอักษรจากคำว่า

Xm- ดูว่ารหัสแผ่นป้ายทะเบียน 'psr' เป็นหนึ่งในชุดค่าผสมเหล่านี้หรือไม่ ส่งคืน 0 สำหรับเท็จและ 1 สำหรับจริง

/- หาร 1 (ที่เราผลักดันไปก่อนหน้านี้) ด้วยผลลัพธ์นี้ เปลี่ยน 0s เป็นInf s

@gn - รับความยาวของคำปัจจุบัน

*- คูณความยาวตามผลการหาร ส่งคืนความยาวเหมือนเดิมเมื่อคำประกอบด้วย 3 ตัวอักษรมิฉะนั้นจะส่งกลับInf

v - เรียงผลลัพธ์เหล่านี้ให้เป็นแนวเดียว

] - วงปิด

&X< - รับดัชนีค่าต่ำสุดจากอาร์เรย์นั้นเช่นดัชนีซึ่งพบคำที่มีตัวอักษรและมีความยาวต่ำสุด

2G - กดอินพุตที่สองอีกครั้ง

w - นำดัชนีขั้นต่ำกลับมาที่ด้านบนสุดของสแต็ก

) - จัดทำดัชนีในอาร์เรย์ของคำด้วยดัชนีนาทีส่งคืนคำที่ถูกต้องพร้อมความยาวต่ำสุด

(เอาต์พุตโดยนัย)


เก่า:

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

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.