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.

Gryphon - Rétablir Monica
la source
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
Deadcode
la source
13
Je pensais que je connaissais regex, mais apparemment pas.
CT Hall
10

Japt , 5 octets

sH ø4

Essayez-le en ligne!

Explication

      // Implicit input
sH    // To a base-H (=32) string
   ø  // Contains
    4 // 4 (JavaScript interprets this as a string)
ASCII seulement
la source
8

Ruby, 36 19 octets

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

Essayez-le en ligne!

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

Poignée de porte
la source
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.

Graham
la source
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

Jo King
la source
6

Python 2 , 34 32 octets

f=lambda a:a%32==4or a>0<f(a/32)

Essayez-le en ligne!

2 octets grâce à tsh

Chas Brown
la source
1
: | vous pouvez éditer des publications, vous le savez bien
ASCII uniquement
Oui; Je connais. C'était un accident! Un accident, je te le dis!
Chas Brown
@tsh Oh, sympa, j'ai oublié ce court
ASCII uniquement
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!

Cody Gray
la source
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

Julia 1.0 , 25 octets

f(n)=n%32==4||n>0<f(n>>5)

Essayez-le en ligne!

Julia 1.0 , 26 octets

Alternative qui a 1 caractère plus court, mais 1 octet plus long, dommage que cela prenne 3 octets en unicode.

n->'4'string(n,base=32)

Essayez-le en ligne!

Kirill L.
la source
Pourriez-vous utiliser n->n%32...votre première réponse pendant 2 octets de moins?
Giuseppe
@ Giuseppe, malheureusement non, cette fonction est récursive.
Kirill L.
4

Catholicon , 4 octets

ǔ?QǑ

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

Essayez-le en ligne!

Suite de tests

Okx
la source
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!

Incarnation de l'ignorance
la source
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
25 octets
Kevin Cruijssen le
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.

Nick Kennedy
la source
@ 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

Python 3 , 43 octets

Vérifie chaque bloc de 5 bits pour voir s'il est grossier (égal à 4).

lambda n:any(n>>5*i&31==4for i in range(n))

Essayez-le en ligne!

Neil A.
la source
* Morceau 5 bits ...
ASCII uniquement
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.

Neil
la source
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
MickyT
la source
2

MATL , 8 octets

32YA52=a

Essayez-le en ligne!

Sanchises
la source
@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.

Neil
la source
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.

Peter Cordes
la source
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.

Elipszilon
la source
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.

Neil
la source
1

Java 8, 40 33 octets

n->n.toString(n,32).contains("4")

Réponse du port de @ Adám (dzaima / APL) .

Essayez-le en ligne.

Explication:

n->                 // Method with Integer parameter and boolean return-type
  n.toString(n,32)  //  Convert the input to a base-32 String
   .contains("4")   //  And check if it contains a "4"
Kevin Cruijssen
la source
1

> <> , 28 octets

Les sorties 4 pour les nombres bruts lève une exception pour les nombres non bruts.

:1(?^:" ":\
,&-v?=4:%&/
 ;n<

Essayez-le en ligne!

Emigna
la source
1
Une exception est acceptable, la réponse C # le fait
ASCII uniquement
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!

Rainer Glüge
la source
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
1

Java 8, 28 22 21 octets

n->n%32==4|n>>5%32==4

Inspiré par la réponse de @ kevin-cruijssen . Ne fonctionne que pour 2 mains.

Essayez-le en ligne!

Explication:

n->                 // Method with int parameter and boolean return-type
  n%32              // Only consider right 5 bytes (fingers)
  ==4               // Middle finger
  | ... n>>5       // Repeat with shifted bits for other hand
Daniel Widdis
la source
Je suis sûr que les réponses doivent fonctionner à deux mains
Incarnation de l'Ignorance