Trouver un acronyme récursif

10

introduction

Un acronyme récursif est un acronyme qui contient ou se réfère à lui-même, par exemple: Fishpourrait être un acronyme récursif pour Fish is shiny hero, notez comment il contient également l'acronyme lui-même. Un autre exemple est Hi-> Hi igloo. Ou même ppcg paints->ppcg paints cool galaxies pouring acid into night time stars

Donc, fondamentalement, une phrase est un acronyme récursif si les premières lettres de chacun des mots épelent le ou les premiers mots.


Défi

Créez un programme qui prend une chaîne de 1 ou plusieurs mots séparés par un caractère espace et génère un acronyme récursif ou une chaîne vide si cela est impossible. Il est impossible de faire un acronyme récursif pour une chaîne comme, par exemple, ppcg elephantparce que vous commenceriez par prendre le pfrom ppcgpuis en ajoutant cela à l'acronyme, puis en prenant le efrom elephant. Mais maintenant nous avons une contradiction, puisque l'acronyme définit actuellement "pe ..", ce qui est en conflit avec "pp ..". C'est également le cas, par exemple hi,. Vous prendriez le hde hi, mais la phrase est maintenant terminée et il n'y a plus de lettres à épeler hiet il ne nous reste plus que hce qui ne correspond pashi. (La chaîne a besoin d'un nombre de mots supérieur ou égal au nombre de lettres de l'acronyme)

L'entrée et la sortie ne sont pas sensibles à la casse


Restrictions

  • Tout ce qui est entré dans votre programme sera un mot anglais valide. Mais vous devez également vous assurer de générer des mots anglais valides (vous pouvez utiliser une base de données ou simplement stocker un mot pour chacune des 26 lettres)
  • Les failles standard et les règles d'E / S par défaut s'appliquent

Cas de test

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

Notation

C'est le , donc le plus petit code source en octets gagne

FireCubez
la source
1
Q, q [kyoo] nom, pluriel Q's ou Qs, q's ou qs. la 17e lettre de l'alphabet anglais, une consonne. tout son parlé représenté par la lettre Q ou q, comme dans quick, acquit ou Iraq. quelque chose ayant la forme d'un Q.
l4m2
3
De plus, je ne pense pas que ppcg soit un mot dans le dictionnaire
l4m2
1
D'accord, l'un de ces cas de test ne s'est pas déroulé comme je m'y attendais. Juste pour être sûr qu'aucun de nous ne commet une erreur, ce ppcg paints cool galaxies pouring acid into night timeserait "ppcgpaint" lorsqu'il est transformé en acronyme, mais la sortie devrait être ppcgmême si ce n'est qu'une correspondance partielle?
Kamil Drakari
1
Comme toutes les solutions actuelles prennent la première option ("trouver l'acronyme"), et l'option "trouver la phrase" est beaucoup plus compliquée (donc aucun moyen d'être compétitif avec la première - vous avez besoin d'une liste de mots, pour commencer), Je suggère de le retirer de ce défi et d'en faire sa propre question.
Paŭlo Ebermann
2
@ PaŭloEbermann D'accord, je l'ai supprimé
FireCubez

Réponses:

5

Japt , 13 octets

¸
mά
VøUÎ ©V

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
11 octets
Shaggy
1
Cela échoue sur le ppcg paints cool galaxies pouring acid into night time starscas de test
Kamil Drakari
voici une version qui fonctionne pour ce cas de test, mais ce n'est pas du golf
Kamil Drakari
Ma solution précédente de 13 octets était correcte Dx \
Luis felipe De jesus Munoz
La version actuelle vérifie simplement que l'acronyme contient le premier mot, ce qui entraîne de nouveaux problèmes
Kamil Drakari
5

05AB1E , 16 octets

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

Essayez-le en ligne!

Emigna
la source
1
Pourquoi a-t-il changé au ð¡lieu de #lors de votre dernière modification? Certains cas de test spéciaux que je ne prends pas en compte?
Kevin Cruijssen du
@KevinCruijssen: Parce #que l'échec de l'entrée d'un seul mot produirait l'entrée au lieu d'une chaîne vide.
Emigna
Ah ouais, c'était ça. Je me souviens avoir déjà demandé quelque chose de similaire. Je pense toujours que #devrait agir de la même manière que ð¡. enveloppé dans une liste)? D'autres personnes lisant ceci; FYI: L'utilisation de #(split on space) sur une chaîne sans espaces entraîne la chaîne telle quelle (c. "test" -> "test"-à-d.). L'utilisation de ð¡(fractionner sur l'espace) sur une chaîne sans espaces entraîne la chaîne encapsulée dans une liste (c'est-à-dire "test" -> ["test"]).
Kevin Cruijssen du
@KevinCruijssen: Je pense que c'est principalement dû au fait qu'il est #également utilisé comme quit if true(ce qui est sa fonction principale). Si #renvoyé faux, vous ne voudriez probablement pas que la valeur vérifiée soit encapsulée dans une liste, laissée sur la pile.
Emigna
1
@KamilDrakari: fonctionne maintenant cependant.
Emigna
2

Haskell, 51 48 octets

Edit: -3 octets grâce à @xnor.

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

Trouve l'acronyme.

Essayez-le en ligne!

