Czy jestem niegrzeczny?

72

Od pewnego czasu mam problem z liczeniem na palcach, a mianowicie, że mogę policzyć tylko do dziesięciu. Moim rozwiązaniem tego problemu było policzenie dwójkowe na moich palcach, odłożenie kciuka na jeden, palca wskazującego na dwa, kciuka i palca wskazującego na trzy itd. Jednak napotykamy na pewien problem, kiedy dojdziemy do numer cztery. W szczególności wymaga od nas podniesienia środkowego palca, co skutkuje raczej niefortunnym gestem, co zwykle nie jest akceptowane w społeczeństwie. Ten typ liczby jest nieuprzejmy . Dochodzimy do kolejnego nieuprzejmego numeru na 36, ​​kiedy podnosimy kciuk na drugiej dłoni i środkowym palcu pierwszej ręki. Definicja nieuprzejmej liczby to dowolna liczba, która w tym systemie liczenia powoduje, że tylko wystawiamyśrodkowy palec dowolnej dłoni. Gdy miniemy 1023 (maksymalna liczba osiągalna dla jednej osoby, dwiema pięcioma palcami każda), załóżmy, że kontynuujemy trzecią rękę, z dodatkowymi rękami dodanymi w razie potrzeby.

Twoje zadanie:

Napisz program lub funkcję, która odbiera dane wejściowe i wyświetla wartość prawda / fałsz na podstawie tego, czy dane wejściowe są liczbą nieuprzejmą.

Wejście:

Liczba całkowita od 0 do 10 9 (włącznie).

Wynik:

Wartość prawda / fałsz wskazująca, czy dane wejściowe są liczbą nieuprzejmą.

Przypadki testowe:

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

Punktacja:

To jest , więc wygrywa najniższy wynik w bajtach.

Gryf
źródło
43
assume we continue with a third handPraca zespołowa sprawia, że ​​sen staje się nieuprzejmy.
Veskah
5
@Weskah okazuje się, że do granic pytania wystarczy tylko 3 osoby, aby podać dowolny numer. Na pewno bije stary sposób liczenia na palcach.
Gryphon
12
Gorzej, jeśli jesteś Brytyjczykiem - wtedy 6 też jest niegrzeczna!
Matthew
1
Czy można wprowadzać dane w innej bazie niż 10?
wastl
2
5 wydaje się też dość niegrzeczna. Nie jestem pewien, czy ktoś powiedziałby „Och, wyciągnęła kciuk, to jest całkowicie grzeczne”
ale10ander

Odpowiedzi:

17

Regex (ECMAScript), 37 bajtów

Dane wejściowe są jednostronne, podobnie jak długość ciągu xs.

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

Wypróbuj 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
Deadcode
źródło
13
Myślałem, że znam regex, ale najwyraźniej nie.
CT Hall
10

Japt , 5 bajtów

sH ø4

Wypróbuj online!

Wyjaśnienie

      // Implicit input
sH    // To a base-H (=32) string
   ø  // Contains
    4 // 4 (JavaScript interprets this as a string)
Tylko ASCII
źródło
8

Ruby, 36 19 bajtów

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

Wypróbuj online!

Zapisano 17 bajtów metodą @tsh .

Klamka
źródło
Zwraca wartość true dla 2207, która ma binarną reprezentację100010011111
Embodiment of Ignorance
@EmbodimentofIgnorance To jest poprawny wynik, prawda? Drugie rozdanie to 00100.
Klamka
Nie mówię po Ruby. Ale czemu nie ->n{n.to_s(32)=~/4/}?
tsh
1
@ ich, bo nie jestem tak sprytny jak ty :)
Klamka
Wybacz mi, jeśli nie rozumiem pytania, ale czy nie pierwsza ręka 2207 10001, druga 00111i trzecia 11? Żaden z nich nie ma środkowego palca tylko w górę
Embodiment of Ignorance
8

APL + WIN, 10 bajtów

Monity o wprowadzenie liczby całkowitej

4∊(6⍴32)⊤⎕

