ค้นหาตัวย่อแบบเรียกซ้ำ


10

บทนำ

recursive ย่อเป็นตัวย่อที่มีหรือหมายถึงตัวเองตัวอย่างเช่น Fishอาจจะเป็น recursive ย่อสำหรับFish is shiny heroแจ้งให้ทราบว่ายังมีตัวย่อของตัวเอง อีกตัวอย่างหนึ่งคือ->Hi Hi iglooหรือแม้กระทั่งppcg paints->ppcg paints cool galaxies pouring acid into night time stars

ดังนั้นโดยทั่วไปประโยคเป็นตัวย่อซ้ำถ้าตัวอักษรตัวแรกของแต่ละคำสะกดคำหรือคำแรก


ท้าทาย

สร้างโปรแกรมที่ใช้สตริงที่มี 1 คำหรือมากกว่าโดยคั่นด้วยอักขระเว้นวรรคและแสดงตัวย่อแบบเรียกซ้ำหรือสตริงว่างถ้ามันเป็นไปไม่ได้ มันเป็นไปไม่ได้ที่จะทำให้ recursive ย่อสำหรับสตริงเช่นตัวอย่างเช่นppcg elephantเพราะคุณจะเริ่มต้นด้วยการpจากppcgนั้นเพิ่มว่าการย่อแล้วการจากe elephantแต่ตอนนี้เรามีความขัดแย้งเนื่องจากตัวย่อสะกดคาถา "pe .. " ซึ่งขัดแย้งกับ "pp .. " hiที่ยังเป็นกรณีที่มีการยกตัวอย่างเช่น คุณจะรับช่วงต่อhจากhiนี้ แต่ตอนนี้ประโยคจบลงแล้วและไม่มีตัวอักษรที่จะสะกดอีกต่อไปhiและเราเหลือแค่คำhที่ไม่ตรงกันhi. (สตริงต้องการจำนวนคำมากกว่าหรือเท่ากับจำนวนตัวอักษรในตัวย่อ)

อินพุตและเอาต์พุตไม่คำนึงถึงขนาดตัวพิมพ์


ข้อ จำกัด

  • สิ่งใดก็ตามที่ป้อนเข้าไปในโปรแกรมของคุณจะเป็นคำภาษาอังกฤษที่ถูกต้อง แต่คุณต้องแน่ใจว่าได้ส่งออกคำภาษาอังกฤษที่ถูกต้องเช่นกัน (คุณสามารถใช้ฐานข้อมูลหรือเก็บคำสำหรับตัวอักษร 26 ตัวแต่ละตัว)
  • มีช่องโหว่มาตรฐานและกฎ IO เริ่มต้นใช้งาน

กรณีทดสอบ

hi igloo -> hi
ppcg paints -> (impossible)
ppcg paints cool giraffes -> ppcg
ppcg paints cool galaxies pouring acid into night time stars -> ppcgpaints
ppcg paints cool galaxies pouring acid into night time -> ppcg
ppcg questions professional pool challengers greatly -> (impossible)
I -> I

เกณฑ์การให้คะแนน

นี่คือดังนั้นซอร์สโค้ดที่เล็กที่สุดในหน่วยไบต์จะเป็นผู้ชนะ


1
Q, q [kyoo] คำนาม, พหูพจน์ของ Q หรือ Qs, q's หรือ qs ตัวอักษรที่ 17 ของตัวอักษรภาษาอังกฤษพยัญชนะ เสียงพูดใด ๆ ที่แสดงโดยตัวอักษร Q หรือ q อย่างรวดเร็ว, acquit หรืออิรัก บางอย่างมีรูปร่างเหมือน Q.
l4m2

3
นอกจากนี้ฉันไม่คิดว่า ppcg เป็นคำในพจนานุกรม
l4m2

