Dans son xkcd sur le format de date standard ISO 8601, Randall s'est fié à une notation alternative plutôt curieuse:
Les grands nombres sont tous les chiffres qui apparaissent dans la date du jour dans leur ordre habituel, et les petits nombres sont des index basés sur 1 des occurrences de ce chiffre. Donc, l'exemple ci-dessus représente 2013-02-27
.
Définissons une représentation ASCII pour une telle date. La première ligne contient les index 1 à 4. La seconde ligne contient les "gros" chiffres. La troisième ligne contient les index 5 à 8. S'il existe plusieurs index dans un seul emplacement, ils sont énumérés les uns à côté des autres, du plus petit au plus grand. S'il y a au plus des m
index dans un seul emplacement (c'est-à-dire sur le même chiffre et dans la même ligne), chaque colonne doit alors comporter des m+1
caractères larges et alignés à gauche:
2 3 1 4
0 1 2 3 7
5 67 8
Voir aussi le défi associé à la conversion opposée.
Le défi
Avec une date en notation xkcd, éditez la date ISO 8601 correspondante ( YYYY-MM-DD
).
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
Vous pouvez supposer que la saisie est une date valide comprise entre années 0000
et 9999
inclus.
Il n'y aura pas d'espaces de début dans l'entrée, mais vous pouvez supposer que les lignes sont complétées d'espaces par un rectangle, qui contient au plus une colonne d'espaces de fin.
Les règles standard de code-golf s'appliquent.
Cas de test
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
est au-dessus2
, le premier chiffre est donc2
.2
est au-dessus0
, donc le deuxième chiffre est0
.3
est au-dessus1
,4
est au-dessus3
, nous obtenons donc2013
comme les quatre premiers chiffres. Maintenant5
est en dessous0
, donc le cinquième chiffre est0
,6
et7
les deux sont en dessous2
, donc ces deux chiffres sont2
. Et enfin,8
est en dessous7
, donc le dernier chiffre est8
, et nous nous retrouvons avec2013-02-27
. (Les traits d'union sont implicites dans la notation xkcd car nous savons à quelles positions ils apparaissent.)Réponses:
CJam, 35 octets
Essayez ici . Il s'attend à ce que les lignes d'entrée soient complétées par des espaces.
Explication
ll
lit deux lignes d’entrée et{1$e>}*
effectue un "balayage" sur la seconde: il prend tous les préfixes de son entrée et calcule le maximum de chaque préfixe. Pour la ligne d'entrée"0 1 2 7 8"
, cela pousse"0001112227778"
. Notre pile ressemble maintenant à ceci:Nous devons re-capturer les valeurs dans une liste que nous utilisons nous-mêmes
]
; cela capture aussi notre première ligne, donc nous le repassons en utilisant(
, pour obtenircomme prévu.
eelee+
énumère cette ligne, puis fait la même chose pour une troisième ligne d'entrée et concatène les résultats, en laissant quelque chose comme ceci au sommet de la pile:Maintenant, notre pile est
["0001112227778" X]
oùX
est la liste énumérée ci-dessus.Nous retournons chaque paire entre
X
(Wf%
), trions les paires lexicographiquement ($
) et quittons les 8 dernières paires-8>
. Cela nous donne quelque chose comme:Cela fonctionne car le tri place toutes les paires avec la clé
'
(espace) avant tous les chiffres dans l'ordre croissant.Ce sont les " x -positions" des caractères
12345678
sur les première et troisième lignes: il suffit de récupérer les caractères de notre deuxième ligne (modifiée) qui sont alignés verticalement avec eux.Pour ce faire, nous prenons chaque position (
Wf=
), index dans la chaîne que nous avons créée précédemment (\f=
). Nous avons"20610222"
maintenant la pile: pour ajouter les tirets, nous divisons d’abord en segments de longueur deux (2/
), imprimons le premier segment sans nouvelle ligne ((o
) et joignons les segments restants à des tirets ('-*
).EDIT : bon truc d'analyse, Martin! Sauvegardé quatre octets.
EDIT 2 : sauvegardé deux octets supplémentaires en remplaçant
eelee+
parl+ee
; cela fonctionne, parce que les lignes ont toutes les mêmes longueurs, et l' indexation de la liste dans CJAM est modulo automatiquement la longueur de la liste, de sorte que les indicesn+0
,n+1
,n+2
... carte bien à0
,1
,2
...EDIT 3 : Martin a enregistré un autre octet dans la dernière étape du processus. Agréable!
la source
Pyth,
4843Suite de tests
Requiert un remplissage avec des espaces dans un rectangle.
Je ne pense pas que ce soit la meilleure approche, mais fondamentalement, il écrit la valeur du milieu dans l'index dans une chaîne pointée par la valeur supérieure ou inférieure. Eh bien, je suppose que j’ai eu assez de temps pour jouer au golf la plupart des choses évidentes que j’ai vues. : P
la source
JavaScript (ES7), 115
Fonction anonyme. À l'aide de chaînes de modèle, il existe une nouvelle ligne significative et incluse dans le nombre d'octets.
Condition requise: la ligne d'entrée du milieu ne doit pas être plus courte que la première ou la dernière. Cette exigence est satisfaite lorsque l'entrée est complétée d'espaces pour former un rectangle.
ES6 version 117 utilisant .map au lieu de la compréhension de tableau
Moins golfé
Extrait de test
la source
Haskell,
125106103 octetsNécessite un remplissage avec des espaces par rapport à un rectangle complet.
Exemple d'utilisation:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Comment ça fonctionne:
la source
JavaScript ES6, 231
Cas de test .
la source
Perl, 154 octets
Ungolfed & expliqué
la source
JavaScript (ES6), 131 octets
Explication
Requiert que l’entrée soit complétée par des espaces pour former un rectangle.
Tester
Afficher l'extrait de code
la source
Powershell, 119 octets
Script de test non-golfé:
Sortie:
la source
Gelée , 38 octets
Essayez-le en ligne!
L'assistant n'est là que pour faciliter la saisie; c'est en fait un programme complet. Assurez-vous de prendre soin de :
'''
), ainsi que les lignes suivantes (vides, pour plus de clarté).la source