Un programme en damier est un programme où la valeur ordinale de chaque caractère individuel alterne de pair à impair, à l'exclusion du terminateur de ligne (qui peut être n'importe quelle fin de ligne standard).
Un programme triangulaire est un programme dans lequel chaque ligne a un caractère supplémentaire que la ligne précédente, la première ligne ayant un caractère. Vous n'avez pas besoin de gérer une entrée vide.
Votre tâche consiste à créer un programme qui valide que l'entrée donnée respecte ces critères et génère / renvoie quelque chose de vrai si le programme répond aux critères, ou quelque chose de faux sinon.
Votre programme doit également répondre à ces critères.
Exemples de programmes valides
G
`e
@u^
5r{B
^
cB
+$C
VA01
Règles
- Votre programme peut commencer par un octet impair ou pair tant que la parité des caractères alterne.
- Votre programme doit valider les programmes qui commencent par un caractère impair ou pair.
- Pour les caractères unicode, les valeurs d'octet sous-jacentes doivent avoir une parité alternée.
- Vous pouvez supposer que l'entrée ne contient que des caractères imprimables. Si votre programme contient des non imprimables, il devrait toujours pouvoir se valider.
- Votre programme peut inclure une nouvelle ligne de fin, cela n'a pas besoin d'être autorisé par votre validation car vous pouvez supposer que cela est supprimé avant la validation.
- Les failles standard sont interdites.
- Le code le plus court en octets, dans chaque langue, gagne.
code-golf
restricted-source
source-layout
Dom Hastings
la source
la source
E\nOE\nOEO
. J'espère que cela pourra aider!Réponses:
Stax , 26 octets
Exécutez des cas de test en ligne
J'ai dû introduire 3 personnages indésirables.
i
est un no-op en dehors de toutes les constructions de boucle.est toujours un no-op.
O
place un 1 sous le haut de la pile, mais la valeur n'est pas utilisée dans le programme.Exécutez celui-ci
la source
C (gcc), 189 octets
Essayez-le en ligne!
␉
représente un caractère de tabulation (je suis désolé). Notez qu'il y a plusieurs espaces / tabulations de fin (je suis plus désolé). L'original avec les onglets intacts est mieux visualisé avec:set tabstop=1
(les mots ne peuvent exprimer à quel point je suis désolé).C'est une fonction (appelée
f
, qui n'est pas immédiatement évidente en y regardant) qui prend une chaîne en argument et retourne soit0
ou1
.Je pourrais réduire cela d'au moins une et probablement deux lignes ou plus, mais notez que cela devient de plus en plus compliqué et sans effort vers la fin, principalement parce que l'écriture d'un code aussi horrible (même selon les normes PPCG) me faisait me sentir comme une mauvaise personne et je voulais arrêter le plus tôt possible.
L'idée de base est d'éviter les constructions qui rompent nécessairement le format (
++
,+=
,return
, etc.). Miraculeusement, mots - clés importants commefor
,char
etwhile
(que je n'ai pas fini à l' aide) arrive à adapter la règle de parité alternée. Ensuite, j'ai utilisé des espaces (parité paire) et des tabulations (parité impaire) comme rembourrage pour que le reste corresponde aux règles.la source
Haskell ,
10801033 octetsEssayez-le en ligne!
Explication
Cela a été une tâche très intéressante pour Haskell.
Parité
Pour commencer, nous avons besoin d'un moyen de déterminer si un caractère a un point de code pair ou impair. La façon normale de le faire est d'obtenir le point de code et de le modifier par 2. Cependant, comme vous le savez peut-être, obtenir le point de code d'un caractère nécessite une importation qui, en raison de la restriction de la source, signifie qu'il ne peut pas être utilisé. Un Haskeller plus expérimenté penserait à utiliser la récursivité.
Char
font partie de laEnum
classe de type afin que nous puissions obtenir leurs prédécesseurs et successeurs. Cependantpred
, ilssucc
sont également inutilisables car ils n'alternent pas la parité des octets.Donc, cela nous laisse assez coincés, nous ne pouvons pratiquement pas faire de manipulation avec les caractères. La solution est de tout coder en dur. Nous pouvons représenter (la plupart) même les caractères comme des littéraux, les probabilités avec lesquelles nous avons des problèmes parce qu'ils
'
sont étranges, donc ils ne peuvent pas être à côté du caractère lui-même, ce qui rend le littéral impossible d'exprimer la plupart des caractères impairs. Nous codons donc en dur tous les octets pairs, puis ajoutons un catch all pour les octets impairs à la fin.Les octets problématiques
Vous pouvez remarquer qu'il existe certains octets pairs pour lesquels des littéraux ne peuvent pas être créés en les encapsulant entre guillemets simples. Ce sont les non imprimables, les nouvelles lignes et
\
. Nous n'avons pas à nous soucier des non imprimables, tant que nous n'en utilisons aucun, nous n'avons pas besoin de le vérifier. En fait, nous pouvons toujours utiliser d'étranges non imprimables, comme tab, je n'en ai tout simplement pas besoin. Le retour à la ligne peut être ignoré car il sera de toute façon supprimé du programme. (Nous pourrions inclure la nouvelle ligne, car son point de code est plutôt pratique, mais nous n'en avons pas besoin). Cela laisse\
, a maintenant\
le point de code 92, qui est commodément un nombre impair suivi d'un nombre pair,\92
alterne donc entre les evens et les cotes donc le littéral'\92'
est parfaitement valable. Plus tard, lorsque nous aurons besoin de représenter une nouvelle ligne, nous remarquerons qu'elle a heureusement cette même propriété'\10'
.Problèmes d'espacement
Maintenant, pour commencer à écrire du code réel, nous devons pouvoir mettre un nombre important de caractères sur une seule ligne. Pour ce faire, j'ai écrit la casquette:
La casquette ne fait rien d'autre que d'être Haskell valide. J'avais initialement espéré faire des définitions qui nous aideraient dans le code plus tard, mais ce n'est pas le cas. Il existe également des moyens plus simples de créer un plafond, par exemple des espaces et des points-virgules, mais ils n'économisent pas d'octets de cette manière, je n'ai donc pas pris la peine de le modifier.
Hardcoder
Alors maintenant que j'ai assez d'espace sur une ligne, je commence à coder en dur les valeurs. C'est surtout assez ennuyeux, mais il y a quelques choses intéressantes. Pour une fois que les lignes commencent à devenir encore plus longues, nous pouvons utiliser
;
pour mettre plusieurs déclarations sur une ligne, ce qui nous permet d'économiser une tonne d'octets.La seconde est que, comme nous ne pouvons pas toujours commencer une ligne avec un de
g
temps en temps, nous devons indenter un peu les lignes. Maintenant, Haskell se soucie vraiment de l'indentation, donc il s'en plaindra. Cependant, si la dernière ligne avant la ligne en retrait se termine par un point-virgule, cela sera autorisé. Pourquoi? Je n'ai pas le moindre, mais ça marche. Il suffit donc de se rappeler de mettre les points-virgules à la fin des lignes.Blocs fonctionnels
Une fois le hardcoder terminé, la navigation se fait en douceur jusqu'à la fin du programme. Nous devons construire quelques fonctions simples. Je construis d'abord une version de
drop
, appeléei
.i
est différent de cedrop
que si nous essayons de passer au-delà de la fin de la chaîne, il retourne simplement"y"
.i
est différent de drop également en ce que s'il tente de supprimer une nouvelle ligne, il reviendra"y"
, ceux-ci seront utiles car plus tard, lorsque nous vérifierons que le programme est un triangle, cela nous permettra de revenirFalse
lorsque la dernière ligne n'est pas terminée, ou lorsque une ligne se termine tôt.Ensuite, nous avonsn s s n n+1
k
qui vérifie en fait qu'une chaîne est triangulaire.k
est assez simple, il faut un nombre et une chaîne . Si est vide, il revient . Si la chaîne commence par une nouvelle ligne, elle supprime la nouvelle ligne et caractères du premier plan. Il rappelle ensuite avec et la nouvelle chaîne. Si la chaîne ne commence pas par une nouvelle ligne, elle retourne .s s n n + 1True
k
False
Nous faisons ensuite un alias pour
k
,m
.m
est justek
avec1
dans le premier argument, et une nouvelle ligne est ajoutée au second argument.Ensuite, nous avons
o
.o
prend un nombre et une chaîne. Il détermine si les octets de chaîne (ignorant les nouvelles lignes) alternent en parité (en utilisant notreg
) en commençant par le numéro d'entrée.Enfin, nous avons
s
qui fonctionneo
avec les deux1
et0
, si l'un ou l'autre réussit, il s'en remetm
. S'il échoue, il revient simplementFalse
. C'est la fonction que nous voulons. Il détermine que l'entrée est triangulaire et alternée.la source
05AB1E ,
3426 octetsEssayez-le en ligne!
Prend l'entrée comme une chaîne multiligne (entrée entre "" " ). Explications à venir plus tard.
la source
Java 10, 209 octets
Un lambda vide prenant un itérable ou un tableau de
byte
. Indique vrai en retournant normalement, faux en lançant une exception d'exécution. Le programme s'attend à ce que la dernière ligne soit correctement terminée, c'est-à-dire se termine par un caractère de nouvelle ligne. La dernière ligne du programme est également terminée.Tout est fait sous UTF-8, avec l'interprétation que "caractère" fait référence aux points de code Unicode.
Les tabulations sont remplacées par des espaces dans cette vue.
Essayez-le en ligne
Vidage hexadécimal
Revenez avec
xxd -p -r
sur Unix.Non golfé
f
est le nombre attendu de caractères sur la ligne en cours,h
est le nombre de caractères vus jusqu'à présent sur la ligne en cours,c
est le dernier octet vu, etb
est de savoir sia
est la nouvelle ligne.La condition
a > -65
teste s'ila
s'agit du premier octet d'un caractère. Cela fonctionne parce que les caractères à un octet (ASCII) ne sont pas négatifs dans le complément à deux de 8 bits, le premier octet des caractères plus longs a une forme binaire11xxxxxx
(au moins -64 dans le complément à deux) et les octets non en tête de ces caractères sont de la forme10xxxxxx
, au plus -65 en complément à deux. ( Source )Lorsqu'un personnage viole le motif triangulaire ou en damier (c'est-à-dire qu'un saut de ligne apparaît tôt ou tard ou qu'un octet de mauvaise parité apparaît), la branche gauche du ternaire correspondant (en affectation à
f
ouc
) s'active et la méthode lève une exception arithmétique.la source
Python 3 (3,4?), 350 octets
Un défi délicat pour un langage aussi particulier sur les espaces blancs que Python 3. La soumission s'imprime
0
ou1
à la sortie standard et plante pour certaines entrées. Le programme s'attend à ce que la dernière ligne soit correctement terminée, c'est-à-dire se termine par un caractère de nouvelle ligne. La dernière ligne du programme est également terminée. UTF-8 est utilisé pour vérifier la parité des octets.Les tabulations sont remplacées par des espaces dans cette vue.
Fonctionne pour moi avec Python 3.4.2; ne fonctionne sur aucun Python 3 sur TIO. Il me semble que c'est un bug dans les interprètes de TIO.
Vidage hexadécimal
Revenez avec
xxd -p -r
sur Unix.la source