Zauważmy, że sześć rąk jest wymaganych do przedstawienia 10 ^ 9 konwersji na wektor 6 elementów reprezentacji podstawowej 32 i sprawdza, czy 4 istnieje w dowolnym elemencie.

Graham
źródło
6

Perl 6 , 16 bajtów

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

Wypróbuj online!

Sprawdza, czy 4w bazie 32 znajduje się reprezentacja liczby. Zwraca zero jako fałsz lub dopasowanie zawierające 4.

25=32

Jo King
źródło
6

Python 2 , 34 32 bajty

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

Wypróbuj online!

2 bajty dzięki tsh

Chas Brown
źródło
1
: | możesz edytować posty, wiesz to dobrze
tylko ASCII
Tak; Wiem. To był wypadek! Wypadek, powiadam wam!
Chas Brown
@tsh Och, fajnie, zapomniałem, że zwarcia
tylko ASCII
6

Kod maszynowy x86, 17 bajtów

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

Powyższe bajty definiują funkcję, która przyjmuje liczbę jako dane wejściowe do EAXrejestru i zwraca wynik jako wartość logiczną w EAXrejestrze ( EAX== 0, jeśli dane wejściowe nie są liczbą podstawową;! EAX= 0, jeśli dane wejściowe liczbą podstawową ).

W czytelnych dla człowieka mnemonikach zestawu:

; 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

Wypróbuj online!

Cody Gray
źródło
1
Ciekawy pomysł do wykorzystania idiv. Nie widzę w tym żadnych stopniowych ulepszeń. Ale zobacz moją odpowiedź : 14 bajtów na pętlę przesunięcia, która używa MOV / AND / SUB / JZ do sprawdzania niskich 5 bitów pod kątem chamstwa.
Peter Cordes
4

Julia 1.0 , 25 bajtów

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

Wypróbuj online!

Julia 1.0 , 26 bajtów

Alternatywą jest 1 znak krótszy, ale 1 bajt dłuższy, szkoda, że zajmuje 3 bajty w Unicode.

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

Wypróbuj online!

Kirill L.
źródło
czy możesz użyć n->n%32...pierwszej odpowiedzi na 2 bajty krótsze?
Giuseppe
@Giuseppe, niestety nie, ta funkcja jest rekurencyjna.
Kirill L.
4

Catholicon , 4 bajty

ǔ?QǑ

Pobiera liczbę jako łańcuch podstawowy-256.

Wypróbuj online!

Zestaw testowy

Okx
źródło
2
Hm, jeśli jest to dozwolone, to czy można zamiast tego akceptować liczby w bazie 32?
rekurencyjny
@recursive Możesz otoczyć liczby <<i >>pozwala to na liczby większe niż 255, jak pokazano w pakiecie testowym.
Okx
1
Miało to być pytanie o wyzwanie, ale nie było bardzo jasne.
rekurencyjny
4

C # (interaktywny kompilator Visual C #) , 31 bajtów

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

Dane wyjściowe przez zgłoszenie wyjątku. Sposób, w jaki zamieniasz jedną liczbę z dziesiętnej na inną, polega na wielokrotnym dzieleniu liczby dziesiętnej przez tę bazę i przyjmowaniu reszty jako cyfry. To właśnie robimy i sprawdzamy, czy którakolwiek cyfra ma wartość 4 w bazie-32;

Wypróbuj online!

Wcielenie ignorancji
źródło
27? jako bonus nie działa w dziwny sposób
tylko ASCII
1
także co to jest tplig
tylko ASCII
@ Tylko ASCII n>31->n>0
tsh
25 bajtów
Kevin Cruijssen
1
To, czy program się zatrzymuje, nie jest dozwoloną metodą wyjścia . Wyjście przez wyjątek jest dozwolone.
Deadcode
3

R , 50 48 bajtów

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

Wypróbuj online!

Wykorzystuje teraz staranne podejście oparte na macierzy (dzięki uprzejmości @Giueseppe). Generuje matrycę 5x7 bitów, konwertuje ją na szereg liczb całkowitych bazowych 32 i sprawdza, czy są jakieś 4.

