Votre tâche est simple: écrivez un programme qui reçoit un entier en tant qu'entrée et le sort s'il est impair, et ne fait rien sinon (ne pas arrêter est autorisé). Le défi est que vous ne pouvez utiliser que des octets impairs.
Vous pouvez éventuellement ajouter une nouvelle ligne de fin à la sortie.
C'est code-golf, la réponse la plus courte en octets (impairs) gagne.
Les échappatoires standard sont interdites. De plus, vous ne pouvez pas utiliser de versions de langues, qui sont plus récentes que la publication de ce défi.
Exemple d'entrée> sortie:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
la source
la source
does nothing otherwise
signifie exactement ? En Haskell une fonction de typeInt -> Int
retourne un entier ou ne s’arrête pas ou renvoie une erreur. Si la saisie est uniforme, elle ne devrait évidemment pas être renvoyée. Ne pas arrêter ou renvoyer une erreur dans ce cas serait acceptable.alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Vérifiez si la source est valide:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. Voir caractères non valides dans la source:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. N'oubliez pas d'échapper à vos citations,"
=>\"
;)Réponses:
Japt
-f
, 1 octetu
a une valeur de code de caractère de117
.L'essayer
la source
Lenguage ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069758100171520285996319 octetsC'est à peu près égal à 2 duodecillion octets.
Le fichier se traduit par le programme brainfuck suivant:
Prend l'entrée sous forme de code ASCII, avec une valeur maximale de 256. Utilise un wrapping.
la source
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
de seulement 3452857532394791089951 octets?,-[-->++<]>+.
fonctionne aussiCode machine x86-64, 8 octets
Inspiré par la solution de Bruce Forte , mais légèrement en dessous de la normale. :-)
Un seul paramètre entier est pris dans le
EDI
registre, conformément à la convention d'appel System V AMD64.Une copie de cette valeur est initialement créée et insérée
EAX
pour pouvoir être renvoyée le cas échéant. (LEA
est utilisé à la place de la normaleMOV
car nous avons besoin d'une instruction avec des octets impairs.)Ensuite, la valeur dans
EDI
est décalée de 1, ce qui place le bit décalé dans l'indicateur de retenue (CF). Ce bit sera 0 si le nombre était pair, ou 1 s'il était impair.Nous testons ensuite CF en utilisant l’
JNC
instruction, qui ne se branche que si CF est 0 (c’est-à-dire que le nombre était pair). Cela signifie que nous allons entrer dans une boucle infinie pour des valeurs paires. Pour les valeurs impaires, nous échouons et la valeur d'origine (inEAX
) est renvoyée.Il y a un petit truc avec l'
JNC
instruction, cependant - elle a unREP
préfixe! Normalement, lesREP
préfixes ne sont utilisés qu'avec des instructions string, mais comme les manuels d'Intel et d'AMD conviennent que lesREP
préfixes non pertinents / superflus / redondants sont ignorés, nous en jetons un sur l'instruction de branche ici pour lui donner une longueur de 3 octets. De cette façon, le décalage relatif encodé dans l'instruction de saut est également impair. (Et, bien sûr,REP
est lui-même un préfixe d'octet impair.)Dieu merci, il
RET
est encodé avec un octet impair!Essayez-le en ligne!
Si vous pensez ne pas renvoyer la valeur si elle est impaire ou si vous entrez dans une boucle infinie si elle est paire (pour que vous ne retourniez jamais) satisfait aux exigences de sortie du défi, ou si vous voulez juste quelque chose de plus intéressant, voici une fonction qui envoie la valeur sur un port série (mais seulement si c'est impair, bien sûr).
Code machine x86-64 (sortie sur le port série), 17 octets
Ce qui rend cela un peu plus intéressant, c'est que le code en fait plus , ce qui signifie qu'il était plus difficile de tout faire en utilisant des instructions codées en utilisant uniquement des octets impairs. Bien sûr, cela signifie aussi que cela échoue au code golf, donc c'est un peu un compromis - voulez-vous un défi intéressant ou exigeant, ou voulez-vous un court-métrage?
Quoi qu'il en soit, cela utilise l'
OUT
instruction x86 pour écrire sur le port d'E / S 0x3F8, qui est le port série COM1 standard sur un PC. La partie amusante, bien sûr, réside dans le fait que tous les ports d’E / S standard (série et parallèle) ont même une adresse. Ils ne peuvent donc pas simplement être codés comme desOUT
instructions immédiates pour l’ instruction ou être déplacés directement dans un registre. Vous devez initialiser avec un moins que la valeur réelle, puis incrémenter la valeur dans le registre. Vous êtes également limité à l'utilisation de certains registres pour la manipulation, car vous avez besoin de registres codés en utilisant des octets impairs dans l'instruction lorsqu'ils sont utilisés en tant qu'opérandes.De plus, je devais initialiser le
DX
registre (via leCX
registre) en haut de la boucle, même si cela n’est nécessaire que si la valeur est impair, pour que l’JNC
instruction ait un décalage impair. Cependant, puisque nous omettons l’OUT
instruction, ce code ne fait que gaspiller des cycles et des registres de grattage clobber; en réalité , il ne génère rien, il n'enfreint donc pas les règles.Enfin, cette fonction retournera (après avoir fait ou non la sortie vers le port série) avec la valeur d’entrée laissée
EAX
. Mais cela n'enfreint aucune règle; toutes les fonctions en langage assembleur renverront une valeurEAX
- la question est simplement de savoir s'il s'agit d'une valeur significative ou d'une valeur erronée . Cela est déterminé par la documentation de la fonction (en gros, est-ce qu'elle renvoie une valeur ou est-elle renvoyéevoid
), et dans ce cas, je la documente comme ne renvoyant pas de valeur. :-)Pas de lien TIO pour celui-ci, car il n'implémente pas la sortie sur les ports série. Vous aurez besoin d'un vrai fer ou d'une imagination.
la source
MOV
instruction, ses opérandes doivent également être encodés dans les octets. Dans ce cas, il s'agirait des registres source et cible (bien que les opérandes puissent également être des valeurs immédiates, qui ressemblent à des constantes). Différents registres mappent vers différents octets, et certains de ces octets sont pairs. Ainsi, par exemple, ce que je voudrais utiliser seraitmov eax, edi
, mais c’est89 F8
en octets. Voyez bien plus que ce que vous avez toujours voulu savoir sur les encodages , dans la section "code" . @ M.HerzkampGelée , 2 octets
Ces caractères correspondent aux octets 0xF7 et 0xBF dans la page de code de Jelly .
Essayez-le en ligne!
la source
05AB1E , 3 octets
Le code correspond aux valeurs d'octet
C9,69,3D
ou201,105,61
qui sont toutes impaires.Essayez-le en ligne!
Explication
la source
= # print without newline
c'est effectivement imprimer avec newline sans éclaterÉ×
ne semble pas fonctionner):D
devant, mais c'est même et pas plus court. La raison pour laquelle cela ne fonctionne pas, c'est que l'entrée implicite répétée est prise comme 2ème argument.MATL , 3 octets
MATL utilise des caractères ASCII, donc
o?G
correspond à octets (en décimal)111
,63
,71
.Essayez-le en ligne!
Explication
la source
Haskell ,
3633 octetsEssayez-le en ligne!
Utilisation:
o 7
yiedls7
,o 8
entre dans une boucle infinie.L'algorithme actuel est
Le premier problème que j'ai rencontré était le manque d'espace et
(
, parce qu'une fonctiono
qui prend un argumentm
est généralement définie paro m=...
ouo(m)=...
. Cependant, j’ai découvert qu’un commentaire en ligne{- some comment -}
fonctionnait également comme un délimiteur de jeton, de sorte qu’une définitiono{--}m=...
est possible avec les règles données. Ørjan Johansen a souligné que l'on peut utiliser un caractère de tabulation au lieu d'un espace, en économisant trois octets:o m=...
Le deuxième problème était l'appel récursif
o(m-2)
.-2
est juste-1-1
, mais ici l’astuce de commentaire ne fonctionne pas car les parenthèses sont obligatoires. Je fixe ce en laissant le travail de la fonction sur une liste singleton contenant un numéro:o[m-2]
cependant, que ce n'est pas un moyen standard d'apporter une contribution, j'externalisé le calcul d'une fonction d'assistancec
qui fonctionne sur les listes et l' appelc
deo
qui a le format correct .la source
\t
au lieu de{--}
.Python REPL, 38 octets
Prend l'entrée comme valeur de l'expression précédente en utilisant
_
. La sortie sera une chaîne (la représentation sous forme de chaîne de l'entier pour impair, ou la chaîne vide pour paire).Essayez-le en ligne
Pour l'exécuter dans un shell réel, vous pouvez l'essayer ici . Tapez l'entrée, appuyez sur Entrée. Collez le code, appuyez sur Entrée.
Explication:
Cela a pris un certain temps à comprendre. Il n'y a pas de multiplication, pas de branchement, pas de découpage, pas de virgules, pas de points, pas d'importations, pas de parenthèses, non
exec
, noneval
, nonprint
et pas de fonctions. Une solution fonctionnant à l'aide de stderr fonctionnait à cette sortie, mais j'ai alors réalisé que nous devions générer le nombre entier réel, pas seulement une valeur vérité / falsey.J'utilise des crochets au lieu de parenthèses avec
[expression][-1]
. Simplifier cela transforme le code ci-dessus en'%s'%(['']+[_])[_%(1+1)]
.Puisqu'il ne peut y avoir aucune virgule, j'ai utilisé addition de liste pour créer
['',_]
. En utilisant le formatage de chaîne, le résultat souhaité est obtenu.la source
None
serait un meilleur match que''
. Quoi qu'il en soit, c'est toujours 10000 fois meilleur que tout ce que je pourrais trouver.False
. Idk comment vous pourriez obtenirNone
, cependant.CJam, 6 octets
113
95
105
89
37
37
Ce programme prend le mod 2 de l'entrée (appelez-le r ) et imprime chaque r ème caractère de la chaîne d'entrée. Si le nombre saisi est impair, la chaîne entière est imprimée, mais si le programme doit imprimer tous les 0 caractères, le programme génère une erreur.
Essayez-le ici
la source
qi_Y%]W%{}/M?
et puis j'ai vu cela.Cubix ,
231917 octetsEssayez le!
@
, qui termine un programme Cubix, est ascii 64, donc malheureusement cela ne fait que rentrer dans une boucle infinie après le test de bizarrerie. Pas de lien TIO puisqu'il va expirer.=
(ascii 61) est un no-op dans Cubix.Il s’agit d’une légère modification de l’algorithme antérieur (même nombre d’octets) qui fonctionne pour les entiers négatifs.
Version Cube:
Algorithme:
I
(73)
: lu en entrée sous forme de numéro1
(49)
: poussez 1)
(41)
: incrément%
(37)
: prenez le mod/
(47)
: tournez à gauche!
(33)
: saute l'instruction suivante si elle est impaire1;;/;
;
is(59)
: prépare la pile pour la sortieO
(79)
: Sortie sous forme de nombre.I
lit une0
fin de saisie, nous avons donc la garantie d'entrer dans la branche paire.u
(117)
: demi-tour à droite;;;!I
: boucle, ne fait effectivement rien.la source
?
Charbon de bois , 9 octets
Essayez-le en ligne!
Fondamentalement, l’impression est imprimée vers la droite si elle n’est pas un multiple de 10/5 (le caractère
²
est même dans la page de code Charcoal ). Les caractères utilisés sont:¿
: codeBF
.﹪
: codeA5
.I
: codeC9
.θ
: codeF1
.÷
: codeAF
.χ
: codeE3
.⁵
: codeB5
.→
: code13
.En fait, la
→
fin est redondante, mais j’ai vu que la réponse devait avoir une longueur étrange ...Explication:
la source
→θ
.Code machine x86_64 (Linux),
12 à11 octetsMalheureusement,
0x80
c'est égal, mais ça marche quand même (en supposant que "ne fait rien" signifie ne pas revenir):-1 octet, merci @CodyGray!
Essayez-le en ligne!
la source
lea (%edi),%eax
nécessite un préfixe de substitution de taille d'adresse (0x67
) lorsque la source est un registre 32 bits. Vous pouvez éliminer cela en faisantlea (%rdi),%eax
. Cela économise un octet et rendrait le code légèrement plus efficace (les préfixes ralentissent le décodage et remplissent le cache i-cache). Il y a d'autres choses que vous pouvez faire pour réduire cela encore plus, mais cela constitue essentiellement une réécriture complète, alors je posterai ma propre réponse. :-) J'ai voté pour ça aussi, bien sûr! (Oh, je viens juste de réaliser que vous avez peut-être utilisé le préfixe pour rendre le décalage décalé. Eh bien, vous aurez besoin de plus de magie.)F6
) pour l'JNE
instruction car il a un décalage pair. C'est ce que je voulais dire par la dernière parenthèse que j'ai modifiée dans mon premier commentaire. Vous avez en fait besoin de ce préfixe pour créer un alignement impair. Ou vous devez réécrire le code d'une autre manière. J'ai joué avec un tas de variations différentes. En fait, j’ai examiné la question la nuit dernière et j’essayais de trouver un bon moyen d’utiliserOUT
des valeurs impaires, mais aucune bonne solution ne m’a vraiment parue. L’idée ici est pour moi d’aller dans une boucle infinie pour des valeurs paires.BT
famille d'instructions, que personne n'utilise jamais (malheureusement, tous les encodages de registre sont même des octets). J’ai pensé qu’il serait peut-être plus intéressant d’écrire du code qui sortira sur un port série, plutôt que de simplement renvoyer une valeur ou autre chose, mais cela permet de prendre en compte le nombre d’octets (surtout que les adresses de port série en hexa sont même!), Alors je abandonné là-dessus.Mathematica, 20 octets
Semblent être la première solution dans une langue autre que le golf.
En
MacintoshChineseTraditional
encodage de caractères.\[Divides]
est{161, 253}
(2 octets)Version alternative (23 octets)
ou (affiché en Unicode)
en
Symbol
encodage de caractères. (utilisez uniquement des caractères de 1 octet)La solution définit une fonction
g
(ouΓ
) qui, évalue en entrée lorsque l'entrée est impaire, et littéralement "ne fait rien" (n'évalue pas) lorsque l'entrée est paire.la source
;
à la fin) si le nombre d'octets doit être pair; et\[Divides]
aussi avoir bizarre code codé Unicode.I[1+1]
, vous pouvez simplement utiliser{1+1}
. Aussi, avez-vous vérifié si les octets des supports de revêtement de sol sont valides? Si oui, vous pouvez obtenir2
de\[LeftFloor]E\[RightFloor]
.Symbol
plancher, mais il n'a niE
ni\[ExponentialE]
.D
.v
; nid
, car ils ont une valeur d'octet pair .. :(\[Divides]
est un seul caractère dans Mathematica, qui est représenté par 2 octets{161, 253}
.Perl, 54 octets
Nécessite
-E
.J'ai vraiment beaucoup aimé ce défi, je pense que j'aimerais essayer d'améliorer cette réponse, mais je pense que c'est peut-être le plus court que je puisse faire pour le moment. Cela fait quelques jours que je joue avec ces réponses, mais je me sens satisfait de la solution à 54 octets!
Essayez-le en ligne!
Explication
Par défaut, la plupart des fonctions de chaîne de Perl fonctionnent
$_
, ce qui est vide pour commencer.Tout d'abord,
s//A_=Y[;A_=A_%O?A_W''/
remplace la chaîne vide par$_
avecA_=Y[;A_=A_%O?A_W''
, puisy/#A-_/#-A/
remplace les caractères en fonction de la liste suivante (le caractère ci-dessus devient le caractère ci-dessous):qui met
$_
à jour pour contenir$_=<>;$_=$_%2?$_:''
. Suivants/[#-}]+/uc/ee
remplace tous les caractères[#-}]+
avecuc
. Sans le/ee
ce serait juste la chaîneuc
, mais/ee
évalue le contenu de la chaîne deux fois. La première évaluation renvoie le résultat deuc
, qui est une version majuscule de$_
mais$_
ne contient aucun caractère alphabétique, elle renvoie simplement la chaîne entière, puis la seconde/e
évalue à nouveau la chaîne, qui est définie$_
sur$_
(le nombre d'entrée) ou''
selon que pas le nombre est impair ou pair.Enfin, depuis
$_
contient maintenant ce que nous voulons, nous appelonssay
(ce qui est-E
au lieu de-e
) des impressions$_
suivies d’une nouvelle ligne.Alternative Perl, 93 octets
Code de 92 octets + 1 pour
-p
, ce qui, à mon avis, le rendrait non concurrentiel.Contient un onglet et un onglet vertical dans le
y///
, indiqués par\x09
et\x0b
.Essayez-le en ligne!
la source
LOGO ,
390465250 octetsC'est une liste de modèles qui renvoie l'entrée si l'entrée est impaire et provoque une erreur si l'entrée est paire.
Usage:
sortie
puisque 5 est impair, et
causera une erreur parce que 6 est pair.
la source
TI-BASIC, 14 octets
Cela jette une erreur de domaine (aucune impression sur l’écran d’accueil) sur un nombre pair.
la source
Pyth ,
1411109 octetsSuite de test .
la source
I%Qy1Q
travailler aussi?y1
... Cependant,%
n'est pas autorisé, malheureusement.%
a la valeur ascii 37 et est impair.Japt , 4 octets
Japt utilise ISO / IEC 8859-1 , donc cela correspond à (en décimal)
117 41 231 85
.Testez-le en ligne!
Explication
J'ai d'abord essayé des solutions en utilisant
p
, qui est essentiellementç
avec des arguments inversés. Cependant,p
effectue une exponentiation si son argument de gauche est un nombre. Nous devons donc le convertir explicitement en chaîne. Cette solution s'avère en réalité être un octet plus court, en plus de ne contenir aucun octet impair.la source
dc , 21 octets
Décimal:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Conformément à cette valeur par défaut d'E / S, ce programme laisse l'entrée sur la pile principale si elle est impaire et vide la pile sinon. Ceci peut être confirmé en ajoutant le
f
commande debug à la fin du programme, comme c'est le cas sur la page TIO.Essayez-le en ligne!
Explication
la source
TI-Basic, 18 octets
2 octets sauvés grâce à lirtosiast
en octets (+2 nouvelles lignes = 3F)
Voir http://tibasicdev.wikidot.com/one-byte-tokens
la source
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 octets). Puis-je poster en tant que réponse séparée?MathGolf , 3 octets
Essayez-le en ligne!
Les octets utilisés sont
157, 123, 107
.Explication
la source
Bash , 31 octets
Essayez-le en ligne!
Explication:
la source
rd $20|h
et nouvelle ligne.)