Ben kaba bir numara mıyım?


72

Bir süredir parmaklarımda sayılırken, özellikle sadece 10'a kadar sayabileceğim bir problemle karşı karşıya kaldım. Bu sorun için benim çözümüm parmaklarımda ikili olarak saymak, bir baş parmağımı, iki için işaret parmağımı, üçe iki parmağımı hem de işaret parmağını koymaktı, vb. dört numara. Özellikle, toplumda genellikle kabul görmeyen talihsiz bir jestle sonuçlanan orta parmağımızı koymamızı gerektirir. Bu sayı türü kaba bir sayıdır . İkinci eldeki baş parmağımızı ve ilk elimizin orta parmağını kaldırdığımızda bir sonraki kaba sayıya 36'da geliyoruz. Kaba bir sayının tanımı, bu sayım sistemi altında, sadece ortaya koymamıza neden olan herhangi bir sayıdır.Herhangi bir elin orta parmağı. 1023'ü geçtikten sonra (her biri beş parmağın iki eliyle bir kişiye ulaşılabilir maksimum sayı), gerektiğinde ilave el eklenmiş olarak üçüncü bir el ile devam ettiğimizi varsayalım.

Senin görevin:

Bir girdi alan ve girişin kaba bir sayı olup olmadığına bağlı olarak bir gerçeği / yanlışlık değeri veren bir program veya işlev yazın.

Giriş:

0 ile 10 9 arasında bir tam sayı (dahil).

Çıktı:

Girişin kaba bir sayı olup olmadığını gösteren bir gerçeği / sahtekarlık değeri.

Test Durumları:

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

Puanlama:

Bu , yani bayt cinsinden en düşük puan kazanır.


43
assume we continue with a third hand, Kaba olmak söz konusu olduğunda, takım çalışması rüyanın çalışmasını sağlar.
Veskah

5
@ Veskah, sorunun sınırları için, verilen herhangi bir numarayı yapmak için yalnızca 3 kişiye ihtiyacınız olduğunu ortaya koyuyor. Tabii ki, parmakları üzerinde eski sayma türünü atıyor.
Gryphon

12
İngiliz iseniz daha kötü - 6 o zaman da kaba!
Matthew

1
10'dan farklı bir temelde giriş almak uygun mudur?
Şubat’tan

2
5 de oldukça kaba görünüyor. Kimsenin "Ah, parmağını çıkardı, bu tamamen kibardı" diyeceğinden emin değil
ale10ander

Yanıtlar:



17

Regex (ECMAScript), 37 bayt

Girdi, xs dizgesinin uzunluğu gibi tekdüzedir .

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

Çevrimiçi deneyin!

