Suis-je un nombre grossier?


72

Cela fait un moment que je rencontre un problème en comptant sur mes doigts, en particulier que je ne peux compter que dix. Ma solution à ce problème a été de compter en binaire sur mes doigts, en plaçant mon pouce pour un, mon index pour deux, les deux pouce et index pour trois, etc. Cependant, nous rencontrons un petit problème lorsque nous arrivons à le nombre quatre. Plus précisément, cela nécessite que nous levions le majeur, ce qui entraîne un geste plutôt malheureux, ce qui n’est généralement pas accepté dans la société. Ce type de numéro est un nombre grossier . Nous arrivons au prochain chiffre impoli à 36 ans, lorsque nous levons le pouce de notre seconde main et le majeur de notre première main. La définition d'un nombre brut est un nombre qui, dans ce système de comptage, a pour résultat que nous n'émettons quele majeur de n'importe quelle main. Une fois que nous avons passé 1023 (le nombre maximum accessible sur une personne, avec deux mains de cinq doigts chacune), supposons que nous poursuivions avec une troisième main, avec des mains supplémentaires ajoutées si nécessaire.

Ta tâche:

Ecrivez un programme ou une fonction qui reçoit une entrée et génère une valeur vérité / fausseté selon que l'entrée est un nombre brut ou non.

Contribution:

Un entier compris entre 0 et 10 9 (inclus).

Sortie:

Une valeur vérité / fausseté qui indique si l'entrée est un nombre grossier.

Cas de test:

Input:    Output:
0   --->  falsy
3   --->  falsy
4   --->  truthy
25  --->  falsy
36  --->  truthy
127 --->  falsy
131 --->  truthy

Notation:

C'est le , donc le score le plus bas en octets l'emporte.


43
assume we continue with a third hand, Quand il s’agit d’être impoli, le travail d’équipe réalise le rêve.
Veska

5
@Veskah s'avère que pour répondre à la question, il suffit de 3 personnes pour composer un nombre donné. Bien sûr bat le vieux genre de compter sur les doigts.
Gryphon - Réintégrer Monica le

12
C'est pire si vous êtes britannique - 6 c'est impoli aussi!
Matthew

1
Est-il acceptable de prendre des entrées dans une base différente de 10?
wastl

2
5 semble assez impoli aussi. Pas sûr que quiconque dirait "Oh, elle a eu son pouce, c'est parfaitement poli"
ale10ander

Réponses:



17

Regex (ECMAScript), 37 octets

L'entrée est unaire, comme la longueur d'une chaîne de xs.

^((?=(x+)(\2{31}x*))\3)*(x{32})*x{4}$

Essayez-le en ligne!

^
(
    (?=(x+)(\2{31}x*))    # \2 = floor(tail / 32); \3 = tool to make tail = \2
    \3                    # tail = \2
)*                        # Loop the above as many times as necessary to make
                          # the below match
(x{32})*x{4}$             # Assert that tail % 32 == 4

13
Je pensais que je connaissais regex, mais apparemment pas.
CT Hall



8

Ruby, 36 19 octets

->n{n.to_s(32)[?4]}

Essayez-le en ligne!

Enregistré 17 octets avec la méthode de @tsh .


Ceci est vrai pour 2207, qui a une représentation binaire de100010011111
Embodiment of Ignorance

@EmbodimentofIgnorance C'est le bon résultat, n'est-ce pas? La trotteuse est 00100.
Poignée de porte

Je ne parle pas Ruby. Mais pourquoi pas ->n{n.to_s(32)=~/4/}?
Tsh

1
@th parce que je ne suis pas aussi intelligent que toi :)
Poignée de porte

Pardonnez-moi si je ne comprends pas la question, mais la première main de 2207 10001, la deuxième 00111et la troisième ne sont-elles pas 11? Aucun d’entre eux n’a le majeur levé
Incarnation de l’Ignorance

8

APL + WIN, 10 octets

Invites pour la saisie d'un entier

