Ce défi est lié à certaines des fonctionnalités du langage MATL, dans le cadre de l' événement Langue du mois de mai 2018 . Défi associé : Fonction presse-papiers: coller .
introduction
MATL a plusieurs presse - papiers , où vous pouvez stocker des valeurs (copier) pour les récupérer plus tard (coller). Certains presse-papiers sont automatiques , ce qui signifie que la copie est automatiquement déclenchée par certains événements. Ce défi se concentre sur l'un des presse-papiers automatiques, appelé presse-papiers d'entrée de fonction , ou simplement presse-papiers de fonction .
Ce presse-papiers stocke les entrées des quatre derniers appels aux fonctions normales de prise d'entrée. Les fonctions normales sont le type de fonctions le plus courant dans MATL. La prise d'entrée signifie que la fonction prend au moins une entrée (les fonctions qui n'acceptent aucune entrée ne sont pas prises en compte par le presse-papiers de la fonction).
Ceci est mieux expliqué avec les exemples suivants, qui utilisent deux fonctions normales:
+
, qui extrait deux nombres de la pile et pousse leur somme.U
, qui fait apparaître un chiffre et pousse son carré.
Exemple 1 :
3 2 + 6 + 12 4 U + +
produit le résultat 39
. Le code est interprété comme suit:
- Les littéraux numériques tels que
3
ou12
sont poussés vers la pile - Des fonctions telles que
+
pop leurs entrées et pousser leurs sorties vers la pile.
Les appels de fonction, par ordre chronologique, sont les suivants:
3 2 +
donne5
5 6 +
donne11
4 U
donne16
12 16 +
28
11 28 +
donne39
.
Le presse-papiers peut être vu comme une liste de quatre listes. Chaque liste interne contient les entrées d'un appel de fonction, avec les appels les plus récents en premier . Dans chaque liste interne, les entrées sont dans leur ordre d'origine .
Donc, après avoir exécuté le code, le contenu du presse-papiers est (en notation Python):
[[11, 28], [12, 16], [4], [5, 6]]
Exemple 2 :
10 20 U 30 +
laisse des chiffres 10
et 430
sur la pile. La pile est affichée de bas en haut à la fin du programme.
Les appels de fonction sont
20 U
donne400
400 30 +
donne430
Puisqu'il n'y a eu que deux appels de fonction, certaines des listes internes définissant le presse-papiers seront vides . Notez également comment 10
n'est utilisé comme entrée pour aucune fonction.
Ainsi, le contenu du presse-papiers après l'exécution du code est:
[[400, 30], [20], [], []]
Exemple 3 (invalide):
10 20 + +
est considéré comme invalide, car une entrée à la seconde +
est manquante (dans MATL, cela déclencherait implicitement une entrée utilisateur).
Le défi
Entrée : une chaîne S avec des littéraux numériques +
et U
, séparés par des espaces.
Sortie : le contenu du presse - papiers de fonction après l' évaluation de la chaîne S .
Précisions:
- Vous pouvez utiliser deux symboles cohérents pour représenter ces fonctions, autres que des chiffres. En outre, vous pouvez utiliser n'importe quel symbole cohérent comme séparateur, au lieu de l'espace.
- Seules les deux fonctions indiquées seront prises en compte.
- La chaîne d'entrée contiendra au moins un littéral numérique et au moins une fonction.
- Tous les nombres seront des entiers positifs, éventuellement avec plus d'un chiffre.
- Il est possible que certains littéraux numériques ne soient utilisés par aucune fonction, comme dans l'exemple 2.
- L'entrée est garantie comme étant un code valide, sans nécessiter de numéros supplémentaires. Ainsi, une chaîne comme dans l'exemple 3 ne se produira jamais.
- La fin des listes internes vides dans la sortie peut être supprimée. Ainsi, le résultat de l'exemple 2 peut être
[[400, 30], [20]]
- Tout format de sortie raisonnable et sans ambiguïté est acceptable. Par exemple, une chaîne de caractères avec la virgule comme séparateur interne et externe virgule comme séparateur:
400,30;20;;
.
Règles supplémentaires:
L'entrée et la sortie peuvent être prises par tout moyen raisonnable .
Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les failles standard sont interdites .
Le code le plus court en octets gagne.
Cas de test
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
M
- papiers ?
M
. Je le ferai dans le défi "coller"
[[28, 11], [16, 12], [4], [6, 5]]
sortie est-elle valide pour le premier exemple?