Temukan akronim rekursif

10

pengantar

Sebuah singkatan rekursif adalah singkatan yang berisi atau mengacu pada itu sendiri, misalnya: Fishbisa menjadi singkatan rekursif Fish is shiny hero, melihat bagaimana yang juga berisi singkatan itu sendiri. Contoh lain adalah Hi-> Hi igloo. Atau bahkan ppcg paints->ppcg paints cool galaxies pouring acid into night time stars

Jadi pada dasarnya, sebuah kalimat adalah singkatan rekursif jika huruf pertama dari masing-masing kata mengeja kata pertama atau kata-kata.


Tantangan

Buat program yang mengambil string 1 atau lebih kata yang dipisahkan oleh karakter spasi, dan menghasilkan akronim rekursif, atau string kosong jika tidak mungkin. Tidak mungkin membuat akronim rekursif untuk string seperti, misalnya, ppcg elephantkarena Anda akan mulai dengan mengambil pdari ppcglalu menambahkan itu ke akronim, kemudian mengambil edari elephant. Tetapi sekarang kita memiliki kontradiksi, karena akronim saat ini menjabarkan "pe ..", yang bertentangan dengan "pp ..". Itu juga halnya dengan, misalnya hi,. Anda akan mengambil hdari hi, tetapi hukumannya sudah berakhir dan tidak ada lagi surat untuk dijabarkan hidan kami hanya tinggal hyang tidak cocokhi. (String membutuhkan jumlah kata lebih dari atau sama dengan jumlah huruf dalam akronim)

Input dan output tidak peka huruf besar-kecil


Batasan

  • Apa pun yang dimasukkan ke dalam program Anda akan menjadi kata-kata bahasa Inggris yang valid. Tetapi Anda harus memastikan untuk menghasilkan kata-kata bahasa Inggris yang valid juga (Anda dapat menggunakan database atau hanya menyimpan kata untuk masing-masing dari 26 huruf)
  • Celah standar dan aturan IO standar berlaku

Uji Kasus

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

Mencetak gol

Ini adalah , jadi kode sumber terkecil dalam byte menang

FireCubez
sumber
1
Q, q [kyoo] kata benda, jamak Q atau Qs, q's atau qs. huruf ke-17 dari alfabet bahasa Inggris, konsonan. setiap suara yang diucapkan diwakili oleh huruf Q atau q, seperti dalam cepat, bebas, atau Irak. sesuatu yang berbentuk Q.
l4m2
3
Juga saya tidak berpikir ppcg adalah kata dalam kamus
l4m2
1
Oke, salah satu test case itu tidak seperti yang saya harapkan. Hanya untuk memastikan tidak satu pun dari kita yang membuat kesalahan ppcg paints cool galaxies pouring acid into night timeakan menjadi "ppcgpaint" ketika dibuat menjadi akronim, tetapi hasilnya harus ppcgmeskipun itu hanya sebagian cocok?
Kamil Drakari
1
Karena semua solusi saat ini mengambil opsi pertama ("find acronym"), dan opsi "find kalimat" jauh lebih rumit (jadi tidak ada cara untuk bersaing dengan yang pertama - Anda perlu daftar kata, untuk mulai dengan), Saya akan menyarankan untuk menghapusnya dari tantangan ini dan membuatnya menjadi pertanyaan sendiri.
Paŭlo Ebermann
2
@ PaŭloEbermann Baiklah, saya menghapusnya
FireCubez

Jawaban:

5

Japt , 13 byte

¸
mά
VøUÎ ©V

Cobalah online!

Luis felipe De jesus Munoz
sumber
11 byte
Shaggy
1
Ini gagal pada ppcg paints cool galaxies pouring acid into night time starskasus uji
Kamil Drakari
ini adalah versi yang berfungsi untuk test case itu, tetapi ini bukan
golf
Solusi 13 byte saya sebelumnya benar Dx \
Luis felipe De jesus Munoz
Versi saat ini hanya memeriksa bahwa akronim itu mengandung kata pertama, yang menghasilkan beberapa masalah baru
Kamil Drakari
5

