Lorsque les bébés ouvrent la bouche, ils ne se contentent pas de cracher du charabia. Ils parlent en fait dans un chiffrement très avancé et à l'épreuve des adultes ...
Le chiffre Baby-Talk
Quand un bébé parle, cela pourrait ressembler à quelque chose. gogooa gagooook aagaaoooy
Chaque section séparée par un espace représente un caractère (donc l'exemple ci-dessus représente 3 caractères).
Pour déchiffrer une section, nous devons compter le nombre d'As et d'Os qu'elle contient. Cependant, nous ne comptons que ceux qui sont adjacents à une autre voyelle. Par exemple, le A dans «gag» ne compterait pas, mais le A et O dans «gaog» le feraient.
Compter l'exemple ci-dessus ressemblerait à ceci:
Section | Num Os | Num As
gogooa | 2 | 1
gagooook | 4 | 0
aagaaoooy | 3 | 4
Nous utilisons ensuite ces valeurs pour convertir l'entrée en texte brut sur un carré de Polybe. Il s'agit d'une représentation 5x5 de l'alphabet anglais, en omettant 'J' (veuillez noter que, dans baby-talk, les règles de comptage 0 s'appliquent au tableau):
0 1 2 3 4
0 A B C D E
1 F G H I K
2 L M N O P
3 Q R S T U
4 V W X Y Z
En utilisant le nombre d'Os comme colonne et le nombre d'As comme ligne, nous trouvons quel caractère chaque section représente:
Section | Num Os | Num As | Character
gogooa | 2 | 1 | (2,1) -> H
gagooook | 4 | 0 | (4,0) -> E
aagaaoooy | 3 | 4 | (3,4) -> Y
Ce qui nous dit que le bébé venait de dire "HEY".
Remarques :
- Si une section représentant un personnage a plus de 4 As ou Os, ignorez les extras, car 4 est la valeur maximale sur la table. - Pour cette tâche, Y n'est pas une voyelle - seulement A, E, I, O et U.
Le défi
Votre tâche consiste à créer un programme complet qui prend une entrée, un mot en langage bébé et l'imprime en texte clair.
- Votre programme doit être en mesure de saisir des données en majuscules, en minuscules et un mélange des deux.
- L'entrée ne contiendra que des lettres de l'alphabet ASCII (AZ et az), avec des espaces simples pour séparer les mots du bébé.
- Le texte de sortie peut être dans tous les cas.
- Vous devez prendre l'entrée
STDIN
et imprimer le texte en clairSTDOUT
. Si votre langue n'en possède pas, utilisez l'équivalent le plus proche. - Il s'agit de code-golf , donc le code le plus court en octets l'emporte - mais toute solution est la bienvenue.
Cas de test
'GLOOG KAKAAOOO ARGOOO OOOOOGUGUU' -> CODE
'oaka pooopaa gaau augu' -> GOLF
'Aoao U oOOAoa oaoAoo aoAoAOa' -> NAPPY
'GUG gAGaA gOougOou' -> ALE
'OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI' -> HELLO
'GUG gAGaA gOougOou' -> 'ALE'
Les bébés boivent de la bière? : D.toUpperCase()
appel de fonction ou similaire, pas un défi réellement stimulantgogooa
a 2 o? Et commentgagooook
a 0 a?FAG
: PRéponses:
05AB1E , 46 octets
Essayez-le en ligne!
Explication par étapes
la source
Perl, 82 octets
Comprend +1 pour
-a
Donnez votre avis sur STDIN:
baby.pl
:Cela suppose une version suffisamment récente de Perl où cela
-a
implique-n
. Si votre perl est trop ancien, vous devrez ajouter une-n
option explicite .Cela suppose également que les bébés ne peuvent pas dire des chaînes ASCII générales qui commencent par des chiffres comme
1 this will not work
la source
brainfuck, 656 octets
C'était un très bon moyen de tuer quelques heures.
Nécessite un interpréteur brainfuck qui utilise des cellules d'habillage 8 bits, vous permet d'aller à gauche de la cellule 0 et renvoie 0 si
,
est utilisé lorsque stdin est vide. D'après mon expérience, ce sont les paramètres les plus courants.Ce programme ne considère pas Y comme une voyelle, mais si OP le souhaite, c'est une solution facile.
Il semble qu'écrire ceci serait une tâche intimidante mais si vous avez une certaine connaissance de la langue, il n'y a rien de surprenant ou de nouveau dans le code. Tactiques standard de brainfuck: lisez l'entrée mais assurez-vous de laisser quelques cellules vides entre chaque octet, utilisez ces cellules vides pour stocker des données sur l'entrée, utilisez les données que vous avez stockées pour décider comment la transformer et cracher quelque chose à la fin . Dans ce cas, il s'agissait d'obtenir l'entrée, de mettre tout en majuscules, de déterminer quelles cellules sont des voyelles, de jeter ces informations après les avoir utilisées pour déterminer quelles cellules sont à côté des voyelles, de définir tout ce qui n'est pas à côté d'une voyelle pour certains valeur qui ne sera jamais pertinente, donc ils ne vous gêneront pas plus tard, et vous avez essentiellement terminé. De là, il suffit de compter vos
A
s etO
s, multipliezA
s par 5 et ajoutez le nombre deO
s, tout cas spécial supérieur à 8 pour éviter J et la sortie. J'ai choisi de gérer ce mot à la fois, plutôt que de prendre la totalité de l'entrée en même temps, j'ai donc dû configurer la partie du code qui lit stdin pour casser à 0 ou 32, mais ce n'est pas trop gros un problème (juste envelopper la soustraction de 32 dans une condition il ne se produit pas si la valeur est déjà 0, puis corriger tout<
ou>
instructions que vous avez manqué plus tard).Je ne sais pas à quel point ce sera utile parce que je l'ai écrit principalement pour garder mes pensées droites plutôt que comme une véritable explication, mais voici le code avec mes commentaires et son indentation d'origine:
la source
JavaScript (ES6), 145 octets
Remplace chaque mot (et l'espace suivant) par sa lettre correspondante.
s.split` `.map().join``
est de 3 octets de plus:la source
Perl, 159 +1 = 160 octets
+1 octet pour l'indicateur -n. Les espaces ne font pas partie du code et ne sont fournis qu'à des fins de lisibilité.
Le code divise l'entrée par des espaces et convertit chaque mot bébé en minuscules avant de continuer. L'expression régulière trouve toutes les voyelles a ou o qui sont suivies par une autre voyelle, ou qui sont précédées par une voyelle, et les trie, un au début, un à la fin, puis trouve l'index du premier `` o ''. Si le nombre de correspondances restantes (aka, le nombre de 'a') est supérieur à 4, alors nous nous soucions de 4 a, et s'il y a plus de 4 o, nous nous soucions de 4 o. Ensuite, il extrait la lettre appropriée de la matrice et l'imprime, puis passe au mot bébé suivant.
la source
Brainfuck, 283 octets
Formaté:
Cela fonctionne avec ou sans retour à la ligne dans l'entrée.
Essayez-le en ligne.
Chaque caractère est traité mod 32 (avec un flux de contrôle tel que le code implémentant l'opération mod ne se produit qu'une seule fois dans le programme). Cela permet une insensibilité à la casse, ainsi que de réduire le caractère d'espace et l'EOF en un seul cas. Une nouvelle ligne de fin est traitée de la même manière que
J
, ce qui n'affecte pas la sortie.Croquis de la disposition de la mémoire:
0 x C c y a A b B
où
c
est le caractère d'entrée,C
est le mod de caractère 32,x
est-ce qu'il s'agit d'une voyelle,y
est-ce que le caractère précédent était une voyelle,A
etB
sont les nombres de valides (à côté des voyelles)a
et deo
caractères respectivement, eta
etb
sont leurs tampons respectifs qui obtenir copié ou effacé selon qu'il existe une voyelle adjacente.Lorsqu'un espace ou EOF est atteint, certains jonglages sont effectués pour réduire les nombres supérieurs à 4 et pour sauter la lettre
J
, puis le caractère décodé est imprimé.la source
PHP, 163 octets
Version plus lisible:
Tests:
la source
Java 8,
272266251249 octets-6 octets grâce à @Joba .
-1 octet de conversion de Java 7 à 8, et
1416 octets supplémentaires enregistrés en changeant la partie d'impression.Explication:
Essayez-le ici.
la source
Python 3,
163162157146 octetsUtilise l'expression régulière pour trouver toutes les chaînes de voyelles supérieures à 2, compte les As et les Os avec un maximum de 4, puis imprime.
la source
APL, 60
Notez que ⎕IO ← 0 et ⎕ML ← 3
Exemple:
Fonctionne dans Dyalog 15.0 , car c'est la version dans laquelle 819⌶ a été introduit pour mettre une chaîne en minuscules.
la source
Pyth, 64 octets
Peut probablement être joué plus loin. Essayez-le ici!
la source
R, 261 octets
Je pense que j'ai passé beaucoup trop de temps juste pour que cela fonctionne et je pense que c'est une solution inutilement compliquée, bien que cela fonctionne. Prend l'entrée de stdin, il est important que la chaîne soit placée entre guillemets.
L'utilisation de quatre
apply
familles imbriquées pourrait théoriquement être réduite à seulement deux en utilisant à lamapply
place. Mais parce que les entréesmapply
ne seront pas de la même longueur, la plus courte est recyclée, ce qui complique les choses et je n'ai pas pu trouver de solution de travail.Si quelqu'un est intéressé, j'ajouterai une explication non approuvée plus tard.
Essayez tous les cas de test sur R-fiddle
Veuillez noter que cette version prend l'entrée comme argument de fonction à la place de stdin car
scan
ne fonctionne pas sur R-fiddle. De plus, une nouvelle ligne a été ajoutée pour faciliter la lecture.la source
Python 3, 262 octets
Moins golfé (Les commentaires sont les variables du code abrégé):
Essayez-le en ligne!
la source
blaoaoaog
: les voyelles entrelacées sont comptées plus d'une fois, cez
qui donne quand cela devrait êtret
(même si cela fonctionne justeaaaooo
, mais je ne peux pas comprendre pourquoi ...)aooa
== (2,2) ==n
,aoaoao
== (3,3) ==t
gaoaoaog
Je viens de le tester et la CAO est correcte, imprime Z au lieu de T. Je pense que c'est parce que votre expression régulière prend[ao,oa,ao,oa,ao]
, ce qui compte5,5
, puis le restreint à4,4
, imprimant Z.Kotlin ,
221209 octetsMaintenant beaucoup plus laid et lent, le tout au nom de 11 octets
Enregistrez-le dans un fichier (ex.
BabyTalk.kts
) Pour l'exécuter en tant que script. Ou, le code ci-dessus peut être ajoutéfun main(z:Array<String>)=
et compilé normalement pour un coût de 26 octets supplémentaires.Essayez-le en ligne!
Dentelé:
la source
PHP,
124129121120125octetsPrend l'entrée des arguments de ligne de commande. Courez avec
-nr
ou essayez-le en ligne .panne
la source
J , 109 octets
Essayez-le en ligne!
la source