4∊(6⍴32)⊤⎕

En notant six mains sont nécessaires pour représenter 10 ^ 9 convertis en vecteur de 6 éléments de la représentation de base 32 et vérifie si un 4 existe dans un élément.


6

Perl 6 , 16 octets

{.base(32)~~/4/}

Essayez-le en ligne!

Vérifie s'il existe une 4représentation du nombre dans la base 32. Renvoie Nil comme faux ou une correspondance contenant un 4.

Vous pouvez le prouver par le fait que sorte que chaque chiffre correspond à l'état de chaque main.25=32



6

Code machine x86, 17 octets

6A 20 59 85 C0 74 09 99 F7 F9 83 FA 04 75 F4 91 C3

Les octets ci-dessus définissent une fonction qui prend le nombre en entrée dans le EAXregistre et renvoie le résultat sous forme de valeur booléenne dans le EAXregistre ( EAX== 0 si l'entrée n'est pas un nombre brut;! EAX= 0 si l'entrée est un nombre brut ).

En mnémotechnique d'assemblage lisible par l'homme:

; Determines whether the specified number is a "rude" number.
; Input:    The number to check, in EAX
; Output:   The Boolean result, in EAX (non-zero if rude; zero otherwise)
; Clobbers: ECX, EDX
IsRudeNumber:
    push    32           ; \ standard golfing way to enregister a constant value
    pop     ecx          ; /  (in this case: ECX <= 32)
CheckNext:
    test    eax, eax     ; \ if EAX == 0, jump to the end and return EAX (== 0)
    jz      TheEnd       ; /  otherwise, fall through and keep executing
    cdq                  ; zero-out EDX because EAX is unsigned (shorter than XOR)
    idiv    ecx          ; EAX <= (EAX / 32)
                         ; EDX <= (EAX % 32)
    cmp     edx, 4       ; \ if EDX != 4, jump back to the start of the loop
    jne     CheckNext    ; /  otherwise, fall through and keep executing
    xchg    eax, ecx     ; store ECX (== 32, a non-zero value) in EAX
TheEnd:
    ret                  ; return, with result in EAX

Essayez-le en ligne!


1
Idée intéressante à utiliser idiv, cependant. Je ne vois aucune amélioration incrémentielle à cela. Mais voir ma réponse : 14 octets pour une boucle de décalage qui utilise MOV / AND / SUB / JZ pour vérifier l’état grossier des 5 bits les plus bas.
Peter Cordes



4

Catholicon , 4 octets

ǔ?QǑ

Prend un nombre en tant que chaîne en base 256.

Essayez-le en ligne!

Suite de tests


2
Hm, si cela est autorisé, est-il autorisé à accepter les numéros en base 32 à la place?
récursif

@recursive Vous pouvez entourer les nombres en <<et >>. Cela permet des nombres supérieurs à 255, comme indiqué dans la suite de tests.
Okx

1
C'était une question sur le défi, mais ce n'était pas très clair.
récursif

4

C # (compilateur interactif Visual C #) , 31 octets

n=>{for(;n>0;n/=n%32==4?0:32);}

Les sorties en lançant une exception. Pour convertir un nombre décimal en une autre base, divisez le nombre décimal par cette base à plusieurs reprises et prenez le reste sous forme de chiffre. C'est ce que nous faisons et nous vérifions si l'un des chiffres a une valeur de 4 en base 32;

Essayez-le en ligne!


27? en prime, il ne produit pas de manière étrange
ASCII uniquement

1
aussi ce qui est tplig
ASCII seulement

@ ASCII uniquement n>31->n>0
tsh


1
Qu'un programme soit arrêté ou non n'est pas une méthode de sortie autorisée . La sortie via exception est autorisée.
Deadcode


3

R , 50 48 octets

any(2^(0:4)%*%matrix(scan()%/%2^(0:34)%%2,5)==4)

Essayez-le en ligne!

Utilise maintenant une approche nette basée sur une matrice (avec la permission de @Giueseppe). Il génère une matrice de bits 5x7, la convertit en une série d’entiers de base 32 et vérifie la présence de 4s.


@ Giuseppe Oops, complètement raté cela. Devrait fonctionner maintenant, bien que décevant 19 octets de plus. Je ne pense pas qu'il y ait une fonction inverse dans strtoi autre que pour hexadécimal et octal en base R
Nick Kennedy

48 octets avec un peu de magie matricielle. Je crois que la conversion de bits est plus longue que ce n'est pas le cas, intToBitsmais nous pouvons alors travailler avec intsau lieu de rawsauver un octet - voyez par exemple ceci avecintToBits
Giuseppe

@ Giuseppe c'est une solution complètement différente (et soignée) de la mienne - voulez-vous que je mette à jour la mienne ou vous postez la vôtre?
Nick Kennedy

vous êtes libre de le prendre. :-)
Giuseppe

