Apakah saya nomor kasar?

72

Untuk sementara waktu sekarang, saya telah mengalami masalah ketika menghitung dengan jari saya, khususnya, bahwa saya hanya bisa menghitung sampai sepuluh. Solusi saya untuk masalah itu adalah menghitung dalam biner pada jari-jari saya, mengacungkan ibu jari saya untuk satu, jari telunjuk saya untuk dua, baik ibu jari dan telunjuk untuk tiga, dll. Namun, kami mengalami sedikit masalah ketika kami sampai ke angka empat. Secara khusus, itu mengharuskan kita untuk mengangkat jari tengah kita, yang menghasilkan gerakan yang agak disayangkan, yang biasanya tidak diterima di masyarakat. Jenis angka ini adalah angka kasar . Kita sampai pada angka kasar berikutnya di 36, ketika kita mengangkat ibu jari di tangan kedua dan jari tengah tangan pertama kita. Definisi dari sejumlah kasar adalah nomor yang, di bawah sistem ini penghitungan, hasil dalam diri kita memasang hanyajari tengah tangan apa pun. Setelah kami melewati 1023 (jumlah maksimum yang dapat dicapai pada satu orang, dengan masing-masing dua tangan lima jari), anggaplah kami melanjutkan dengan tangan ketiga, dengan tambahan tangan yang ditambahkan sesuai kebutuhan.

Tugas Anda:

Tulis program atau fungsi yang menerima input dan mengeluarkan nilai kebenaran / kepalsuan berdasarkan apakah input tersebut angka yang kasar.

Memasukkan:

Integer antara 0 dan 10 9 (inklusif).

Keluaran:

Nilai kebenaran / kepalsuan yang menunjukkan apakah input adalah angka kasar.

Kasus uji:

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

Mencetak:

Ini adalah , sehingga skor terendah dalam byte menang.

Gryphon - Pasang kembali Monica
sumber
43
assume we continue with a third hand, Ketika berbicara tentang bersikap kasar, kerja tim membuat mimpi itu berhasil.
Veskah
5
@Veskah ternyata untuk batas-batas pertanyaan, Anda hanya perlu 3 orang untuk membuat angka tertentu. Tentu mengalahkan jenis lama menghitung dengan jari.
Gryphon - Pasang kembali Monica
12
Lebih buruk jika Anda orang Inggris - 6 juga tidak sopan!
Matius
1
Apakah boleh mengambil input di basis yang berbeda dari 10?
wastl
2
5 tampaknya cukup kasar juga. Tidak yakin ada yang akan mengatakan, "Oh, ibu jarinya
dicabut

Jawaban:

17

Regex (ECMAScript), 37 byte

Input dalam bentuk unary, dengan panjang string xs.

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

Cobalah 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
Kode mati
sumber
13
Saya pikir saya tahu regex, tetapi ternyata tidak.
CT Hall
10

Japt , 5 byte

sH ø4

Cobalah online!

Penjelasan

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

Ruby, 36 19 byte

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

Cobalah online!

Disimpan 17 byte dengan metode @tsh .

Gagang pintu
sumber
Ini mengembalikan true untuk 2207, yang memiliki representasi biner100010011111
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance Itu hasil yang benar, bukan? Tangan kedua adalah 00100.
Gagang pintu
Saya tidak bisa bahasa Ruby. Tapi kenapa tidak ->n{n.to_s(32)=~/4/}?
tsh
1
@tsh karena aku tidak sepintar kamu :)
Gagang pintu
Maafkan saya jika saya tidak mengerti pertanyaannya, tetapi bukankah tangan pertama dari 2207 10001, yang kedua 00111, dan yang ketiga 11? Tak satu pun dari mereka yang hanya memiliki jari tengah
Perwujudan Ketidaktahuan
8

APL + WIN, 10 byte

Meminta input integer

4∊(6⍴32)⊤⎕

Memperhatikan enam tangan diperlukan untuk mewakili 10 ^ 9 konversi ke vektor 6 elemen dari representasi 32 dasar dan memeriksa apakah 4 ada di elemen apa pun.

Graham
sumber
6

Perl 6 , 16 byte

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

Cobalah online!

