Angka yang sebenarnya adalah huruf

42

Diberikan input integer non-negatif, tulis sebuah program yang mengubah angka menjadi heksadesimal dan mengembalikan nilai kebenaran jika bentuk heksadesimal dari angka hanya berisi karakter Amelalui Fdan nilai falsey sebaliknya.


Uji kasus

10
==> True (A in hexadecimal)

100
==> False (64 in hexadecimal)

161
==> False (A1 in hexadecimal)

11259375
==> True (ABCDEF in hexadecimal)

0
==> False (0 in hexadecimal)

Bonus: -40 byte jika program Anda mencetak Only lettersuntuk tantangan yang dijelaskan di atas, Only numbersjika versi heksadesimal dari angka hanya berisi digit 0-9dan Mixjika angka heksadesimal mengandung setidaknya satu angka dan setidaknya satu huruf.


Ini kode golf. Aturan standar berlaku. Kode terpendek dalam byte menang. Fungsi atau program lengkap diizinkan.

Arcturus
sumber
2
Saat ini sedang menyusun jawaban dalam Golfical.
SuperJedi224
Ide saya saat ini: terselubung ke basis 16 string, lalu Lihat apakah mencoba mengurai string itu sebagai basis 10 angka kembaliNaN
Cyoce
@Cyoce Itu mungkin berhasil, tergantung pada pilihan bahasa Anda
SuperJedi224
3
Bonus tidak realistis (sekali lagi): hanya stringnya MixOnlynumberslettersadalah 21 karakter
edc65
3
Anda mengatakan "input bilangan bulat positif", tetapi 0 adalah ujian.
xnor

Jawaban:

22

Pyth, 43 - 40 = 3 byte

?&[email protected]"Mix"%"Only %sers"?K"lett""numb

Suite uji

Ini mencapai bonus. Only numbersdan Only lettersuntungnya hanya berbeda 4 huruf. format gaya printf digunakan dengan %.

Sistem seleksi dilakukan dengan mengambil persimpangan hex dengan G, alfabet, dan mengurangi G. Jika tidak ada yang salah, itu campuran, sedangkan jika persimpangan adalah palsu, itu angka, dan jika pengurangannya salah, itu adalah huruf.

isaacg
sumber
1
Sialan Pyth ini aneh. Akan sangat keren jika Anda bisa mendapatkan skor negatif.
KaareZ
15

Pyth, 6 byte

!-.HQG

  .HQ   # Converts the input to hexadecimal
 -   G  # Deletes all letters
!       # If empty, output True, else False

Uji di sini

Adnan
sumber
12

Jelly , 6 byte

b16>9P

Cobalah online!

Bagaimana itu bekerja

b16>9P  Input: z

b16     Convert the input to base 16.
   >9   Compare each resulting digit with 9; return 1 iff greater.
     P  Take the product of the resulting Booleans.
Dennis
sumber
Apakah tidak ada built in untuk 16 atau itu bukan suatu hal?
CalculatorFeline
1
Ada sekarang. Ini adalah salah satu jawaban Jelly pertama ...
Dennis
11

TeaScript , 11 byte 13 15 16

xT(16)O(Sz)

Cukup mudah. Ini menggunakan TeaScript 2.0. Anda bisa mendapatkan versi ini dari Github

Penjelasan

        // Implicit: x = input, Sz = alphabet
xT(16)  // input -> hex
O(Sz)   // Only letters?

Cobalah online (versi yang sedikit dimodifikasi yang berfungsi di web)

Downgoat
sumber
3
Apakah suara turun karena ini panjang? Apakah ada yang salah dengan jawaban ini yang tidak saya sadari? Atau apakah seseorang tidak secara pribadi menyukai jawaban ini?
Downgoat
2
Saya tidak akan mengatakan 16 atau 13 byte panjang!
Luis Mendo
23
Anda harus mengakui bahwa posting Anda yang down-goding cukup menggoda.
Dennis
10

Python, 24 byte

lambda n:min('%x'%n)>'9'

Mengonversi input dengan string hex (tanpa 0xawalan) dengan '%x'%n. Melihat apakah semua karakternya lebih besar dari '9'(huruf mana) dengan melihat apakah di minatas '9'.