1
ตกลงกรณีทดสอบข้อใดข้อหนึ่งไม่ได้เกิดขึ้นอย่างที่ฉันคาดไว้ เพียงเพื่อให้แน่ใจว่าพวกเราทั้งคู่ไม่ได้ทำผิดพลาดppcg paints cool galaxies pouring acid into night timeจะเป็น "ppcgpaint" เมื่อถูกทำให้เป็นตัวย่อ แต่ผลลัพธ์ควรจะเป็นppcgแม้ว่ามันจะเป็นเพียงการแข่งขันบางส่วน?
Kamil Drakari

1
เนื่องจากคำตอบปัจจุบันทั้งหมดใช้ตัวเลือกแรก ("ค้นหาตัวย่อ") และตัวเลือก "ค้นหาประโยค" นั้นมีความซับซ้อนมากขึ้น (ดังนั้นจึงไม่มีวิธีการแข่งขันกับตัวเลือกแรก - คุณต้องมีรายการคำศัพท์เพื่อเริ่มต้น) ฉันอยากจะแนะนำให้ลบมันออกจากความท้าทายนี้และทำให้มันเป็นคำถามของตัวเอง
Paŭlo Ebermann

2
@ PaŭloEbermannเอาล่ะฉันลบมันออก
FireCubez

คำตอบ:


5

Japt , 13 ไบต์

¸
mά
VøUÎ ©V

ลองออนไลน์!



1
สิ่งนี้ล้มเหลวในppcg paints cool galaxies pouring acid into night time starsกรณีทดสอบ
Kamil Drakari

นี่คือรุ่นที่ใช้งานได้สำหรับกรณีทดสอบ แต่ไม่ได้เล่นกอล์ฟ
Kamil Drakari

โซลูชันขนาด 13 ไบต์ก่อนหน้าของฉันถูกต้อง Dx \
Luis felipe De jesus Munoz

รุ่นปัจจุบันเพียงตรวจสอบว่าตัวย่อมีคำแรกซึ่งส่งผลให้ปัญหาใหม่บางอย่าง
Kamil Drakari

5

05AB1E , 16 ไบต์

ð¡©ηʒJ®€нJηså}θJ

ลองออนไลน์!


1
ทำไมมันเปลี่ยนเป็นð¡แทนที่จะ#แก้ไขครั้งล่าสุดของคุณ? กรณีทดสอบพิเศษบางอย่างที่ฉันไม่ได้คำนึงถึง?
Kevin Cruijssen

@KevinCruijssen: เพราะ#จะล้มเหลวในการป้อนข้อมูลคำเดียวเอาท์พุทแทนที่จะเป็นสตริงที่ว่างเปล่า
Emigna

ใช่แล้วนั่นแหละ ฉันจำได้ว่าถามสิ่งที่คล้ายกันมาก่อน ฉันยังคิดว่า#ควรทำหน้าที่เหมือนกันð¡.. มีกรณีการใช้งานที่คุณสามารถคิดได้ว่าคุณต้องการแยกสตริงในช่องว่างอย่างไร แต่ถ้ามันไม่มีช่องว่างควรเว้นสตริงไว้ (แทนที่จะเป็นสตริง ถูกห่อในรายการ) หรือไม่ คนอื่นอ่านข้อความนี้ FYI: การใช้#(แยกบนช่องว่าง) บนสตริงโดยไม่มีช่องว่างส่งผลให้เกิดสตริงตามที่เป็น (เช่น"test" -> "test") การใช้ð¡(แยกบนช่องว่าง) บนสตริงโดยไม่มีช่องว่างส่งผลให้สตริงถูกห่อในรายการ (เช่น"test" -> ["test"])
Kevin Cruijssen

@KevinCruijssen: ฉันคิดว่าส่วนใหญ่มาจาก#การใช้เป็นquit if true(ซึ่งเป็นหน้าที่หลักของมัน) หาก#ส่งคืนค่าเท็จคุณอาจไม่ต้องการให้มีการตรวจสอบค่าที่จะห่อในรายการทิ้งไว้ในสแต็ก
Emigna

1
@KamilDrakari: ทำงานตอนนี้แม้ว่า
Emigna

2

