Bin ich eine unhöfliche Nummer?


72

Seit einiger Zeit stoße ich beim Zählen auf meinen Fingern auf ein Problem, nämlich dass ich nur bis zehn zählen kann. Meine Lösung für dieses Problem bestand darin, binär auf meinen Fingern zu zählen, meinen Daumen für einen, meinen Zeigefinger für zwei, sowohl Daumen als auch Zeigefinger für drei, usw. Allerdings stoßen wir auf ein kleines Problem, wenn wir dazu kommen die Nummer vier. Insbesondere müssen wir unseren Mittelfinger hochhalten, was zu einer eher unglücklichen Geste führt, die in der Gesellschaft normalerweise nicht akzeptiert wird. Diese Art von Nummer ist eine unhöfliche Nummer . Wir kommen mit 36 ​​zur nächsten unhöflichen Nummer, wenn wir den Daumen auf unserer zweiten Hand und den Mittelfinger unserer ersten Hand heben. Die Definition einer unhöflichen Zahl ist jede Zahl, die unter diesem Zählsystem dazu führt, dass wir nur setzender Mittelfinger einer Hand. Sobald wir 1023 erreicht haben (die maximale Anzahl, die bei einer Person mit zwei Händen zu je fünf Fingern erreicht werden kann), nehmen wir an, dass wir mit einer dritten Hand fortfahren und bei Bedarf weitere Hände hinzufügen.

Deine Aufgabe:

Schreiben Sie ein Programm oder eine Funktion, die eine Eingabe empfängt und einen Wahrheits- / Falschwert ausgibt, basierend darauf, ob die Eingabe eine unhöfliche Zahl ist.

Eingang:

Eine ganze Zahl zwischen 0 und 10 9 (einschließlich).

Ausgabe:

Ein wahrer / falscher Wert, der angibt, ob die Eingabe eine unhöfliche Zahl ist.

Testfälle:

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

Wertung:

Das ist , also gewinnt die niedrigste Punktzahl in Bytes.


43
assume we continue with a third handWenn es darum geht, unhöflich zu sein, lässt Teamwork den Traum wahr werden.
Veskah

5
@Veskah stellt sich heraus, dass für die Grenzen der Frage nur 3 Personen erforderlich sind, um eine bestimmte Zahl zu erstellen. Sicher schlägt die alte Art, an den Fingern zu zählen.
Gryphon

12
Es ist schlimmer, wenn Sie Brite sind - 6 ist dann auch unhöflich!
Matthew

1
Ist es in Ordnung, Eingaben in einer anderen Basis als 10 vorzunehmen?
Wastl

2
5 scheint auch ziemlich unhöflich. Ich
bin

Antworten:



17

Regex (ECMAScript), 37 Bytes

Die Eingabe ist als Länge einer Zeichenfolge von xs unär.

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

Probieren Sie es online!