Nick Kennedy
źródło
@Giuseppe Oops, całkowicie tego nie zauważyłem. Powinien działać teraz, choć rozczarowująco o 19 bajtów dłużej. Nie sądzę, żeby istniała funkcja odwrotna do strtoi inna niż szesnastkowa i ósemkowa w bazie R
Nick Kennedy
48 bajtów z pewną magią macierzy. Wierzę, że konwersja jest nieco dłuższy niż intToBitsale wtedy możemy pracować intszamiast rawktóra kończy się oszczędność bajt - patrz na przykład ten zintToBits
Giuseppe
@Giuseppe to całkowicie inne (i schludne) rozwiązanie do mojego - chcesz, żebym zaktualizował mój, czy możesz opublikować własne?
Nick Kennedy
możesz to wziąć. :-)
Giuseppe
1
oczywiście przeniesienie jednej z wielu odpowiedzi, które testują obecność cyfry 4w liczbie bazowej 32, to och, 29 bajtów .
Giuseppe
2

Python 3 , 43 bajty

Sprawdza każdy 5-bitowy fragment, aby sprawdzić, czy jest niegrzeczny (równy 4).

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

Wypróbuj online!

Neil A.
źródło
* 5-bitowy fragment ...
Tylko ASCII
2

Węgiel , 6 bajtów

№⍘N³²4

Wypróbuj online! Link jest do pełnej wersji kodu. Wyprowadza -s zgodnie z tym, jak niegrzeczna jest liczba. Wyjaśnienie:

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

Używam konwersji ciągów znaków, aby uniknąć konieczności oddzielania literałów liczbowych dla 32i 4.

Neil
źródło
2

Cubix , 26 bajtów

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

Wypróbuj online!

Owija się w sześcian o długości krawędzi 3 w następujący sposób

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

Zobacz, jak biegnie

Dość podstawowa implementacja, bez wszystkich przekierowań:

  • IS inicjuje program, przesuwając wejście i 32 na stos
  • %4-! pobiera resztę i sprawdza, czy wynosi 4 przez odjęcie
  • 1O@ wyjście 1, jeśli było 4 i zatrzymanie
  • ;;, posprzątaj stos i dziel liczbę całkowitą
  • p;? oczyść spód stosu i sprawdź wynik div dla 0
  • O@ jeśli div spowoduje zero wyjścia i zatrzymania
  • s zamień wierzch stosu i zacznij od kroku 2 powyżej
MickyT
źródło
2

MATL , 8 bajtów

32YA52=a

Wypróbuj online!

Sanchises
źródło
@Luis Zdecydowanie mogę upuścić G(nie jestem pewien, dlaczego włączyłem go w pierwszej kolejności), ale to tylko jeden bajt (dzięki za wykrycie tego!). Zmiana 32YA52na 32_YA4tę samą liczbę bajtów, prawda?
Sanchises
Ach, tak, nie mogę liczyć
Luis Mendo
2
@Luis Count? Kto musi liczyć, kiedy możesz'32_YA4'n'32YA52'n-
Sanchises
2

Partia, 77 45 bajtów

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

Na podstawie tych nieco kręcących się hacków . Objaśnienie: Należy sprawdzić tylko 6 rąk z powodu ograniczonego zakresu (30 bitów) wejścia, które musi być obsługiwane. Magiczna liczba mjest równoważna z 111111bazą 32, więc pierwsza operacja przełącza nieuporządkowane bity w liczbie wejściowej. Następnie pozostaje ustalić, która z 6 rąk ma teraz zero.

Neil
źródło
2

kod maszynowy x86, 14 bajtów

(ten sam kod maszynowy działa w trybie 16-bitowym, 32-bitowym i 64-bitowym. W trybie 16-bitowym używa AX i DI zamiast EAX i EDI w trybie 32 i 64-bitowym).

Algorytm: sprawdź niskie 5 bitów za pomocą x & 31 == 4, następnie przesuń w prawo o 5 bitów i powtórz, jeśli wynik przesunięcia jest niezerowy.