Haskell, 51 48 ไบต์

แก้ไข: -3 ไบต์ขอบคุณ @xnor

(\w->[r|p<-scanl1(++)w,map(!!0)w==p,r<-p]).words

ค้นหาคำย่อ

ลองออนไลน์!

\w->            .words -- let 'w' be the input list split into words
   p<-scanl1(++)w      -- loop 'p' through the list starting with the first word
                       --  and appending the next words one by one, e.g.
                       --  "Fish","is","shiny","hero" -> "Fish","Fishis","Fishisshiny","Fishisshinyhero"
     ,map(!!0)w==p     -- if the word made out of the first characters of the
                       --  words of 'w' equal 'p'
  [r|   r<-p]          -- return the letters of 'p' - if the check before
                       --  never evaluates to True then no letters, i.e. the
                       --  the empty string is returned

เนื่องจากคุณไม่ได้ใช้xงานการเขียน(\w-> ...).wordsจะสั้นลง
xnor

2

Perl 6 , 50 42 58 49 ไบต์

-9 ไบต์ขอบคุณ nwellnhof

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}

ลองออนไลน์!

ตัวเลือกแรก ฉันใช้ประโยชน์จากความจริงordเพียงส่งกลับค่าลำดับของตัวอักษรตัวแรกของสตริงในขณะที่chrsใช้รายการของ ords และส่งกลับสตริง หรือ regex จากคำตอบของ moonheart:(สั้น สำหรับการอ้างอิงคำตอบก่อนหน้านี้.words>>.ord.chrsแทน[~] m:g/<<./

คำอธิบาย:

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}
{                                               } # Anonymous code block
  first  # Find the first 
                                [R,] [\~] .words  # Of the reverse of the triangular joined words
         {                    }  # That matches:
          m:g/   /   # Match all from the original string
              <<.    # Single letters after a word boundary
                  .join    # Joined
                       ~~/^$^a/   # And starts with the given word
 ~  # And stringify Nil to an empty string

คุณไม่จำเป็นต้องส่งออก "IMPOSSIBLE" ตอนนี้
FireCubez

@Jo King ฉันสามารถทำ regexes แต่สำหรับชีวิตของฉันฉันไม่สามารถคิดกับผู้ประกอบการทั้งหมด ฉันลืมไปว่ามีโอเปอเรเตอร์ x อยู่เช่น: P
moonheart08

1

เรติน่า 0.8.2 , 60 ไบต์

^
$'¶
\G(\w)\w* ?
$1
+`^(.+)(\w.*¶\1 )
$1 $2
!`^(.+)(?=¶\1 )

ลองออนไลน์! ค้นหาคำย่อแบบเรียกซ้ำหากมี คำอธิบาย:

^
$'¶

ทำสำเนาอินพุต

\G(\w)\w* ?
$1

ลดคำในบรรทัดแรกเป็นตัวอักษรเริ่มต้น

+`^(.+)(\w.*¶\1 )
$1 $2

แทรกช่องว่างเพื่อให้ตรงกับคำต้นฉบับถ้าเป็นไปได้

!`^(.+)(?=¶\1 )

เอาท์พุทบรรทัดแรกถ้ามันเป็นคำนำหน้าของบรรทัดที่สอง


สำหรับ ppcg paints เอาต์พุตไม่ถูกต้องไม่ควรส่งออกอะไรเลยเนื่องจากppมีเพียงส่วนหนึ่งของคำแรกที่สะกดแทนคำทั้งหมด
FireCubez

@FireCubez ขออภัยฉันใช้คำถามรุ่นเก่ากว่า
Neil

1

Perl 6 , 56 ไบต์

$!=[~] m:g{<<.};say $! if m:g{<<\w+}.map({$_ eq $!}).any

ลองออนไลน์!

ก่อนหน้า regexes ทำให้ฉันสับสนและใช้ไม่ได้ ทันใดนั้นฉันก็เข้าใจพวกเขาอย่างสมบูรณ์แบบ เกิดอะไรขึ้นกับฉัน: พี