Cek apakah ada 4representasi di nomor 32 di pangkalan. Mengembalikan Nil sebagai salah atau Cocok yang mengandung a 4.

Anda dapat membuktikan ini dengan fakta bahwa sehingga setiap digit adalah keadaan masing-masing tangan.25=32

Jo King
sumber
6

Python 2 , 34 32 byte

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

Cobalah online!

2 byte berkat tsh

Chas Brown
sumber
1
: | Anda dapat mengedit posting, Anda tahu kan
hanya ASCII
Iya; Aku tahu. Itu adalah sebuah kecelakaan! Kecelakaan, saya katakan ya!
Chas Brown
@tsh Oh bagus, lupa sirkuit pendek itu
ASCII-satunya
6

Kode Mesin x86, 17 byte

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

Byte di atas mendefinisikan fungsi yang mengambil angka sebagai input dalam EAXregister, dan mengembalikan hasilnya sebagai nilai Boolean dalam EAXregister ( EAX== 0 jika input bukan angka kasar;! EAX= 0 jika input adalah angka kasar ).

Dalam mnemonik perakitan yang dapat dibaca manusia:

; 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

Cobalah online!

Cody Grey
sumber
1
Namun, ide yang menarik untuk digunakan idiv. Saya tidak melihat peningkatan tambahan untuk ini. Tetapi lihat jawaban saya : 14 byte untuk loop shift yang menggunakan MOV / AND / SUB / JZ untuk memeriksa 5 bit rendah untuk kekasaran.
Peter Cordes
4

Julia 1.0 , 25 byte

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

Cobalah online!

Julia 1.0 , 26 byte

Alternatif yaitu 1 karakter lebih pendek, tetapi 1 byte lebih lama, terlalu buruk yang membutuhkan 3 byte di unicode.

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

Cobalah online!

Kirill L.
sumber
dapat Anda gunakan n->n%32...untuk jawaban pertama Anda lebih pendek 2 byte?
Giuseppe
@ Giuseppe, sayangnya tidak, fungsi itu bersifat rekursif.
Kirill L.
4

Catholicon , 4 byte

ǔ?QǑ

Mengambil nomor sebagai string basis-256.

Cobalah online!

Suite uji

Okx
sumber
2
Hm, jika ini dibolehkan, apakah itu diperbolehkan untuk menerima angka dalam basis 32?
Rekursif
@recursive Anda dapat mengelilingi angka-angka di dalamnya <<dan >>dan memungkinkan angka-angka yang lebih besar dari 255 di dalamnya, seperti yang ditunjukkan dalam suite tes.
Okx
1
Itu dimaksudkan sebagai pertanyaan tentang tantangan tetapi tidak terlalu jelas.
Rekursif
4

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

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

Keluaran dengan melemparkan pengecualian. Cara Anda mengonversi satu angka dari desimal ke basis lain adalah dengan membagi angka desimal dengan basis itu berulang kali dan mengambil sisanya sebagai digit. Itulah yang kami lakukan, dan kami memeriksa apakah ada angka yang memiliki nilai 4 di basis-32;

Cobalah online!

Perwujudan Ketidaktahuan
sumber
27? sebagai bonus itu tidak menghasilkan dalam cara yang aneh
ASCII-hanya
1
juga apa tplig
ASCII-hanya
@ Khusus ASCII n>31->n>0
tsh
25 byte
Kevin Cruijssen
1
Apakah program berhenti atau tidak bukanlah metode output yang diperbolehkan . Output melalui pengecualian diizinkan.
Deadcode
3

J , 12 byte

4 e.32#.inv]

Cobalah online!

Galen Ivanov
sumber
3

R , 50 48 byte

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

Cobalah online!

Menggunakan pendekatan berbasis matriks yang rapi sekarang (milik @Giueseppe). Ini menghasilkan matriks bit 5x7, mengubahnya menjadi serangkaian bilangan bulat 32, dan memeriksa 4s.