05AB1E , 16 byte

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

Cobalah online!

Emigna
sumber
1
Mengapa itu berubah menjadi ð¡bukan #di edit terakhir Anda? Beberapa kasus uji khusus yang tidak saya perhitungkan?
Kevin Cruijssen
@KevinCruijssen: Karena #akan gagal untuk input kata tunggal menghasilkan input daripada string kosong.
Emigna
Ah ya, itu dia. Saya ingat pernah menanyakan hal serupa sebelumnya. Saya masih berpikir #harus bertindak sama seperti ð¡.. Apakah ada use-case Anda dapat memikirkan di mana Anda ingin membagi string pada spasi, tetapi jika tidak mengandung spasi, itu harus tetap menjadi string (bukan string) terbungkus daftar)? Orang lain membaca ini; FYI: Menggunakan #(split on space) pada string tanpa spasi menghasilkan string apa adanya (yaitu "test" -> "test"). Menggunakan ð¡(split on space) pada string tanpa spasi menghasilkan string yang terbungkus dalam daftar (yaitu "test" -> ["test"]).
Kevin Cruijssen
@KevinCruijssen: Saya pikir ini terutama karena #juga digunakan sebagai quit if true(yang merupakan fungsi utamanya). Jika #kembali salah, Anda mungkin tidak ingin nilai diperiksa untuk dibungkus dalam daftar, dibiarkan di tumpukan.
Emigna
1
@ KamilDrakari: Bekerja sekarang.
Emigna
2

Haskell, 51 48 byte

Edit: -3 byte terima kasih kepada @xnor.

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

Menemukan akronim.

Cobalah online!

\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
nimi
sumber
Karena Anda tidak menggunakan x, menulis (\w-> ...).wordsakan lebih pendek.
xnor
2

Perl 6 , 50 42 58 49 byte

-9 byte terima kasih kepada nwellnhof

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

Cobalah online!

Pilihan pertama. Saya mengeksploitasi fakta bahwa ordhanya mengembalikan nilai ordinal dari huruf pertama dari sebuah string, sementara chrsmengambil daftar ords dan mengembalikan sebuah string. Atau regex dari jawaban moonheart lebih pendek :(. Untuk referensi, jawaban sebelumnya .words>>.ord.chrsbukan[~] m:g/<<./

Penjelasan:

{~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
Jo King
sumber
Anda tidak diharuskan untuk menampilkan "IMPOSSIBLE" sekarang
FireCubez
@ Jo King saya dapat melakukan regex, tetapi untuk kehidupan saya, saya tidak bisa berpikir dengan semua operator. Saya selalu lupa operator x ada, misalnya: P
moonheart08
1

Retina 0.8.2 , 60 byte

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

Cobalah online! Menemukan akronim rekursif, jika ada. Penjelasan:

^
$'¶

Gandakan input.

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

Kurangi kata-kata di baris pertama menjadi huruf awal.

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

Masukkan spasi untuk mencocokkan kata-kata aslinya, jika mungkin.

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

Keluarkan baris pertama jika merupakan awalan dari baris kedua.

Neil
sumber
Untuk cat ppcg, output tidak valid, seharusnya tidak menghasilkan apa-apa karena pphanya mengeja sebagian dari kata pertama, alih-alih semuanya
FireCubez
@FireCubez Maaf, saya mengerjakan versi pertanyaan yang lebih lama.
Neil
1

Perl 6 , 56 byte

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

Cobalah online!

Regex sebelumnya membingungkan dan tidak bisa digunakan untuk saya. Tiba-tiba saya mengerti mereka dengan sempurna. Apa yang terjadi pada saya: P

Memenuhi pilihan 1.

moonheart08
sumber
Sedihnya, saya masih pada tahap di mana regex benar-benar gila. Sayangnya, ini gagal ppcgpaintstes, kalau tidak saya akan menyarankan sesuatu seperti $!∈.wordsuntuk kondisi if
Jo King
1

K (ngn / k) , 40 byte

Pilihan pertama:

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

Cobalah online!

Thaufeki
sumber
Manakah dari 2 opsi ini yang berfungsi?
FireCubez
Yang pertama, output akronim dari input string. Saya akan mengedit posting saya untuk memperjelas
Thaufeki
1

Rust, 155, coba online!

Terpilih: Masalah 1: Menemukan akronim

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()}}

