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: copie .
introduction
Le presse-papiers des fonctions de MATL stocke ("copie") 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. Le contenu du presse-papiers stocké peut être poussé sur la pile ("collé").
Ce défi prendra le contenu du presse-papiers en entrée. On supposera que toutes les fonctions qui ont produit cet état du presse-papiers ont pris un ou plusieurs entiers positifs comme entrées. Ainsi, l'état du presse-papiers peut être représenté par une liste de listes de nombres. (Pour plus d'informations sur la façon dont le presse-papiers est réellement rempli, consultez le défi associé; mais ce n'est pas nécessaire pour le présent).
Interprétation du contenu du presse-papiers
Exemple 1
La première liste interne fait référence à l' appel de fonction le plus récent , et ainsi de suite. Ainsi, l'état du presse-papiers
[[11, 28], [12, 16], [4], [5, 6]]
indique que le dernier appel de fonction a deux entrées, à savoir 11
, 28
; le deuxième dernier appel a pris des entrées 12
, 16
; etc. (Cet état du presse-papiers est produit par le code dans le premier exemple du défi associé).
Exemple 2
S'il n'y a pas eu suffisamment d'appels de fonction , certaines listes internes de fin dans le presse-papiers seront vides:
[[7, 5], [], [], []]
(Ceci est produit par un programme qui ajoute simplement 7
et 5
).
Exemple 3
Les appels de fonction peuvent avoir un nombre quelconque d'entrées , mais toujours au moins 1
(les fonctions ne prenant aucune entrée ne modifient pas l'état du presse-papiers). Donc, ce qui suit est également possible.
[[3], [2, 40, 34], [7, 8, 15], []]
Accéder au contenu du presse-papiers
Le contenu du presse-papiers de fonction est poussé sur la pile en utilisant la fonction de MATL M
(qui, soit dit en passant, n'est pas une fonction normale, mais une fonction de presse-papier). Cette fonction prend un entier positif en entrée et pousse une partie du contenu du presse-papiers dans la pile, comme suit. En référence à l'état du presse-papiers dans l'exemple 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
renvoie toutes les entrées à l'appel de fonction le plus récent. Ainsi, pour l'exemple considéré, il donne11
,28
.- De même,
2M
,3M
et4M
retourner toutes les entrées à la deuxième, troisième et quatrième appels de fonctions les plus récentes. Alors2M
donne12
,16
;3M
donne4
; et4M
donne5
,6
. - Les nombres au-delà de
4
sélectionner des entrées individuelles pour faire fonctionner les appels qui ont pris plus d'une entrée. Renvoie donc5M
la dernière entrée à l' appel le plus récent . Dans notre cas, cela donne28
.6M
renvoie l' entrée individuelle précédente , qui est11
.7M
renvoie la dernière entrée de l'avant-dernier appel, c'est-à-dire16
, et8M
donne12
. Maintenant,9M
donne6
. Notez comment l'entrée4
est ignorée car c'était la seule entrée dans son appel de fonction. Enfin,10M
donne5
.
Pour l'état du presse-papiers dans l'exemple 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
donne3
.2M
donne2
,40
,34
.3M
donne7
,8
,15
.4M
a un comportement indéfini (pour les besoins de ce défi), car il n'y a eu que trois appels de fonction.5M
donne34
.6M
donne40
.7M
donne2
.8M
donne15
.9M
donne8
,10M
donne7
.11M
,12M
... ont aussi un comportement non défini .
Le défi
Entrée :
- l'état du presse-papiers, sous forme de liste de listes, ou tout autre format raisonnable;
- un entier positif n .
Sortie : résultat de l'appel de la fonction M
avec n en entrée. La sortie sera un ou plusieurs nombres avec un séparateur sans ambiguïté, ou dans un format raisonnable tel qu'une liste ou un tableau.
Précisions:
- L'état du presse-papiers se compose de quatre listes de nombres. Certaines listes de fin peuvent être vides, comme dans les exemples 2 et 3. Si vous préférez, vous pouvez saisir le presse-papiers sans ces listes vides de fin. Ainsi, l'exemple 3 deviendrait
[[3], [2, 40, 34], [7, 8, 15]]
. - Tous les nombres dans le presse-papiers seront des entiers positifs, éventuellement avec plus d'un chiffre.
- Le nombre n est garanti d'être valide. Ainsi, par exemple 3 ci-dessus,
n
ne peut pas être4
ou11
.
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
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
la source
Réponses:
Gelée , 8 octets
Essayez-le en ligne!
la source
ḊƇ
sélectionner tous les non singletons,U
inverser etẎ
aplatir. Pour l'entrée,[[11, 28], [12, 16], [4], []]
cela obtient[16, 12, 28, 11]
les valeurs de5M
through8M
. Ajoutez maintenant l'entrée d'origine à cette liste⁸;
et indexez-la dans la liste résultante par l'autre entrée⁹ị
.U
cela n'inverse pas le résultat deḊƇ
, mais plutôt chacun de ses éléments. Seulement si je pouvais en quelque sorte réduireḊƇUẎ⁸;
...Haskell ,
56 5147 octets-5-9 octets grâce à Laikoni (mise en correspondance des motifs pour assurer une longueur> 1 et utilisation dedo
-notation sur la compréhension de la liste)!Essayez-le en ligne!
Pointfree,
5855 octets-3 octets grâce à Laikoni (déplacement
([]:)
et remplacementid
)!Alternativement, nous pourrions utiliser cette version sans point
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.la source
APL (Dyalog Unicode) , 17 octets
Essayez-le en ligne!
la source
JavaScript (Node.js) , 57 octets
Essayez-le en ligne!
Il s'agit d'une fonction anonyme et curry. Exécutez-le avec
( function code )(clipboard)(n)
Explication
la source
JavaScript (ES6), 72 octets
Prend une entrée dans la syntaxe de curry
(clipboard)(n)
.Essayez-le en ligne!
la source
Python 2 ,
6056 octetsmerci à Jonathan Allan pour -4 octets.
Essayez-le en ligne!
la source
Java 8, 110 octets
Un lambda (au curry) prenant l'état du presse-papiers en tant que
int[][]
et le nombre en tant queint
et retournantint
ouint[]
(un seul numéro peut être renvoyé par l'un ou l'autre type).Essayez-le en ligne
Non golfé
la source
05AB1E , 12 octets
Essayez-le en ligne!
Explication
la source
Husk , 12 octets
Essayez-le en ligne!
Explication
À peu près un port direct de la réponse Haskell:
la source
R , 58 octets
Essayez-le en ligne!
Prend
M
comme unlist
des vecteursc()
; donc le remplacement[[
parlist(
,[
parc(
et]
par)
devrait transformer les cas de test en cas de test R.Pour les entrées
n<=4
avec "comportement indéfini", renvoieNULL
et pour les autres entrées non valides, jette une erreur "indice hors limites".la source
[n]
au lieu de[[n]]
.Stax ,
121413 octetsExécuter et déboguer
Explication:
Stax, 12 octets
Déballé:
Ceci est un bloc, donc je peux m'en débarrasser
]|u
, mais je ne sais pas si cela est valide car il contient un bloc.la source
J ,
3322 octets-11 octets (1/3 plus court) grâce à la solution de FrownyFrog!
Essayez-le en ligne!
Ma première solution:
J , 33 octets
Pas content - je suis à peu près sûr qu'il peut être joué beaucoup plus loin.
Explication:
Une fonction dyadique, prenant l'état du presse-papiers comme argument de rigth, l'argument de gauche est
n
<:@[
soustraire 1 de l'argument de gauche{
sélectionne lei
e élément (calculé ci-dessus) dans la liste à sa droite(...)
la liste complète#
copie]
dans la liste des états du presse-papiers(1<#)
les sous-listes de longueur supérieure à 1|.&.>
faire pivoter chaque sous-liste copiée<"0@;
raze and box - met chaque numéro dans une boîte séparée,
ajouter la nouvelle liste à la liste des états du presse-papiers@]
rend le verbe entier en (...) monadiqueEssayez-le en ligne!
la source
0;
le plus. Merci!V + coreutils ,
53 45 43 4240 octets-9 octets grâce à DJMcMayhem (en utilisant
VGÇ /d
plus:,$g/^[^ ]*$/d
,D@"dd
encore"aDÀdd
et!!
encore:.!
)!Ma toute première tentative de V (conseils bienvenus!), Le code ci-dessous utilise des caractères encerclés (par exemple.
ⓞ
pour\xf
) pour plus de lisibilité:Essayez-le en ligne!
Hexdump
Explication
La première ligne contient n et les lignes ci-dessous contiennent les entrées du presse-papiers, chaque entrée est séparée par des espaces s'il y avait plusieurs entrées:
la source
Rouge , 91 octets
Essayez-le en ligne!
la source
C (gcc) , 176 octets
Essayez-le en ligne!
Prend le tableau comme une liste de 4 paires de pointeurs de début / fin, puis n.
La description:
la source