1
Bien sûr, le portage de l'une des nombreuses réponses testant la présence d'un chiffre 4dans un nombre en base 32 correspond, quant à lui, à 29 octets .
Giuseppe



2

Charbon de bois , 6 octets

№⍘N³²4

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Sorties -s en fonction de la grosseur du nombre. Explication:

  N     Input as a number
 ⍘      Convert to base as a string
   ³²   Literal 32
№       Count occurrences of
     4  Literal string `4`

J'utilise la conversion de base de chaîne pour éviter d'avoir à séparer les littéraux numériques pour 32et 4.




2

Cubix , 26 octets

u!@-W14;OIS%/\;;,p;?wO@u/s

Essayez-le en ligne!

S'enveloppe sur un cube de longueur d'arête 3 comme suit

      u ! @
      - W 1
      4 ; O
I S % / \ ; ; , p ; ? w
O @ u / s . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Regarde le courir

Une implémentation assez basique, sans toutes les redirections:

  • IS lance le programme en poussant l'entrée et 32 ​​dans la pile
  • %4-! récupère le reste et vérifie si c'est 4 par soustraction
  • 1O@ sortie 1 s'il était 4 et arrêter
  • ;;, nettoyer la pile et faire une division entière
  • p;? nettoie le bas de la pile et vérifie le résultat de div pour 0
  • O@ si div résultat est nul et s'arrête
  • s permutez le haut de la pile et recommencez à l'étape 2 ci-dessus

2

MATL , 8 octets

32YA52=a

Essayez-le en ligne!


@Luis je peux certainement laisser tomber le G(je ne sais pas pourquoi je l'ai inclus en premier lieu) mais ce n'est qu'un octet (merci de l'avoir repéré!). Passer 32YA52à 32_YA4est le même nombre d'octets, n'est-ce pas?
Sanchises

Ah oui, je ne peux pas compter
Luis Mendo

2
@Luis Count? Qui a besoin de compter quand vous le pouvez'32_YA4'n'32YA52'n-
Sanchises

2

Lot, 77 45 octets

@cmd/cset/a"m=34636833,n=%1^m*4,(n-m)&~n&m*16

Basé sur ces bidouilles bidouilleurs . Explication: Seules 6 aiguilles doivent être vérifiées en raison de la plage limitée (30 bits) de l'entrée à prendre en charge. Le nombre magique mest équivalent à 111111en base 32, de sorte que la première opération bascule les bits bruts dans le nombre entré. Il reste ensuite à trouver laquelle des 6 mains est maintenant zéro.


2

code machine x86, 14 octets

(Le même code machine fonctionne en 16 bits, 32 bits et 64 bits. En mode 16 bits, il utilise AX et DI au lieu de EAX et EDI en mode 32 et 64 bits.)

Algorithme: vérifie les 5 bits inférieurs avec x & 31 == 4, puis décale à droite de 5 bits et répète si le résultat du décalage est différent de zéro.

