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]]
[[28, 11], [16, 12], [4], [6, 5]]
sortie est-elle valide pour le premier exemple?M
- papiers ?M
. Je le ferai dans le défi "coller"Réponses:
05AB1E , 20 octets
Essayez-le en ligne!
-4 merci à Emigna (ainsi que -8 merci à lui de m'avoir informé des règles).
a
b
la source
Bash , 43 octets
Essayez-le en ligne!
Cela imprime le presse-papiers dans le format suivant, notez l'utilisation de \ x0F comme séparateur.
L'idée clé est de passer ceci en dc, un langage basé sur la pile, de sorte que les éléments de pile requis soient imprimés.
L'entrée est dirigée vers sed où chaque
+
est remplacé parrdnFPrp+
, qui en dc imprime le deuxième numéro de la pile suivi de \ x0F puis du premier numéro avant d'effectuer l'addition. sed remplace également chaqueU
avecp2^
, imprimez l'élément supérieur de la pile et mettez-le au carré.Le résultat de sed est évalué en tant que code dc, imprimant tout le presse-papiers.
Puisque les lignes sont dans l'ordre inverse,
tac
(inversecat
) est utilisé pour corriger cela.Et enfin, sed choisit les 4 premières lignes de tac.
la source
Python 2 , 126 octets
Essayez-le en ligne!
la source
Haskell ,
113109 octetsLa première ligne définit une fonction anonyme qui prend une chaîne de caractères, par exemple
"3 2 + 6 + 12 4 U + +"
, et retourne une liste de listes de ints:[[11,28],[12,16],[4],[5,6]]
. Essayez-le en ligne!la source
Propre , 140 octets
Essayez-le en ligne!
Dans le style Clean classique, c'est la solution Haskell, sauf environ 50% plus longtemps.
la source
JavaScript (ES6), 107 octets
Prend l'entrée comme une liste composée d'entiers,
'+'
et'U'
. Renvoie une autre liste composée d'entiers, de tableaux de 2 entiers et'_'
pour des emplacements vides.Essayez-le en ligne!
Commenté
la source
Aller,
305303295 octetsPerte de 8 octets grâce à @ovs
Essayez-le en ligne!
la source
Octave , 206 octets
Essayez-le en ligne!
Si seulement Octave avait une
pop
syntaxe.m
est le presse-papiers de la mémoire,t
la pile.la source
m
ett
inversement, en ajoutant des éléments à l'avant plutôt qu'à la fin?Python 3 ,
218204 octets-14 octets grâce aux ovs
Essayez-le en ligne!
la source
Rouge ,
335330 octetsEssayez-le en ligne!
Plus lisible:
la source
R ,
205182 octetsEssayez-le en ligne!
M
est le presse-papiers de la mémoire,P
le programme etS
la pile.Techniquement, il
S
est initialisé comme un vecteur contenant un seul zéro, mais comme nous n'obtenons jamais d'entrée invalide, il me fait gagner un octetS={}
.la source
C (gcc) , 264 octets
J'ai utilisé la récursivité pour pouvoir utiliser la pile de fonctions comme pile de données: la liste d'entrée est parcourue et les opérations sont effectuées: les résultats sont affichés dans l'ordre inverse, avec les poussées de pile non affichées.
La pile est implémentée sous forme de liste chaînée. Voici comment ça fonctionne:
J'ai utilisé à l'origine une structure pour les nœuds, mais je suis passé à des pointeurs nus pour économiser de l'espace. Une caractéristique intéressante de cette liste chaînée est qu'elle se nettoie une fois la récursivité terminée.
Essayez-le en ligne!
la source