เติมเต็มทางเลือก 1


น่าเศร้าที่ฉันยังอยู่บนเวทีที่ regexes เป็นเพียงความบ้าคลั่ง น่าเสียดายที่การppcgpaintsทดสอบนี้ล้มเหลวมิฉะนั้นฉันก็จะแนะนำบางอย่างเช่น$!∈.wordsเงื่อนไข if
Jo King

1

K (ngn / k) , 40 ไบต์

ตัวเลือกแรก:

{$[1=#:x;x;$[(*:t)~,/*:'t:" "\x;*:t;`]]}

ลองออนไลน์!


ตัวเลือกใดจาก 2 ตัวเลือกนี้ใช้งานได้?
FireCubez

ตัวย่อแรกส่งออกจากอินพุตสตริง ฉันจะแก้ไขโพสต์ของฉันเพื่อชี้แจง
Thaufeki

1

สนิม 155 ลองออนไลน์!

ที่เลือก: ปัญหา 1: การหาคำย่อ

type S=String;fn f(t:&str)->S{let l=t.to_lowercase();let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(w.as_str()){w}else{S::new()}}

Ungolfed เพียงเล็กน้อย:

fn f(t: &str) -> String {
    let l = t.to_lowercase();
    let w = l.split(' ').fold(String::new(), |a, b| a + &b[0..1]) + " ";
    if (l + " ").contains(w.as_str()) {
        w
    } else {
        String::new()
    }
}

หรือถ้าเราสามารถสมมติว่าอินพุตเป็นตัวพิมพ์เล็กทั้งหมดเพียง 130:

type S=String;fn f(l:S)->S{let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(&w.as_str()){w}else{S::new()}}

โปรแกรมนี้มีตัวเลือกใดบ้าง 2 ข้อ
FireCubez

@FireCubez อัปเดตแล้ว
Hannes Karppila

1

เยลลี่ขนาด 9 ไบต์

Ḳµ;\fZḢWƊ

การพิมพ์โปรแกรมเต็มรูปแบบตัวย่อแบบเรียกซ้ำหากเป็นไปได้

ลองออนไลน์!

อย่างไร?

Ḳµ;\fZḢWƊ - Main Link: list of characters
Ḳ         - split at space (let's call this v)
 µ        - start a new monadic chain (i.e. f(v)):
   \      - cumulative reduce v with:
  ;       -   concatenation -> [v(1), v(1);v(2), v(1);v(2);v(3); ...]
        Ɗ - last three links as a monad (i.e. f(v)):
     Z    -   transpose -> [[v(1)[1], v(2)[1], ...],[v(1)[1],v(2)[2],...],...]
      Ḣ   -   head -> [v(1)[1], v(2)[1], ...] ... i.e. 'the potential abbreviation'
       W  -   wrap in a list -> ['the potential abbreviation']
    f     - filter discard those from the left list that are not in the right list
          - implicit print -- a list of length 0 prints nothing
          -                   while a list of a single item prints that item

คุณพิมพ์ "คำแรก" หมายความว่าอย่างไร มันต้องการหาคำย่อถ้ามีอยู่มันทำอย่างนั้นเหรอ?
FireCubez

ล้มเหลวในการ "ppcg วาดกาแลคซีเย็น ๆ เทกรดลงในท้องฟ้าไม่ใช่" ควรพิมพ์ "ppcg paints" หรือ "ppcgpaints"
FireCubez

โอ้ฉันพลาดข้อกำหนดที่อยู่ติดกัน :(
Jonathan Allan

แก้ไขมันขึ้นเพื่อตอบสนองความต้องการนี้
Jonathan Allan

1

JavaScript [ES6], 74 ไบต์

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

สร้างการแสดงออกปกติเพื่อให้ตรงกับ ดูตัวอย่างในรหัส

กรณีทดสอบทั้งหมด:

let f=

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

console.log(f('hi igloo'))
// 'hi'.match('(hi(igloo)?)?')[0] == 'hi'

console.log(f('ppcg paints'))
// 'pp'.match('(ppcg(paints)?)?')[0] == ''

console.log(f('ppcg paints cool giraffes'))
// 'ppcg'.match('(ppcg(paints(cool(giraffes)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg paints cool galaxies pouring acid into night time stars'))
// 'ppcgpaints'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time(stars)?)?)?)?)?)?)?)?)?)?')[0] == 'ppcgpaints'

console.log(f('ppcg paints cool galaxies pouring acid into night time'))
// 'ppcgpaint'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time)?)?)?)?)?)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg questions professional pool challengers greatly'))
// 'pqppcg'.match('(ppcg(questions(professional(pool(challengers(greatly)?)?)?)?)?)?')[0] == ''

console.log(f('I'))
// 'I'.match('(I)?')[0] == 'I'

console.log(f('increase i'))
// 'ii'.match('(increase(i)?)?')[0] == ''

console.log(f('i increase'))
// 'ii'.match('(i(increase)?)?')[0] == 'i'


ล้มเหลวในincrease i
l4m2

@ l4m2 แก้ไขแล้ว
Rick Hitchcock

0

Python 2 , 106 ไบต์

ตัวเลือกแรก - การหาตัวย่อแบบเรียกซ้ำ
ส่งคืนผลลัพธ์ในรายการ

I=input().split()
print[' '.join(I[:i])for i in range(1,-~len(I))if[j[0]for j in I]==list(''.join(I[:i]))]

ลองออนไลน์!

Python 2 , 120 ไบต์

ตัวเลือกแรก - การหาตัวย่อแบบเรียกซ้ำ

def F(I,a=[],r=''):
 for j in I.split():
  a+=j,
  if list(''.join(a))==[i[0]for i in I.split()]:r=' '.join(a)
 return r

ลองออนไลน์!


คุณไม่จำเป็นต้องแสดงผล "IMPOSSIBLE" ตามคำขอของ @JoKing ซึ่งอาจทำให้จำนวนไบต์ของคุณลดลง
FireCubez

ตัวอักษรเดียวเช่น 'I' ไม่ทำงานควรส่งตัวอักษรตัวเดียว
FireCubez

แก้ไข @FireCubez
Dead Possum

0

Javascript, 71 ไบต์

วิธีที่ 1

l=s=>{p=s.split(' ');k=p.reduce((r,x)=>r+x[0],'');return k==p[0]?k:''}

Ungolfed:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • แยกสตริงตามช่องว่าง
  • สร้างสตริงใหม่โดยใช้อักขระตัวแรกจากแต่ละคำ
  • เปรียบเทียบกับคำแรก



0

สกาลา, 76 ไบต์

คำตอบสำหรับกรณีง่าย ๆ (ตัวย่อที่ไม่มีช่องว่าง)

def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""} 

สกาลา144 ไบต์ 100 ไบต์ (ดูวิธีแก้ปัญหาโดย ASCII-only ในความคิดเห็น)

def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}

ทดสอบใน REPL

scala> def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""}
$up: (s: String)String

scala> ^("hi igloo")
res12: String = hi

scala> ^("ppcg paints cool giraffes")
res13: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res14: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res15: String = ""

scala>

scala> def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}
$up: (s: String)String

scala> ^("hi igloo")
res16: String = hi

scala> ^("ppcg paints cool giraffes")
res17: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res18: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res19: String = ppcgpaints


สามารถ:::ถูกแทนที่ด้วย++? นอกจากนี้List[String]-> Seq[Any]?
ASCII เท่านั้นเท่านั้น


@ ASCII เท่านั้นเท่! วิธีแก้ปัญหานี้ชนะ Python :)
ดร. วายปัญญา

ลองเพิ่มรหัสบ้างไหม? IMO เป็นเรื่องแปลก ๆ ที่ได้เห็นจำนวน bytec โดยไม่ได้เห็นวิธีการแก้ปัญหา
ASCII เท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.