^
(
    (?=(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
Ich dachte, ich kenne Regex, aber anscheinend nicht.
CT Hall



8

Ruby, 36 19 Bytes

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

Probieren Sie es online!

17 Bytes mit @tshs Methode gespeichert .


Dies gibt true für 2207 zurück, das eine binäre Darstellung von100010011111
Ausführungsform der Ignoranz

@EmbodimentofIgnorance Das ist das richtige Ergebnis, nicht wahr? Die zweite Hand ist 00100.
Türknauf

Ich spreche kein Ruby. Aber warum nicht ->n{n.to_s(32)=~/4/}?
Dienstag,

1
@tsh, weil ich nicht so schlau bin wie du :)
Türklinke

Verzeihen Sie mir, wenn ich die Frage nicht verstehe, aber nicht die erste Hand von 2207 10001, die zweite 00111und die dritte 11? Keiner von ihnen hat nur den Mittelfinger nach oben
Verkörperung der Ignoranz

8

APL + WIN, 10 Bytes

Fordert zur Eingabe einer Ganzzahl auf

4∊(6⍴32)⊤⎕

Zur Darstellung von 10 ^ 9-Konvertierungen von 6 Elementen der Basis-32-Darstellung in einen Vektor sind sechs Hände erforderlich, und es wird geprüft, ob in einem Element eine 4 vorhanden ist.


6

Perl 6 , 16 Bytes

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

Probieren Sie es online!

Überprüft, ob 4in der Basis 32 eine Darstellung der Nummer vorhanden ist. Gibt entweder Nil als false oder eine Übereinstimmung mit a zurück 4.

Sie können dies durch die Tatsache beweisen, dass so dass jede Ziffer der Zustand jeder Hand ist.25=32



6

x86-Maschinencode, 17 Byte

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

Das obige Bytes definiert eine Funktion, die die Zahl als Eingabe in den Takes EAXRegistern und gibt das Ergebnis als einen Booleschen Wert in dem EAXRegister ( EAX== 0 , wenn der Eingang nicht eine grobe Zahl; EAX! = 0 , wenn der Eingang ist eine grobe Zahl ).

In lesbaren Assembler-Mnemoniken:

; 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

Probieren Sie es online!


1
Interessante Idee zu verwenden idiv. Ich sehe keine inkrementellen Verbesserungen. Aber siehe meine Antwort : 14 Bytes für eine Schiebeschleife, die MOV / AND / SUB / JZ verwendet, um die niedrigen 5 Bits auf Grobheit zu prüfen.
Peter Cordes



4

Katholikon , 4 Bytes

ǔ?QǑ

Nimmt eine Zahl als Basis-256-Zeichenfolge.

Probieren Sie es online!

Testsuite


2
Hm, wenn das erlaubt ist, darf man dann stattdessen Zahlen in der Basis 32 akzeptieren?
rekursiv

@recursive Sie können die Zahlen in <<und einschließen >>und es können Zahlen größer als 255 eingegeben werden , wie in der Testsuite gezeigt.
Ok,

1
Es war als Frage zur Herausforderung gedacht, aber es war nicht sehr klar.
rekursiver

4

C # (Visual C # Interactive Compiler) , 31 Byte

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

Ausgabe durch Auslösen einer Ausnahme. Die Art und Weise, wie Sie eine Zahl von einer Dezimalzahl in eine andere Basis umwandeln, besteht darin, die Dezimalzahl wiederholt durch diese Basis zu teilen und den Rest als Ziffer zu nehmen. Das ist, was wir tun, und wir prüfen, ob eine der Ziffern einen Wert von 4 in Basis 32 hat;

Probieren Sie es online!


27? als Bonus wird es nicht auf seltsame Weise ausgegeben
ASCII

1
auch was ist tplig
ASCII

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


1
Ob ein Programm angehalten wird oder nicht, ist keine zulässige Ausgabemethode . Die Ausgabe über Ausnahme ist zulässig.
Deadcode


3

R , 50 48 Bytes

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

Probieren Sie es online!

Verwendet jetzt einen ordentlichen matrixbasierten Ansatz (mit freundlicher Genehmigung von @Giueseppe). Es generiert eine 5x7-Bitmatrix, konvertiert diese in eine Reihe von Basis-32-Ganzzahlen und prüft, ob 4s vorliegen.


@ Giuseppe Hoppla, das habe ich komplett verpasst. Sollte jetzt funktionieren, wenn auch enttäuschenderweise 19 Bytes länger. Ich glaube nicht, dass es eine andere Umkehrfunktion zu strtoi gibt als für hexadezimal und oktal in der Basis R
Nick Kennedy

48 Bytes mit etwas Matrixmagie. Ich glaube, die Bit-Konvertierung ist länger als, intToBitsaber dann können wir damit arbeiten, intsanstatt rawein Byte zu speichern - siehe zum Beispiel dies mitintToBits
Giuseppe

@ Giuseppe es ist eine völlig andere (und saubere) Lösung als meine - willst du, dass ich meine aktualisiere oder postest du deine eigene?
Nick Kennedy

Du kannst es nehmen. :-)
Giuseppe

1
Natürlich 4beträgt die Portierung einer der vielen Antworten, die auf das Vorhandensein einer Ziffer in einer Basis-32-Zahl prüfen, 29 Byte .
Giuseppe



2

Holzkohle , 6 Bytes

№⍘N³²4

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Gibt -s entsprechend der Unhöflichkeit der Nummer aus. Erläuterung:

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

Ich verwende die String-Basisumwandlung, um zu vermeiden, dass die numerischen Literale für 32und getrennt werden müssen 4.




2

Cubix , 26 Bytes

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

Probieren Sie es online!

Wickelt sich wie folgt auf einen Würfel mit Kantenlänge 3

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

Schau es dir an

Eine ziemlich einfache Implementierung ohne alle Weiterleitungen:

  • IS startet das Programm durch Drücken der Eingabe und 32 auf den Stapel
  • %4-! Ruft den Rest ab und überprüft durch Subtraktion, ob es 4 ist
  • 1O@ Ausgabe 1 wenn es 4 war und halt
  • ;;, Bereinigen Sie den Stapel und führen Sie eine Ganzzahlenteilung durch
  • p;? Bereinigen Sie den Boden des Stapels und überprüfen Sie das Div-Ergebnis auf 0
  • O@ Wenn Div Ergebnis Null Ausgabe und Halt
  • s Tauschen Sie die Oberseite des Stapels aus und beginnen Sie mit Schritt 2 oben

2

MATL , 8 Bytes

32YA52=a

Probieren Sie es online!


@ Luis Ich kann das definitiv fallen lassen G(nicht sicher, warum ich es überhaupt aufgenommen habe), aber das ist nur ein Byte (danke, dass du das entdeckt hast !). Ändern 32YA52auf 32_YA4ist die gleiche Anzahl von Bytes richtig?
Sanchises

Ah ja, ich kann nicht zählen
Luis Mendo

2
@ Luis Count? Wer muss zählen, wenn Sie können'32_YA4'n'32YA52'n-
Sanchises

2

Batch, 77 45 Bytes

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

Basierend auf diesen kleinen Drehereien . Erläuterung: Aufgrund des begrenzten Bereichs (30 Bit) der Eingabe, die unterstützt werden muss, müssen nur 6 Hände überprüft werden. Die magische Zahl mentspricht der 111111Basis 32, sodass die erste Operation die unhöflichen Bits in der eingegebenen Zahl umschaltet. Es bleibt dann zu finden, welche der 6 Hände jetzt Null ist.


2

x86-Maschinencode, 14 Byte

(Derselbe Maschinencode funktioniert in 16-Bit, 32-Bit und 64-Bit. Im 16-Bit-Modus werden AX und DI anstelle von EAX und EDI im 32- und 64-Bit-Modus verwendet.)

Algorithmus: Überprüfen Sie die niedrigen 5 Bits mit x & 31 == 4, und verschieben Sie sie dann nach rechts um 5 Bits. Wiederholen Sie den Vorgang, wenn das Ergebnis der Verschiebung nicht Null ist.

Aufrufbar von C char isrude(unsigned n);gemäß der x86-64-System-V-Aufrufkonvention. 0 ist wahr, nicht 0 ist falsch (dies ist asm, nicht 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

Dies nutzt die op al, imm8Kurzkodierung für AND und SUB. Ich hätte XOR al,40 auf Gleichheit erzeugen können, aber SUB ist schneller, weil es mit JZ in einem einzigen Unter- und Zweig-UOP auf der Sandybridge-Familie makrofusionieren kann.

Tolles Faktum: Die Verwendung des Flaggenergebnisses einer Schicht um mehr als 1 ist in der P6-Familie langsam (Front-End-Verzögerungen bis die Schicht ausfällt), aber das ist in Ordnung.


Fußnote 1: Dies ist eine Assemblersprachenfunktion, und x86 asm verfügt über beides, jzund jnzdaher kann ich gemäß Meta eine der beiden Möglichkeiten wählen. Ich habe nicht vor, dass dies mit C wahrheitsgemäß / falsch übereinstimmt.

Es war praktisch, AL anstelle von EFLAGS zurückzugeben, damit wir die Funktion einem C-Compiler ohne Wrapper beschreiben können, aber meine Wahl von truthy / falsy ist nicht durch die Verwendung eines C-Aufrufers zum Testen eingeschränkt.


2

ES6, 31 30 26 Bytes

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

Sie können gerne Vorschläge machen, wie Sie dies gegebenenfalls weiter reduzieren können.


Willkommen bei PPCG!
Laikoni

Sie brauchen den Namen Ihrer Funktion nicht zu zählen, und obwohl ich denke, Sie können ein Byte mit speichern test, können Sie tatsächlich zwei Bytes speichern, indem Sie gegen 4eine Zahl abgleichen und matchdiese in einen String und dann einen RegExp für Sie konvertieren lassen .
Neil

1

Retina 0.8.2 , 31 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Gibt Null aus, sofern die Nummer nicht unhöflich ist. Wandelt die Eingabe in eine unäre und dann in eine unärkodierte Basis 32 um und zählt die Anzahl der 4s im Ergebnis.



1

> <> 28 Bytes

Ausgabe 4 für unhöfliche Zahlen löst eine Ausnahme für nicht unhöfliche Zahlen aus.

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

Probieren Sie es online!


1
Eine Ausnahme ist akzeptabel, die C # -Antwort erledigt dies
ASCII

1

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

-2 Bytes von Jonathan Frech

#~IntegerDigits~32~MemberQ~4&

Probieren Sie es online!

31-Byte-Lösung:

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

Probieren Sie es online!


Hallo und willkommen bei PPCG. So wie es aussieht, ist Ihr Ausdruck ein einzelner Boolescher Wert. Bitte geben Sie als Antwort entweder ein vollständiges Programm oder eine Funktion an ( ...#...&wird in Mathematica häufig verwendet).
Jonathan Frech

Hallo. Ist es das was du meinst?
Rainer Glüge

Verwenden Sie tio.run/#mathematica anstelle von W | A, um sicherzustellen, dass es sich um einen gültigen Mathematica-Code handelt: P und Sie brauchen das [n]am Ende nicht, sondern nur das &. Da die Beiträge einen Bearbeitungsverlauf haben, ist es in Ordnung, vorherige Einträge wegzulassen, und die Konvention für alte Partituren lautet<s>40</s> <s>36</s>
ASCII -

Ja. Das habe ich gemeint. 29 Bytes .
Jonathan Frech

Ich denke, ich muss mich erst an den funktionalen Programmierstil gewöhnen.
Rainer Glüge

1

Java 8, 28 22 21 Bytes

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

Inspiriert von der Antwort von @ kevin-cruijssen . Funktioniert nur für 2 Hände.

Probieren Sie es online!

Erläuterung:

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

Ich bin mir ziemlich sicher, dass Antworten mit beiden Händen funktionieren müssen
Verkörperung der Ignoranz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.