Możliwość char isrude(unsigned n);wywołania z C zgodnie z konwencją wywoływania Systemu x86-64. 0 to prawda, nie-0 to fałsz (to jest asm, a nie 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

Wykorzystuje to krótkie op al, imm8kodowanie dla AND i SUB. Mógłbym kiedyś XOR al,4wygenerować 0 na równości, ale SUB jest szybszy, ponieważ może makro połączyć się z JZ w jeden U-sub i rozgałęzienie w rodzinie Sandybridge.

Ciekawostka: użycie wyniku zmiany o więcej niż 1 będzie powolne w rodzinie P6 (przeciągnięcia frontonu aż do wycofania się zmiany), ale to w porządku.


Przypis 1: Jest to funkcja języka asemblera, a x86 asm ma jedno jzi drugie jnz, więc zgodnie z meta mogę wybrać jeden z dwóch sposobów. Nie zamierzam tego dopasowywać do prawdy / fałszu C.

Okazało się, że wygodne jest zwracanie w AL zamiast EFLAGS, więc możemy opisać tę funkcję kompilatorowi C bez opakowania, ale mój wybór prawdy / fałszu nie jest ograniczony przez użycie wywołującego języka C do przetestowania go.

Peter Cordes
źródło
2

ES6, 31 30 26 bajtów

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

Nie krępuj się zgłaszać pomysły dotyczące dalszego ograniczenia, jeśli w ogóle.

elipszilon
źródło
Witamy w PPCG!
Laikoni
Nie musisz liczyć nazwy swojej funkcji i chociaż myślę, że możesz zapisać bajt za pomocą test, możesz tak naprawdę zapisać dwa bajty, dopasowując je 4jako liczbę i pozwalając matchprzekonwertować je na ciąg, a następnie RegExp dla ciebie .
Neil
1

Retina 0.8.2 , 31 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Zwraca zero, chyba że liczba jest grubiańska. Działa poprzez konwersję danych wejściowych na unarną, a następnie na unarnie zakodowaną bazę 32 i zliczanie liczby 4s w wyniku.

Neil
źródło
1

Java 8, 40 33 bajtów

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

Odpowiedź portu APL (dzaima / APL) na @ Adám .

Wypróbuj online.

Wyjaśnienie:

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
źródło
1

> <> , 28 bajtów

Dane wyjściowe 4 dla nieuprzejmych liczb generują wyjątek dla nieuprzejmych liczb.

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

Wypróbuj online!

Emigna
źródło
1
Wyjątek jest akceptowalny, odpowiedź C # robi to
tylko
1

Wolfram Language (Mathematica) , 37 bajtów 36 bajtów 29 bajtów

-2 bajty Jonathan Frech

#~IntegerDigits~32~MemberQ~4&

Wypróbuj online!

31-bajtowe rozwiązanie:

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

Wypróbuj online!

Rainer Glüge
źródło
Witam i witam w PPCG. W obecnej postaci twoje wyrażenie jest pojedynczą wartością logiczną. Popraw swoją odpowiedź, tak aby była pełnym programem lub funkcją ( ...#...&jest często używana w Mathematica).
Jonathan Frech
Cześć. Czy to masz na myśli?
Rainer Glüge
proszę użyć tio.run/#mathematica zamiast W | A, aby upewnić się, że jest to poprawny kod matematyczny: P i nie potrzebujesz go [n]na końcu, tylko &. Ponieważ posty mają historię edycji, można pominąć poprzednie wpisy, a konwencja dla starych wyników to<s>40</s> <s>36</s>
ASCII
Tak. To miałem na myśli. 29 bajtów .
Jonathan Frech
Chyba muszę się przyzwyczaić do funkcjonalnego stylu programowania.
Rainer Glüge
1

Java 8, 28 22 21 bajtów

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

Zainspirowany @ Kevin-cruijssen odpowiedź „s . Działa tylko na 2 ręce.

Wypróbuj online!

Wyjaśnienie:

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
źródło
Jestem pewien, że odpowiedzi muszą działać obiema rękami
Embodiment of Ignorance