Nick Kennedy
sumber
@ Giuseppe Ups, benar-benar merindukan itu. Harus bekerja sekarang, meskipun mengecewakan 19 byte lebih lama. Saya tidak berpikir ada fungsi terbalik untuk strtoi selain untuk heksadesimal dan oktal di basis R
Nick Kennedy
48 byte dengan beberapa sihir matriks. Saya percaya konversi sedikit lebih panjang dari intToBitstapi kemudian kita dapat bekerja dengan intsbukannya rawyang berakhir menyimpan byte - lihat misalnya denganintToBits
Giuseppe
@ Giuseppe itu solusi yang sangat berbeda (dan rapi) untuk saya - apakah Anda ingin saya memperbarui milik saya atau Anda memposting sendiri?
Nick Kennedy
kamu bebas untuk mengambilnya. :-)
Giuseppe
1
tentu saja, mem-porting salah satu dari banyak jawaban yang menguji keberadaan digit 4dalam nomor basis-32 adalah, oh, 29 byte .
Giuseppe
2

Python 3 , 43 byte

Periksa setiap potongan 5-bit untuk melihat apakah itu kasar (sama dengan 4).

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

Cobalah online!

Neil A.
sumber
* Potongan 5-bit ...
ASCII
2

C (gcc) , 34 byte

f(i){return i?i&31^4?f(i/32):1:0;}

Cobalah online!

celtschk
sumber
32 byte dengan mengatur ulang ekspresi.
Arnauld
3
atau 25 byte dengan menyalahgunakan cara gcc mengkompilasi ini.
Arnauld
2

Arang , 6 byte

№⍘N³²4

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Keluaran -berdasarkan seberapa kasar angkanya. Penjelasan:

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

Saya menggunakan konversi basis string untuk menghindari keharusan memisahkan literal angka untuk 32dan 4.

Neil
sumber
2

Tidy , 18 byte

{x:4∈base(32,x)}

Cobalah online! Memeriksa apakah 4merupakan elemen base(32,x)(konversi basis).

Conor O'Brien
sumber
2

Cubix , 26 byte

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

Cobalah online!

Bungkus ke sebuah kubus dengan panjang tepi 3 sebagai berikut

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

Lihat saja

Implementasi yang cukup mendasar, tanpa semua pengalihan yang dilakukannya:

  • IS memulai program dengan menekan input dan 32 ke stack
  • %4-! mendapatkan sisanya dan memeriksa apakah 4 dengan pengurangan
  • 1O@ Output 1 jika 4 dan berhenti
  • ;;, bersihkan tumpukan dan lakukan pembagian integer
  • p;? bersihkan bagian bawah tumpukan dan periksa hasil div untuk 0
  • O@ jika div menghasilkan output nol dan berhenti
  • s tukar bagian atas tumpukan dan mulai kembali pada langkah 2 di atas
MickyT
sumber
2

MATL , 8 byte

32YA52=a

Cobalah online!

Sanchises
sumber
@Luis saya pasti bisa menjatuhkan G(tidak yakin mengapa saya memasukkannya di tempat pertama) tapi itu hanya satu byte (terima kasih untuk melihat itu!). Mengubah 32YA52ke 32_YA4adalah jumlah byte yang sama bukan?
Sanchises
Ah, ya, saya tidak bisa menghitung
Luis Mendo
2
@Luis Count? Siapa yang perlu menghitung kapan Anda bisa'32_YA4'n'32YA52'n-
Sanchises
2

Batch, 77 45 byte

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

Berdasarkan hacks twiddling bit ini . Penjelasan: Hanya 6 tangan yang perlu diperiksa karena jangkauan terbatas (30 bit) dari input yang harus didukung. Angka ajaib msetara dengan 111111di basis 32, sehingga operasi pertama matikan bit kasar di nomor input. Kemudian tetap menemukan yang mana dari 6 tangan sekarang nol.

Neil
sumber
2

kode mesin x86, 14 byte

(kode mesin yang sama berfungsi dalam 16-bit, 32-bit, dan 64-bit. Dalam mode 16-bit, ia menggunakan AX dan DI alih-alih EAX dan EDI dalam mode 32 dan 64-bit.)

Algoritma: periksa 5 bit dengan rendah x & 31 == 4, lalu geser ke kanan sebanyak 5 bit, dan ulangi jika hasil shiftnya bukan nol.

