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.


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

13
Myślałem, że znam regex, ale najwyraźniej nie.
CT Hall



8

Ruby, 36 19 bajtów

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

Wypróbuj online!

Zapisano 17 bajtów metodą @tsh .


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.


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



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!


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

Catholicon , 4 bajty

ǔ?QǑ

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

Wypróbuj online!

Zestaw testowy


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!


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


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.


@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

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.




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

2

MATL , 8 bajtów

32YA52=a

Wypróbuj online!


@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.


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.


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.


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.



1

> <> , 28 bajtów

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

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

Wypróbuj online!


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!


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.