Tidak disatukan, hanya sedikit:

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()
    }
}

Atau jika kita dapat berasumsi bahwa input semuanya huruf kecil, hanya 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()}}
Hannes Karppila
sumber
Manakah dari 2 pilihan yang dilakukan program ini?
FireCubez
@FireCubez Diperbarui.
Hannes Karppila
1

Jelly , 9 byte

Ḳµ;\fZḢWƊ

Program penuh mencetak singkatan rekursif jika memungkinkan.

Cobalah online!

Bagaimana?

Ḳµ;\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
Jonathan Allan
sumber
Apa yang Anda maksud dengan "cetak kata pertama"? Perlu menemukan akronim jika ada, apakah itu melakukannya?
FireCubez
Gagal untuk "cat ppcg mendinginkan galaksi yang menuangkan asam ke bukan langit", harus mencetak "cat ppcg" atau "ppcgpaints"
FireCubez
Oh, saya melewatkan persyaratan kata-kata yang bersebelahan :(
Jonathan Allan
Memperbaikinya untuk memenuhi persyaratan ini.
Jonathan Allan
1

JavaScript [ES6], 74 byte

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

Membuat ekspresi reguler untuk dicocokkan. Lihat contoh dalam kode.

Semua kasus uji:

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'

Rick Hitchcock
sumber
Gagalincrease i
14m2
@ l4m2, sekarang sudah diperbaiki.
Rick Hitchcock
0

Python 2 , 106 byte

Opsi pertama - menemukan akronim rekursif.
Mengembalikan hasil dalam daftar.

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

Cobalah online!

Python 2 , 120 byte

Opsi pertama - menemukan akronim rekursif.

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

Cobalah online!

Possum Mati
sumber
Anda tidak diharuskan untuk menampilkan "IMPOSSIBLE" sesuai permintaan @JoKing, yang dapat menurunkan jumlah byte Anda
FireCubez
Huruf tunggal seperti 'Saya' tidak berfungsi, seharusnya menghasilkan huruf tunggal
FireCubez
@FireCubez diperbaiki
Dead Possum
0

Javascript, 71 byte

Pendekatan 1

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

Tidak Disatukan:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • Pisahkan string dengan spasi.
  • Buat string baru dengan mengambil karakter pertama dari setiap kata.
  • Bandingkan dengan kata pertama.
alpheus
sumber
0

Python 2 , 109 byte

def f(s,J=''.join):s=s.split();return[J(s[:i])for i in range(len(s)+1)if J(zip(*s)[0]).find(J(s[:i]))==0][-1]

Cobalah online!

Chas Brown
sumber
0

Scala, 76 byte

Solusi untuk kasing sederhana (akronim tanpa spasi putih)

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

Scala, 144 byte 100 byte (lihat solusi oleh ASCII-satunya di komentar)

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

Tes dalam 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
Dr Y Wit
sumber
Bisakah :::diganti ++? Juga, List[String]-> Seq[Any]?
ASCII
1
100?
ASCII
@ Khusus ASCII, keren! Solusi ini mengalahkan Python. :)
Dr Y Wit
Mau menambahkan kode kapan-kapan? IMO agak aneh melihat bytecount tanpa melihat solusinya
ASCII-only