Tidak
sumber
Saya tidak tahu bagaimana Python menangani karakter / angka, tetapi kode ASCII '9'adalah 54. Jadi, jika Anda dapat menulis, ...>54Anda dapat menyimpan byte.
CompuChip
@CompuChip Python tidak memperlakukan karakter atau string sebagai angka. Bahkan, Python 2 menganggap mereka lebih besar dari semua angka.
xnor
8

MATL , 10

i16YA1Y2mA

Contohnya

>> matl i16YA1Y2mA
> 240
0
>> matl i16YA1Y2mA
> 255
1

Penjelasan

i       % input                         
16YA    % convert to string representation in base 16
1Y2     % predefined literal: 'A':'Z'
m       % true for set member             
A       % all

Tantangan bonus: 53−40 = 13

i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]

Contohnya

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 255
Only letters

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 100
Only numbers

>> matl
 > i16YA1Y2mXKA?'Only letters'}Ka?'Mix'}'Only numbers']]
 > 
> 240
Mix

Penjelasan

i                       % input                                                 
16YA                    % convert integer to string representation in base 16
1Y2                     % predefined literal: 'A':'Z'
m                       % true for set member       
XK                      % copy to clipboard K                 
A                       % all                                   
?                       % if (top of the stack)                 
  'Only letters'        % string literal                                        
}                       % else                 
  K                     % paste from clipboard K      
  a                     % any                
  ?                     % if (top of the stack)      
    'Mix'               % string literal    
  }                     % else                                                  
    'Only numbers'      % string literal           
  ]                     % end             
]                       % end          
Luis Mendo
sumber
2
hmmm apa itu? Sepertinya matlab mendapat kekuatan nuc sekarang!
Abr001am
@ Agawa001 Hahaha. Semacam
Luis Mendo
8

LabVIEW, 52-40 = 12 Primview LabVIEW

Puji built-in!

masukkan deskripsi gambar di sini

Eumel
sumber
8

C, 46 43 37 byte

Sekarang dengan rekursi lebih banyak! (Terima kasih Dennis):

F(x){return(x%16>9)*(x<16?:F(x/16));}

Bonus: lebih pendek (33 byte), tetapi gagal untuk x = 0:

F(x){return!x?:(x%16>9)*F(x/16);}

b;F(x){for(b=x;x;x/=16)b*=x%16>9;return b;}

F()mengambil a intdan mengembalikan salah 0(false) atau non-zero (true).

Saya bahkan tidak mencoba untuk mencapai bonus, "MixOnly lettersnumbers"membutuhkan 23 byte saja, melacak kondisi baru akan membutuhkan 9 byte tambahan, printf()adalah 8 byte, yang menambahkan hingga 40, membatalkan upaya.

Tes utama:

#include <stdio.h>

int main() {
  int testdata[] = {10, 100, 161, 11259375, 0};
  for (int i = 0; i < 5; ++i) {
    int d = testdata[i];
    printf("%d (0x%x) -> %s\n", d, d, F(d)?"yep":"nope");
  }
}
Stefano Sanfilippo
sumber
Apa ?:? Saya harus menggantinya dengan ||untuk membuatnya dikompilasi. Juga, dapatkah Anda menyimpan byte dengan mengganti *dengan &sehingga menghindari ()s di sebelah kiri (meskipun Anda kemudian harus menambahkan spasi)?
Neil
@Neil a?:badalah ekstensi GNU yang mengevaluasi aapakah aadalah nilai yang sebenarnya, atau sebaliknya b. Berguna untuk menangani null pointer suka send(message ?: "(no message)");. Saya tahu ini tidak portabel, tetapi portabilitas kode tidak pernah menjadi perhatian dalam kode golf :)
Stefano Sanfilippo
@StefanoSanfilippo Anda bisa mendapatkan ini ke 33byte dengan melakukan ini: F(x){x=(x%16>9)*(x<16?:F(x/16));}ini menyalahgunakan (GCC) bug di mana jika tidak ada variabel pengembalian dalam suatu fungsi dan argumen utama ditetapkan, itu akan kembali otomatis argumen-utama dalam beberapa kasus ( berdasarkan logika apa yang dilakukan), dan ini merupakan salah satu dari kasus-kasus itu! Cobalah secara online: bit.ly/2pR52UH
Albert Renshaw
8