Callable from C dengan char isrude(unsigned n);sesuai dengan konvensi pemanggilan System V x86-64. 0 adalah benar, bukan-0 adalah palsu (ini asm, bukan 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

Ini mengambil keuntungan dari op al, imm8pengkodean formulir pendek untuk AND dan SUB. Saya bisa digunakan XOR al,4untuk menghasilkan 0 pada kesetaraan, tetapi SUB lebih cepat karena dapat makro-sekering dengan JZ menjadi satu sub-dan-cabang uop pada keluarga Sandybridge.

Fakta menyenangkan: menggunakan flag-hasil pergeseran oleh lebih dari 1 akan lambat pada keluarga P6 (kios front-end sampai shift berhenti), tapi itu bagus.


Catatan Kaki 1: Ini adalah fungsi bahasa assembly, dan x86 asm memiliki keduanya jzdan jnz, jadi sesuai meta saya dapat memilih salah satu dari keduanya. Saya tidak bermaksud ini untuk mencocokkan C kebenaran / kepalsuan.

Itu kebetulan lebih nyaman untuk kembali dalam AL daripada EFLAGS, sehingga kita dapat menggambarkan fungsi ke kompiler C tanpa pembungkus, tetapi pilihan saya benar / salah tidak dibatasi dengan menggunakan penelepon C untuk mengujinya.

Peter Cordes
sumber
2

ES6, 31 30 26 byte

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

Jangan ragu untuk mengatakan ide tentang cara mengurangi ini lebih jauh, jika ada.

elipszilon
sumber
Selamat datang di PPCG!
Laikoni
Anda tidak perlu menghitung nama fungsi Anda, dan meskipun saya pikir Anda dapat menyimpan byte dengan menggunakan test, Anda sebenarnya dapat menyimpan dua byte dengan mencocokkannya 4dengan angka dan membiarkan matchmengubahnya menjadi string dan kemudian RegExp untuk Anda .
Neil
1

Retina 0.8.2 , 31 byte

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

Cobalah online! Tautan termasuk kasus uji. Output nol kecuali angkanya tidak sopan. Bekerja dengan mengonversi input ke unary dan kemudian ke unary-encoded base 32 dan menghitung jumlah 4s dalam hasilnya.

Neil
sumber
1

Java 8, 40 33 byte

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

Port of @ Adám 's APL (dzaima / APL) answer .

Cobalah online.

Penjelasan:

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
sumber
1

> <> , 28 byte

Output 4 untuk nomor kasar melempar pengecualian untuk nomor tidak kasar.

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

Cobalah online!

Emigna
sumber
1
Pengecualian dapat diterima, jawaban C # melakukannya
ASCII
1

Bahasa Wolfram (Mathematica) , 37 byte 36 byte, 29 byte

-2 byte oleh Jonathan Frech

#~IntegerDigits~32~MemberQ~4&

Cobalah online!

Solusi 31-byte:

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

Cobalah online!

Rainer Glüge
sumber
Halo dan selamat datang di PPCG. Seperti berdiri, ekspresi Anda adalah nilai Boolean tunggal. Harap perbaiki jawaban Anda menjadi program lengkap atau fungsi ( ...#...&sering digunakan dalam Mathematica).
Jonathan Frech
Halo. Apakah ini yang Anda maksud?
Rainer Glüge
tolong gunakan tio.run/#mathematica alih-alih W | A untuk memastikan itu adalah kode Mathematica yang valid: P dan Anda tidak perlu [n]pada akhirnya, hanya saja &. Juga karena postingan memiliki riwayat edit, tidak apa-apa untuk meninggalkan entri sebelumnya, dan konvensi untuk skor lama adalah<s>40</s> <s>36</s>
ASCII-satunya
Iya. Ini yang saya maksud. 29 byte .
Jonathan Frech
Saya kira saya harus terbiasa dengan gaya pemrograman fungsional.
Rainer Glüge
1

Java 8, 28 22 21 byte

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

Terinspirasi oleh jawaban @ kevin-cruijssen . Hanya berfungsi untuk 2 tangan.

Cobalah online!

Penjelasan:

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
sumber
Saya cukup yakin jawaban harus bekerja dengan kedua tangan
Perwujudan Ketidaktahuan