^
(
    (?=(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
Regex bildiğimi sanıyordum ama görünüşe göre değil.
CT Hall



8

Ruby, 36 19 bayt

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

Çevrimiçi deneyin!

@Tsh metoduyla 17 bayt kaydedildi .


Bu, 2207 için geçerlidir; bu, ikili bir temsili olan100010011111
Cehalet

@EmbodimentofIgnorance Bu doğru sonuç, öyle değil mi? İkinci el 00100.
Doorknob

Ruby'yi konuşamıyorum. Ama neden olmasın ->n{n.to_s(32)=~/4/}?
tsh

1
@tsh çünkü senin kadar akıllı değilim :)
Doorknob

Soruyu anlamadıysam beni bağışlayın, ancak 2207'nin birinci eli 10001, ikincisi 00111ve üçüncü değil 11mi? Hiçbiri sadece orta parmağına sahip değil
Ignorance'ın

8

APL + WIN, 10 bayt

Tamsayı girişi için bilgi istemi

4∊(6⍴32)⊤⎕

Altı elin, 10 ^ 9'u temsil etmesi gerektiğini belirtirken, taban 32 temsilinin 6 elemanının vektörüne dönüşür ve herhangi bir elemanda 4 olup olmadığını kontrol eder.


6

Perl 6 , 16 bayt

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

Çevrimiçi deneyin!

4Sayının bazında 32 temsili olup olmadığını kontrol eder. Nil'i false olarak veya a içeren bir Eşleme döndürür 4.

25=32



6

x86 Makine Kodu, 17 bayt

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

Yukarıdaki bayt girdi olarak sayısını alır işlev tanımlamak EAXkayıt ve bir Boolean değerini olarak döndürür EAXkayıt ( EAX== 0 giriş ise değil , bir kaba numarası EAX! = 0 giriş ise olan kaba bir sayı ).

İnsan tarafından okunabilir montaj anılarında:

; 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

Çevrimiçi deneyin!


1
idivYine de kullanmak için ilginç bir fikir . Bunun için artan bir gelişme görmüyorum. Ancak cevabımı görün : düşük 5 bit terbiyesizlik için kontrol etmek için MOV / AND / SUB / JZ kullanan bir geçiş döngüsü için 14 bayt.
Peter Cordes,



4

Katolik , 4 bayt

ǔ?QǑ

Temel bir 256 dize olarak bir sayı alır.

Çevrimiçi deneyin!

Test odası


2
Hm, eğer buna izin verilirse, bunun yerine 32 tabanındaki sayıları kabul etmesine izin verilir mi?
özyinelemeli

@recursive Sen sayıları çevreleyebilir <<ve >>ve test paketi gösterildiği gibi, olanlarda 255'ten büyük sayılar için izin verir.
Okx

1
Bu sorunla ilgili bir soru olarak düşünülüyordu ancak çok net değildi.
özyinelemeli

4

C # (Visual C # Etkileşimli Derleyici) , 31 bayt

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

Bir istisna atarak çıktılar. Bir sayıyı ondalık sayıdan başka bir tabana dönüştürme şekliniz, ondalık sayıyı tekrar tekrar o tabanla bölmek ve kalanı basamak olarak almaktır. Yaptığımız şey budur ve rakamlardan herhangi birinin base-32'de 4 değeri olup olmadığını kontrol ederiz;

Çevrimiçi deneyin!


27? bonus olarak garip bir şekilde çıkmaz
ASCII-yalnızca

1
ayrıca tplig nedir
ASCII-sadece

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


1
Bir programın durup durmaması, izin verilen bir çıktı yöntemi değildir . İstisna yoluyla çıkışa izin verilir.
Deadcode


3

R , 50 48 bayt

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

Çevrimiçi deneyin!

Şimdi düzgün bir matris tabanlı yaklaşım kullanır (@ Giueseppe'nin izni ile). 5x7 bitlik bir matris oluşturur, bunu bir dizi 32 tamsayı dizisine dönüştürür ve herhangi bir 4s için kontrol eder.


@Giuseppe Oops, bunu tamamen kaçırdı. Şimdi çalışması gerekir, ancak 19 byte daha uzun süredir hayal kırıklığına uğradı. R üssünde onaltılık ve sekizlik dışında strtoi dışında ters bir fonksiyon olduğunu sanmıyorum
Nick Kennedy

Bazı matris büyü ile 48 bayt . Ben biraz dönüşüm daha uzun olduğuna inanıyoruz intToBitsama sonra çalışabilir intsyerine rawörneğin bkz - Bir bayt tasarrufu biter hangi bununlaintToBits
Giuseppe

@Giuseppe benim için tamamen farklı (ve temiz) bir çözüm - benimkini güncellememi mi istiyorsun yoksa kendi gönderini mi istiyorsun?
Nick Kennedy

almakta özgürsün. :-)
Giuseppe

1
Tabii ki, 4bir baz-32 sayısında bir basamağın varlığını test eden birçok cevaptan birini taşımak , oh, 29 bayttır .
Giuseppe



2

Kömür , 6 bayt

№⍘N³²4

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Çıktılar -sayının ne kadar kaba olduğuna göre değişir. Açıklama:

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

Ben sayısal hazır ayırmak zorunda kalmamak için dize baz dönüşümü kullanan 32ve 4.




2

Cubix , 26 bayt

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

Çevrimiçi deneyin!

Aşağıdaki gibi kenar uzunluğu 3 olan bir küp üzerine sarar

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

Çalıştırılmasını izle

Tüm yönlendirmeler olmadan oldukça basit bir uygulama:

  • IS girişi ve 32'yi yığına iterek programı başlatır.
  • %4-! kalanı alır ve çıkarma ile 4 olup olmadığını kontrol eder
  • 1O@ 4 ise çıktı 1 ve durdu
  • ;;, yığını temizlemek ve tamsayı bölme yapmak
  • p;? yığının dibini temizle ve div sonucunu 0 olarak kontrol et
  • O@ eğer div sıfır çıktı verirse ve durursa
  • s yığının üstünü değiştirin ve yukarıdaki 2. adımda tekrar başlayın

2

MATL , 8 bayt

32YA52=a

Çevrimiçi deneyin!


@Luis'i kesinlikle bırakabilirim G(neden ilk etapta dahil ettiğimden emin değilim) ama bu sadece bir bayt (bunu gördüğünüz için teşekkürler!). Değişen 32YA52için 32_YA4bayt aynı sayıda doğru?
Sanchises,

Ah, evet,
sayamıyorum

2
@Luis Sayısı? Ne zaman saymanız gerekiyor'32_YA4'n'32YA52'n-
Sanchises

2

Toplu, 77 45 bayt

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

Bu bit bükme hacklerine dayanarak . Açıklama: Desteklenmesi gereken girişin sınırlı aralığı (30 bit) nedeniyle yalnızca 6 elin kontrol edilmesi gerekir. Sihirli sayı 32 tabanına meşittir 111111, böylece ilk işlem giriş numarasındaki kaba bitleri değiştirir. Daha sonra 6 elden hangisinin sıfır olduğunu bulmak için kalır.


2

x86 makine kodu, 14 bayt

(aynı makine kodu 16-bit, 32-bit ve 64-bit'te çalışır. 16-bit modunda, 32 ve 64-bit modunda EAX ve EDI yerine AX ve DI kullanır.)

Algoritma: Düşük 5 bit ile kontrol edin x & 31 == 4, ardından 5 bit ile sağa kaydırma ve kaydırma sonucu sıfır değilse tekrarlayın.

X86-64 char isrude(unsigned n);System V çağrı kurallarına göre C'den çağrılabilir . 0 (bu asm değil, C truthy olmayan 0 falsy olduğu 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

Bu, op al, imm8AND ve SUB için kısa form kodlamasından yararlanır . XOR al,4Eşitlikten 0 üretmek için kullanılmış olabilirdi , ancak SUB daha hızlı çünkü Jbridge ile Sandybridge ailesindeki tek bir alt daldan oluşan bir ağa makro-kaynaşıyor.

Eğlence gerçeği: 1'den fazla kaymanın bayrak sonucunu kullanmak P6 ailesinde yavaşlar (vardiya sona erene kadar ön taraftaki duraklar), ancak sorun değil.


Dipnot 1: Bu bir derleme dil fonksiyonudur ve x86 asm hem sahiptir jzve jnzbu nedenle, meta uyarınca Hiç bir yolu seçebilir. Bunu C gerçeği / sahtekarlığı ile eşleştirmek niyetinde değilim.

EFLAGS yerine AL'ye geri dönmek uygun oldu, bu yüzden işlevi bir sarmalayıcı olmadan bir C derleyicisine tanımlayabiliriz, ancak benim doğruluk / sahtekarlık seçimim, onu test etmek için bir C arayan kullanarak sınırlandırılmaz.


2

ES6, 31 30 26 bayt

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

Varsa, bunun nasıl daha da azaltılacağı hakkında fikir söylemekten çekinmeyin.


PPCG'ye Hoşgeldiniz!
Laikoni,

İşlevinizin adını saymanıza gerek yoktur ve kullanarak bir bayttan tasarruf edebileceğinizi düşünmeme rağmen , bir sayı olarak testeşleştirerek ve bunu sizin için bir dizgeye dönüştürdüğünüzde iki bayt kaydedebilirsiniz. . 4match
Neil,

1

Retina 0.8.2 , 31 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Sayı kaba olmadıkça sıfır çıkışı verir. Girdiyi unary'e ve sonra unary-şifreli tabanına (32) dönüştürerek ve sonuçtaki 4s sayısını sayarak çalışır .




1

Wolfram Dili (Mathematica) , 37 bayt 36 bayt 29 bayt

-2 byte by Jonathan Frech

#~IntegerDigits~32~MemberQ~4&

Çevrimiçi deneyin!

31 baytlık çözüm:

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

Çevrimiçi deneyin!


Merhaba ve PPCG'ye hoş geldiniz. Durduğu gibi, ifadeniz tek bir Boolean değeridir. Lütfen cevabınızı ya tam bir program ya da bir işlev olarak düzeltin ( ...#...&genellikle Mathematica'da kullanılır).
Jonathan Frech

Merhaba. Demek istediğin bu mu?
Rainer Glüge

pls geçerli matematik kodu olduğundan emin olmak için W | A yerine tio.run/#mathematica kullanın: P ve [n]sonunda, sadece gerek yok &. Ayrıca yayınların geçmişi düzenleme tarihi olduğundan, önceki girişleri bırakmanız iyi olur ve eski puanlar için yapılan sözleşme <s>40</s> <s>36</s>
ASCII-

Evet. Demek istediğim bu. 29 bayt .
Jonathan Frech

Sanırım işlevsel programlama stiline alışmam gerek.
Rainer Glüge

1

Java 8, 28 22 21 bayt

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

Esinlenerek @ Kevin-cruijssen 'ın cevabı . Sadece 2 el için çalışır.

Çevrimiçi deneyin!

Açıklama:

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

Cevapların iki eliyle de çalışması gerektiğinden eminim
Ignorance'ın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.