\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
la source
Puisque vous n'utilisez pas x, la composition (\w-> ...).wordsserait plus courte.
xnor
2

Perl 6 , 50 42 58 49 octets

-9 octets grâce à nwellnhof

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

Essayez-le en ligne!

Première option. J'exploite le fait que le ordseul retourne la valeur ordinale de la première lettre d'une chaîne, alors qu'il chrsprend une liste d'ordres et renvoie une chaîne. Ou l'expression rationnelle de la réponse de Moonheart est plus courte :(. Pour référence, la réponse précédente était .words>>.ord.chrsau lieu de[~] m:g/<<./

Explication:

{~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
la source
Vous n'êtes pas obligé de sortir "IMPOSSIBLE" maintenant
FireCubez
@Jo King Je peux faire des regexes, mais pour la vie de moi, je n'arrive pas à penser avec tous les opérateurs.
J'oublie
1

Retina 0.8.2 , 60 octets

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

Essayez-le en ligne! Recherche l'acronyme récursif, le cas échéant. Explication:

^
$'¶

Dupliquez l'entrée.

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

Réduisez les mots de la première ligne à leurs lettres initiales.

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

Insérez des espaces pour faire correspondre les mots d'origine, si possible.

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

Sortez la première ligne si c'est un préfixe de la deuxième ligne.

Neil
la source
Pour les peintures ppcg, la sortie n'est pas valide, elle ne devrait rien produire car ppelle
n'épelle
@FireCubez Désolé, je travaillais sur une ancienne version de la question.
Neil
1

Perl 6 , 56 octets

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

Essayez-le en ligne!

Auparavant, les regex étaient déroutantes et inutilisables pour moi. Du coup je les comprends parfaitement. Ce qui m'est arrivé: P

Répond au choix 1.

moonheart08
la source
Malheureusement, je suis encore au stade où les regex sont simplement de la folie. Malheureusement, cela échoue au ppcgpaintstest, sinon j'aurais suggéré quelque chose comme $!∈.wordspour la condition if
Jo King
1

K (ngn / k) , 40 octets

Première option:

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

Essayez-le en ligne!

Thaufeki
la source
Sur laquelle des 2 options cela fonctionne-t-il?
FireCubez
Le premier, sort l'acronyme de l'entrée de chaîne. Je vais modifier mon article pour clarifier
Thaufeki
1

Rust, 155 ans, essayez-le en ligne!

Sélectionné: Problème 1: Recherche d'un acronyme

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, juste un peu:

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

Ou si nous pouvons supposer que l'entrée est entièrement en minuscules, seulement 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
la source
Lequel des 2 choix ce programme fait-il?
FireCubez
@FireCubez Mis à jour.
Hannes Karppila
1

Gelée , 9 octets

Ḳµ;\fZḢWƊ

Un programme complet imprimant l'abréviation récursive si cela est possible.

Essayez-le en ligne!

Comment?

Ḳµ;\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
la source
Qu'entendez-vous par «imprimer le premier mot»? Il doit trouver l'acronyme s'il en existe un, est-ce qu'il fait ça?
FireCubez
Échoue pour "ppcg peint des galaxies fraîches versant de l'acide dans le ciel", devrait imprimer "ppcg paints" ou "ppcgpaints"
FireCubez
Oh, j'ai raté l'exigence des mots adjacents :(
Jonathan Allan
Corrigé pour répondre à cette exigence.
Jonathan Allan
1

JavaScript [ES6], 74 octets

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

Crée une expression régulière pour correspondre. Voir des exemples dans le code.

Tous les cas de test:

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
la source
Échecincrease i
l4m2
@ l4m2, maintenant corrigé.
Rick Hitchcock
0

Python 2 , 106 octets

Première option - trouver un acronyme récursif.
Renvoie le résultat dans la liste.

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

Essayez-le en ligne!

Python 2 , 120 octets

Première option - trouver un acronyme récursif.

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

Essayez-le en ligne!

Possum mort
la source
Vous n'êtes pas obligé de produire "IMPOSSIBLE" selon la demande de @JoKing, ce qui pourrait diminuer votre nombre d'octets
FireCubez
Les lettres simples comme «je» ne fonctionnent pas, elles devraient produire cette lettre unique
FireCubez
@FireCubez fixed
Dead Possum
0

Javascript, 71 octets

Approche 1

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

Non golfé:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • Divisez la chaîne par l'espace.
  • Créez une nouvelle chaîne en prenant le premier caractère de chaque mot.
  • Comparez-le avec le premier mot.
alpheus
la source
0

Python 2 , 109 octets

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]

Essayez-le en ligne!

Chas Brown
la source
0

Scala, 76 octets

Solution pour cas simple (acronymes sans espaces blancs)

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

Scala, 144 octets 100 octets (voir la solution en ASCII uniquement dans les commentaires)

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

Test en 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
la source
Peut :::être remplacé par ++? Aussi, List[String]-> Seq[Any]?
ASCII uniquement le
1
100?
ASCII uniquement le
@ ASCII uniquement, cool! Cette solution bat Python. :)
Dr Y Wit
Ça vous dérange d'ajouter le code un jour? OMI, c'est un peu bizarre de voir le bytecount sans voir la solution
ASCII uniquement