Python 3, 30 29 byte

1 byte dilucuti berkat sysreq dan Python 3.

lambda n:hex(n)[2:].isalpha()

Sederhana lambdadan mengiris.

LeeNeverGup
sumber
7

Perl 6 , 18 byte

{.base(16)!~~/\d/} # 18 bytes

pemakaian:

# give it a name
my &code = {.base(16)!~~/\d/}

for 10, 100, 161, 11259375, 0 {
  printf "%8s %6s %s\n", $_, .base(16), .&code
}

      10      A True
     100     64 False
     161     A1 False
11259375 ABCDEF True
       0      0 False
Brad Gilbert b2gills
sumber
7

Mathematica, 32 byte

Tr@DigitCount[#,16,0~Range~9]<1&

Penjelasan:

                               &   A function returning whether
Tr@                                 the sum of elements of
   DigitCount[ ,  ,         ]        the numbers of
                   0~Range~9          zeros, ones, ..., nines in
                16                    the hexadecimal expansion of
              #                       the first argument
                             <1     is less than one.
LegionMammal978
sumber
7

Javascript, ES6, tanpa regexp, 28 byte

F=n=>n%16>9&&(n<16||F(n>>4))

Ada juga versi 27-byte ini tetapi mengembalikan nilai terbalik.

F=n=>n%16<10||n>15&&F(n>>4)
zocky
sumber
Bagus! Anda juga dapat mengatur ulang seperti ini selama 23 byte:F=n=>!n||n%16>9&F(n>>4)
user81655
@ user81655 - Sayangnya, versi itu mengembalikan true untuk 0, jadi itu tidak benar.
zocky
Oh benar, kurasa yang terpendek adalah F=n=>n%16>9&&n<16|F(n>>4).
user81655
@ user81655 Aku cukup yakin Anda perlu arus pendek ||, tapi saya pikir Anda bisa lolos dengan menggunakan &bukannya &&dalam kasus itu.
Neil
@Neil Kenapa begitu? Apakah Anda mengujinya?
user81655
7

Julia, 18 byte

n->isalpha(hex(n))

Ini adalah fungsi anonim yang menerima integer dan mengembalikan boolean. Untuk menyebutnya, berikan nama, mis f=n->....

Input dikonversi ke string heksadesimal menggunakan hex, kemudian kami memeriksa apakah seluruhnya terdiri dari karakter alfabet menggunakan isalpha.

Alex A.
sumber
6

JavaScript ES6, 29

Tidak ada bonus

n=>!/\d/.test(n.toString(16))

Dengan nilai baru -40 bonus lebih dekat sekarang ... tetapi tidak cukup. Skor bonus 70 71 - 40 => 30 31

n=>/\d/.test(n=n.toString(16))?1/n?'Only numbers':'Mix':'Only letters'

Cuplikan uji (ketikkan angka di dalam kotak input)

#I { width:50%}
<input id=I oninput="test()"/><br>
Hex <span id=H></span><br>
Result <span id=R></span>

edc65
sumber
-n-1= ~nbenar?
CalculatorFeline
@CatsAreFluffy jika n bukan numerik seperti 'A' (itulah inti dari tantangan ini), ~n == -1sementara-n-1 == NaN
edc65
4

GS2 , 6 byte

V↔i/◙s

Kode sumber menggunakan pengkodean CP437. Cobalah online!

Bagaimana itu bekerja

V       Evaluate the input.
 ↔      Push 16.
  i     Perform base conversion.
   /    Sort.
    ◙   Push [10].
     s  Perform greater-or-equal comparison.
Dennis
sumber
4

Oktaf, 22 byte

@(n)all(dec2hex(n)>64)
alephalpha
sumber
4

Java, 46 44 38 byte

i->i.toHexString(i).matches("[a-f]+");

Cukup sederhana satu-liner yang mengubah bilangan bulat menjadi string heksadesimal dan menggunakan regex untuk menentukan apakah semua karakter adalah huruf.

-2 byte terima kasih kepada @ Eng.Fouad.

TNT
sumber
"[a-f]+"akan menghemat 2 byte.
Eng.Fouad
Gagal untuk 516 ..
CalculatorFeline
@CatsAreFluffy Tidak, tidak.
TNT
Nah sekarang menentukan apakah string berisi sebuah surat hex, sehingga menghapus +-itu ini buang-buang byte.
CalculatorFeline
@CatsAreFluffy No. matches mengembalikan true jika seluruh string dapat dicocokkan dengan regex yang diberikan. [a-f]tanpa tanda tambah tidak benar karena tidak cocok dengan keseluruhan string karena mengandung lebih dari satu karakter; itu akan jika dan hanya jika satu karakter yang valid ada.
TNT
3

CJam ( 9 8 bytes)

{GbA,&!}

Demo online

Peter Taylor
sumber
2
Sama pendeknya:{Gb$N<!}
Dennis
3

Ruby, 19 byte

->n{!('%x'%n)[/\d/]}

Tidak Disatukan:

-> n {
  !('%x'%n)[/\d/]
}

Pemakaian:

f=->n{!('%x'%n)[/\d/]} # Assigning it to a variable
f[0]
=> false
f[10]
=> true
f[100]
=> false
f[161]
=> false
f[11259375]
=> true

Dengan bonus, 70 - 40 = 30 byte

->n{'%x'%n=~/^(\d+)|(\D+)$/;$1?'Only numbers':$2?'Only letters':'Mix'}

Pemakaian:

f=->n{'%x'%n=~/^(\d+)|(\D+)$/;$1?'Only numbers':$2?'Only letters':'Mix'}
f[10]
=> Only letters
f[100]
=> Only numbers
f[161]
=> Mix
Vasu Adari
sumber
Terlambat, tetapi '%x'%n!~/\d/pemeriksaan yang lebih pendek untuk solusi satu, dan solusi dua memiliki jumlah byte mentah 70, bukan 75.
Nilai Tinta
3

Perl, 69 - 40 = 29 byte

$_=sprintf"%X",<>;print s/\d//?$_?"Mix":"Only numbers":"Only letters"
ChicagoRedSox
sumber
2

Ceylon, 55 byte

Boolean l(Integer n)=>!any(formatInteger(n,16)*.digit);

Terus terang ... kita memformat nsebagai angka heksadesimal (yang menghasilkan string), memanggil setiap karakter dari string itu .digitnomor (yang mengembalikan true jika itu angka), lalu memeriksa apakah ada di antara mereka yang benar, kemudian negasikan ini.

Versi dengan bonus memiliki skor jauh lebih tinggi dari 119 - 25 = 94 :

String c(Integer n)=>let(s=formatInteger(n),d=s*.digit)(every(d)then"Only numbers"else(any(d)then"Mix"else"Only letters"));

Saya tidak yakin bagaimana orang bisa membuat versi bonus cukup pendek untuk menjadi lebih baik daripada versi tanpa-bonus, bahkan string itu sendiri memiliki panjang 28 bersama. Mungkin bahasa yang membuatnya sangat sulit untuk menghasilkan nilai kebenaran / kepalsuan.

Ini adalah versi yang diformat:

String c(Integer n) =>
        let (d = formatInteger(n,16)*.digit)
    (every(d) then "Only numbers"
                else (any(d) then "Mix"
                    else "Only letters"));
Paŭlo Ebermann
sumber
2

Karat, 70 byte

fn f(n:i32)->bool{format!("{:x}",n).chars().all(|c|c.is_alphabetic())}

Karena, Anda tahu, Java Rust.

Ini sebenarnya cukup elegan, meskipun:

format!("{:x}", n)         // format n as hex (:x)
  .chars()                 // get an Iter over the characters
  .all(                    // do all Iter elements satisfy the closure?
    |c| c.is_alphabetic()  // self-explanatory
  )

Tapi sayang sekali definisi fungsi boilerplate begitu lama ....: P

Gagang pintu
sumber
Saya punya ide. Lebih banyak penutupan!
CalculatorFeline
2

CJam, 44 byte - 40 bonus = 4 byte

2,riGbAf/&:-"Only numbersOnly lettersMix"C/=

Coba di sini ~

Lynn
sumber
2

Serius, 12 byte

4ª,¡OkúOkd-Y

Hex Dump:

34a62cad4f6b
a34f6b642d59

Cobalah secara Online

Ini sama dengan jawaban bahasa stack lainnya. Ini akan menjadi hanya 7 byte jika Serius mendukung pengurangan string yang belum.

EDIT: Serius sekarang mendukung pengurangan string dan solusi 7 byte berikut sekarang berfungsi:

ú4╙,¡-Y

Hex Dump:

a334d32cad2d59

Cobalah secara Online

kuintopia
sumber
1
11: 4╙,¡#S;ú∩S=(atau atau , banyak cara mengeja :16:dalam dua byte: P)
Mego
Saya tidak tahu saya pikir.
kuintopia
2

05AB1E , 2 byte (tidak bersaing)

Kode:

ha

Ha! Itu dua byte! Sayangnya tidak bersaing karena bahasa ini memposting tantangan :(

Penjelasan:

h   # Convert input to hexadecimal
 a  # is_alpha, checks if the value only contains letters

Cobalah online! atau Verifikasi semua kasus uji!

Adnan
sumber
1
hdÔ©1åi•4?ŸâτΛ•}®0åi•4?ŸàpÕTà•}®g2Qi•²•} 36B` untuk bonus yang menghasilkan ... 6 lagi! Bonus Wooooo!
Magic Octopus Mm
2

Python 3, 28 byte

lambda x:min(hex(x)[1:])>'@'
0WJYxW9FMN
sumber
2

SmileBASIC 3.2.1, 78 byte

INPUT V FOR I=0 TO 9
IF INSTR(HEX$(V),STR$(I))>-1 THEN ?"FALSE"END
NEXT?"TRUE"
siput_
sumber
Saya tidak melihat karakter non-ASCII di sini (kecuali ada beberapa); counter ini adalah penentu definitif dan katanya 81.
kucing
1
Tidak masalah bahwa implementasinya menggunakan UTF-16 secara internal; ke seluruh dunia mereka mungkin juga karakter UTF-8 dalam kisaran 0-127, dengan demikian jumlah byte Anda 81.
kucing
Terima kasih atas umpan baliknya, tidak yakin apakah "byte" berarti saya harus menghitung 2 per karakter. 81 itu.
snail_
Sebenarnya, +10 / -0 konsensus saat ini (yang, omong-omong, saya sekarang tidak setuju dengan) adalah bahwa kita harus selalu menggunakan pengkodean yang digunakan penerjemah. Jika Anda tidak setuju, kirimkan pendapat berbeda tentang pertanyaan itu.
lirtosiast
@ThomasKwa pfft, oke, oops, sekarang aku lebih tahu. Saya tidak menyadari ada konsensus tentang itu, dan saya menghabiskan sedikit waktu pada meta.
kucing
1

Japt, 12 byte

!UsG r"[a-f]

Cobalah online!

Bagaimana itu bekerja

!UsG r"[a-f] // Implicit: U = input integer, G = 16
 UsG         // Convert U to a base-16 string.
     r"[a-f] // Replace all lowercase letters with an empty string.
!            // Take the logical NOT of the result.
             // This returns true for an empty string; false for anything else.
Produksi ETH
sumber
Saya pikir !!UsG r"\\dmungkin bekerja dan menyimpan byte
Downgoat
@Downgoat Pengamatan yang baik, tetapi mengembalikan true untuk nomor apa pun yang berisi surat.
ETHproductions
1

Gema, 41 karakter

*=@c{@radix{10;16;*}}
c:<D>=f@end;?=;\Z=t

Tidak ada boolean di Gema, jadi hanya menampilkan "t" atau "f".

Contoh dijalankan:

bash-4.3$ echo -n '11259375' | gema '*=@c{@radix{10;16;*}};c:<D>=f@end;?=;\Z=t'
t
manatwork
sumber