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.


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

?&K@J.HQG-JG"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.


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


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.

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)


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


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          

2
hmmm apa itu? Sepertinya matlab mendapat kekuatan nuc sekarang!
Abr001am

@ Agawa001 Hahaha. Semacam
Luis Mendo


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");
  }
}

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.


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

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.

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)

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.


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>


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


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.


"[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

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

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"

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"));

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


Saya punya ide. Lebih banyak penutupan!
CalculatorFeline


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


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!


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



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"

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.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.