Appelable à partir de C avec char isrude(unsigned n);la convention d'appel System V de x86-64. 0 est la vérité, non-0 est la fausseté (c'est asm, pas C 1 ).

 line   addr    code bytes
  num
     1                             ; input:  number in EDI
     2                             ; output: integer result in AL: 0 -> rude, non-zero non-rude
     3                             ; clobbers: RDI
     4                         isrude:
     5                         .check_low_bitgroup:
     6 00000000 89F8               mov    eax, edi
     7 00000002 241F               and    al, 31          ; isolate low 5 bits
     8 00000004 2C04               sub    al, 4           ; like cmp but leaves AL 0 or non-zero
     9 00000006 7405               jz    .rude            ; if (al & 31 == 4) return 0;
    10                         
    11 00000008 C1EF05             shr    edi, 5
    12 0000000B 75F3               jnz   .check_low_bitgroup
    13                             ;; fall through to here is only possible if AL is non-zero
    14                         .rude:
    15 0000000D C3                 ret


    16          0E             size:  db $ - isrude

Cela tire parti du op al, imm8codage abrégé pour AND et SUB. J'aurais peut-être eu l'habitude XOR al,4de produire 0 sur l'égalité, mais SUB est plus rapide car il peut fusionner avec JZ en une seule sous-branche sur la famille Sandybridge.

Anecdote: utiliser le drapeau d'une journée avec plus d'un joueur sera lent sur la famille P6 (stalles avant le départ à la retraite), mais c'est correct.


Référence 1: Il s'agit d'une fonction de langage d'assemblage, et x86 asm possède les deux jzet jnz, de sorte que, conformément à la méta, je peux choisir l'une ou l'autre solution. Je n’ai pas l’intention de faire correspondre cette vérité à la vérité.

Il est très pratique de retourner en AL au lieu d’EFLAGS afin de pouvoir décrire la fonction à un compilateur C sans encapsuleur, mais mon choix de vérité / fausseté n’est pas contraint par l’utilisation d’un appelant C pour le tester.


2

ES6, 31 30 26 octets

b=>b.toString(32).match`4`

N'hésitez pas à dire des idées sur la façon de réduire cela, le cas échéant.


Bienvenue chez PPCG!
Laikoni

Vous n'avez pas besoin de compter le nom de votre fonction, et bien que je pense que vous puissiez enregistrer un octet à l'aide de test, vous pouvez en réalité enregistrer deux octets en faisant 4une correspondance avec un nombre et en le matchconvertissant en chaîne, puis en RegExp pour vous. .
Neil

1

Retina 0.8.2 , 31 octets

.+
$*
+`(1+)\1{31}
$1;
\b1111\b

Essayez-le en ligne! Le lien inclut des cas de test. Affiche zéro sauf si le nombre est grossier. Fonctionne en convertissant l'entrée en base unaire puis en base 32 codée unaire et en comptant le nombre de 4s dans le résultat.




1

Wolfram Language (Mathematica) , 37 octets 36 octets 29 octets

-2 octets par Jonathan Frech

#~IntegerDigits~32~MemberQ~4&

Essayez-le en ligne!

Solution de 31 octets:

MemberQ[IntegerDigits[#,32],4]&

Essayez-le en ligne!


Bonjour et bienvenue sur PPCG. Dans l'état actuel des choses, votre expression est une valeur booléenne unique. Veuillez indiquer si votre réponse est un programme complet ou une fonction ( ...#...&souvent utilisée dans Mathematica).
Jonathan Frech

Salut. C'est ce que tu veux dire?
Rainer Glüge le

Veuillez utiliser tio.run/#mathematica au lieu de W | A pour vous assurer que le code mathematica est valide: P et que vous n’avez pas besoin [n]de la fin, mais de la &. De plus, étant donné que les articles ont l'historique des modifications, il est bon de laisser de côté les entrées précédentes, et la convention pour les anciens scores est<s>40</s> <s>36</s>
ASCII seulement

Oui. C'est ce que je voulais dire. 29 octets .
Jonathan Frech

Je suppose que je dois m'habituer au style de programmation fonctionnelle.
Rainer Glüge

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.