Il y a 97 caractères ASCII que les gens rencontrent régulièrement. Ils se répartissent en quatre catégories:
Lettres (52 au total)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Nombres ou chiffres (10 au total)
0123456789
Symboles et ponctuation (32 au total)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Espaces blancs (3 au total)
Espace
\t
et nouvelle ligne\n
. (Nous traiterons les variantes de nouvelle ligne comme\r\n
un seul caractère.)
Par souci de concision, nous appelons ces catégories L, N, S et W respectivement.
Choisissez l’une des 24 permutations des lettres que LNSW
vous désirez et répétez-la indéfiniment pour vous constituer un modèle de programmation.
Par exemple, vous pouvez choisir la permutation NLWS
afin que votre modèle de programmation soit:
NLWSNLWSNLWSNLWSNLWS...
Vous devez écrire un programme ou une fonction basé sur ce modèle, où:
Chaque
L
est remplacé par une lettre (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
).Chaque
N
est remplacé par un nombre (0123456789
).Chaque
S
est remplacé par un symbole (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
).Chaque
W
est remplacé par n'importe quel caractère d'espacement (\t\n
).
Fondamentalement, votre code doit suivre le modèle
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
comme le suggère le titre de la question, si vous le souhaitez, vous pouvez choisir un ordre différent pour les quatre catégories de caractères.
Notez que:
Les remplacements pour une catégorie peuvent être différents caractères. Par exemple,
9a ^8B\t~7c\n]
conforme conforme au modèleNLWSNLWSNLWS
(\t
et\n
serait leurs caractères littéraux).Il n'y a pas de restrictions de longueur de code. Par exemple
1A +2B -
,1A +2B
et1A
et1
tous sont conformes au modèleNLWSNLWSNLWS...
.
Votre code conforme au modèle doit prendre un caractère ASCII non étendu et générer un nombre compris entre 0 et 4 en fonction de la catégorie dont il est membre dans la catégorisation ci-dessus. C'est-à-dire, sortie 1
si l'entrée est une lettre, 2
si un nombre, 3
si un symbole et 4
si un espace. Sortie 0
si l'entrée est nulle (un caractère de contrôle ).
Pour la saisie, vous pouvez également utiliser un nombre compris entre 0 et 127 qui représente le code du caractère ASCII saisi.
Les paires d’entrée (en tant que code de caractère) et de sortie que votre code doit avoir sont précisément les suivantes:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Les entrées 11, 12 et 13 correspondent à des caractères qui sont parfois considérés comme des espaces, par conséquent leurs sorties peuvent être 0
ou 4
comme vous le souhaitez.
Le code le plus court en octets gagne.
la source
Réponses:
Haskell 300 octets
Ce code ne devrait pas avoir de fin de ligne. La fonction
m1
prend l'entrée en tant queChar
et renvoie la réponse en tant queChar
.Je ne pouvais pas résister à un défi que quelqu'un a qualifié d'impossible pour les langues "conventionnelles".
Vous pouvez contester que Haskell compte, mais la majorité des mots-clés et des identificateurs sont constitués de plusieurs caractères et ne peuvent pas être utilisés. Toutefois, les définitions de fonctions de niveau supérieur, les listes, les littéraux de chaîne, les comparaisons strictes, la recherche de motifs et la création de branches avec des gardes fonctionnent aussi longtemps que les lettres se trouvent juste avant les chiffres, et si les symboles viennent également avant les lettres, nous avons des caractères d'échappement tels que
\t
et\r
. Malheureusement, les permutations qui fonctionnent pour la programmation générale n'autorisant pas les littéraux numériques, je ne pouvais donc pas obtenir de chiffres de manière utile.Comment ça marche:
m1
.x1
est le personnage en cours d'analyse.f1
fonction coupe la chaîne avec la correspondance du modèle de liste et comporte trois branches: pour lorsque les limites sont des symboles plus grands que l'espace, pour lorsque les limites sont échappées, des caractères de contrôle plus petits que l'espace et pour gérer la comparaison finale avec l'espace lui-même. Les noms des morceaux de la liste sont mnémoniques pour la première branche: Lettre, Nombre, Sommeil, Somme, Restant.b1
fonction gère la création de branches pour deux caractères de limites1 < b1
à la fois.Essayez-le en ligne
la source
Rétine , 113 octets
Lettre, Nombre, Espace, Symbole, Répéter
Essayez-le en ligne!
Testez-le sur lui-même!
Retina semble être un bon outil pour ce travail: nous pouvons utiliser tous les types de caractères de manière flexible dans la configuration de la scène et nous disposons de classes de caractères prédéfinies qui peuvent être utiles.
Je pense que ce problème pourrait être résolu avec les étapes de remplacement ou de translittération; J'ai choisi les translittérations car elles sont plus flexibles et possèdent les classes de caractères les plus utiles. En ce qui concerne le motif de la source, j’ai été obligé de placer les symboles juste avant les lettres pour pouvoir les utiliser
\n
dans les nouvelles lignes (j’avais en fait une solution plus courte utilisant le plus pratique ¶ pour les nouvelles lignes, mais les caractères non ascii sont interdits).Explication
Les premières étapes sont des translittérations. Nous utilisons
+
et1
comme options pour maintenir le modèle, mais ils n’affecteront pas le résultat de la scène. La syntaxe consisteT`from`to
à mapper chaque caractère defrom
au caractère situé à la même position dansto
. Sito
est plus court quefrom
, son caractère final est répété autant que nécessaire. Sifrom
comporte des caractères répétés, seule la première occurrence de chacun est prise en compte. Certaines lettres correspondent à des classes de caractères, par exempled
est équivalent à0123456789
.Avec cela, nous mappons des caractères sur d'autres caractères de la même classe afin de "faire de la place" pour suivre les translittérations. (
a
->b
,0
->1
,space
->tab
,@
->;
). La finale:D0
est juste un smiley: D0Nous commençons par les chiffres,
d
c’est la classe de caractères0-9
, ici nous transformons0
->a
,1-9
->2
,space
->2
: les translittérations pour0
etspace
sont fausses, mais ces caractères ont été éliminés par la translittération précédente.Les espaces blancs, transformer
a
->a
, (9
,tab
,\n
,space
) ->4
.9
était déjà enlevé à l'étape précédente.Lettres, nous utilisons ici deux classes de caractères différentes (faute d’une classe plus complète):
l
les lettres minuscules etL
les lettres majuscules. Ils sont tous mis en correspondance1
avec d'autres personnages traités dans les étapes précédentes.Symboles. Comme toutes les autres classes ont été converties en chiffres, nous mappons ici tous les chiffres avec
d
->d
, puis tous les caractères imprimables3
avecp
->3
. Les chiffres font également partie des caractères imprimables, mais la première translittération est gagnante.Nous devons maintenant affecter
0
des caractères de contrôle, mais je n’ai trouvé aucun moyen valide de s’adresser explicitement à cette classe. Au lieu de cela, nous convertirons chaque chiffre en unary: les caractères de contrôle ne sont pas des chiffres et sont donc considérés comme une chaîne vide, ce qui équivaut0
à unary. Malheureusement, la commande de conversion unaire dans Retina est$*
, qui sont deux symboles proches l'un de l'autre. Nous allons donc convertir "manuellement" en utilisant des substitutions.Notre chiffre unaire est
$n
, qui est un modèle de remplacement pour les nouvelles lignes.\b
correspond à une "limite", où un mot alphanumérique commence ou se termine: dans notre cas, cela correspond toujours avant tout nombre. Nous remplaçons fondamentalement chaque numéron
par un Newline Plusn-1
.Au final, nous comptons le nombre de nouvelles lignes et obtenons le résultat souhaité.
la source
Cardinal
22402224 octetsModèle utilisé LSNW
Le code a un retour à la ligne.
Comment ça marche:
Ce code a beaucoup de caractères qui ne sont pas utilisés.
% libère un pointeur dans toutes les directions. 3 d'entre eux viennent de frapper le bout d'une ligne et meurent.
Le dernier pointeur prend une entrée sur le:
Cette entrée est ensuite comparée à chaque valeur de 0 à 127.
Impressions:
0 pour 0-8
4 pour 9-12
0 pour 13-31
4 pour 32
3 pour 33-47
2 pour 48-57
3 pour 58-64
1 pour 65-90
3 pour 91-96
1 pour 97-122
3 pour 123-126
0 pour 127
Opérations utilisées:
J = Ignorer la prochaine opération si non nul
^ = Changer le sens de la marche
> = Changer le sens de la
main gauche - = Décrémenter
= = Incrémenter
= = Prendre la saisie
% = Créer des pointeurs au début du programme
x = Supprimer le pointeur
0 = Activer valeur du pointeur sur 0
Essayez-le en ligne
la source
Perl 5 , 293 octets
291 octets code + 2 pour
-0p
.On m'a informé que les indicateurs de ligne de commande étaient gratuits, mais je les ai ajoutés ici pour plus de visibilité, car le lien TIO ne comprend pas
-0
, pour faciliter les tests.Essayez-le en ligne!
C'est un défi particulièrement difficile à résoudre dans presque toutes les langues. Je suis donc ravi d'avoir pu (enfin, bricoler et bricoler longtemps) pour que cela fonctionne en perl. Espérons que les espaces supplémentaires avant et après le nombre ne sont pas un problème.
La sélection de l'ordre de la séquence était particulièrement délicate, mais heureusement
s///
ety///
peut accepter n'importe quel autre caractère comme délimiteur, il est donc possible d'utiliser une lettre, un espace, un nombre, un symbole, ce qui permets 0...0...0;
ety 0...0...0;
.La première chose nécessaire à l’approche consistait à remplacer
_
par «de!
manière à ce\w
qu’elle corresponde uniquement»[0-9a-zA-Z]
, puis à remplacer tous les espaces blancs (\s
) par\t
, tous les chiffres\r
et tous les caractères restants (\w
) par\n
des correspondances ultérieures. Puis, en utilisant l'y///
opérateur, tous les symboles restants sont convertis en caractères de mot!
à_
et tous les autres caractères (entre9
eta
) sont décalées vers le bas 9 places, les transformant en lettres ou des chiffres. Celles-ci sont ensuite remplacées via\w
avec3
et les autres, les substitutions effectuées précédemment sont remplacées par leurs valeurs numérotées.la source
Espace blanc , 1332 octets
L'ordre est
1234
/LNSW
(lettre, chiffre, symbole, espace).Essayez-le en ligne (entrez sous forme d'entier représentant l'unicode d'un caractère).
Explication:
Les espaces sont un langage basé sur la pile où chaque caractère, à l'exception des espaces, des tabulations et des nouvelles lignes, est ignoré. Voici le même programme sans
YO!
( 333 octets ):Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté comme explication seulement.Essayez-le en ligne.
Programme en pseudo-code:
la source