Các số thực sự là chữ cái


42

Cho đầu vào số nguyên không âm, hãy viết chương trình chuyển đổi số thành thập lục phân và trả về giá trị trung thực nếu dạng thập lục phân của số chỉ chứa các ký tự Athông qua Fvà giá trị falsey khác.


Các trường hợp thử nghiệm

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)

Phần thưởng: -40 byte nếu chương trình của bạn in Only letterscho thử thách được mô tả ở trên, Only numbersnếu phiên bản thập lục phân của số chỉ chứa các chữ số 0-9Mixnếu số thập lục phân chứa ít nhất một số và ít nhất một chữ cái.


Đây là mã golf. Quy tắc tiêu chuẩn áp dụng. Mã ngắn nhất trong byte thắng. Chức năng hoặc chương trình đầy đủ được cho phép.


2
Hiện đang soạn thảo một câu trả lời trong Golfical.
SuperJedi224

Ý tưởng hiện tại của tôi: chuyển sang chuỗi 16 cơ sở, sau đó Xem nếu cố gắng phân tích chuỗi đó dưới dạng số 10 cơ sở trả vềNaN
Cyoce

@Cyoce Điều đó có thể hoạt động, tùy thuộc vào sự lựa chọn ngôn ngữ của bạn
SuperJedi224

3
Phần thưởng không thực tế (một lần nữa): chỉ chuỗi MixOnlynumbersletterslà 21 ký tự
edc65

3
Bạn nói "đầu vào số nguyên dương", nhưng 0 là trường hợp thử nghiệm.
xnor

Câu trả lời:


22

Pyth, 43 - 40 = 3 byte

?&K@J.HQG-JG"Mix"%"Only %sers"?K"lett""numb

Bộ kiểm tra

Điều này đạt được tiền thưởng. Only numbersOnly lettersmay mắn thay chỉ khác nhau bởi 4 chữ cái. định dạng kiểu printf được sử dụng với %.

Hệ thống lựa chọn được thực hiện bằng cách lấy cả giao điểm của hex với G, bảng chữ cái và trừ đi G. Nếu không kết thúc sai, đó là một hỗn hợp, trong khi nếu giao lộ là giả, đó là số và nếu phép trừ là giả, đó là chữ cái.


1
Chết tiệt Pyth này là lạ. Sẽ rất tuyệt nếu bạn có thể nhận được một số điểm tiêu cực.
KaareZ

15

Bình thường, 6 byte

!-.HQG

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

Kiểm tra nó ở đây


12

Thạch , 6 byte

b16>9P

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Không có tích hợp cho 16 hay đó không phải là một điều?
Máy

1
Có ngay bây giờ. Đây là một trong những câu trả lời đầu tiên của Jelly ...
Dennis

11

TeaScript , 11 byte 13 15 16

xT(16)O(Sz)

Khá đơn giản. Điều này sử dụng TeaScript 2.0. Bạn có thể lấy phiên bản này từ Github

Giải trình

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

Dùng thử trực tuyến (phiên bản sửa đổi một chút hoạt động trên web)


3
Là bỏ phiếu vì điều này là dài? Có điều gì khác sai với câu trả lời này mà tôi không biết? Hay ai đó không thích cá nhân câu trả lời này?
Hạ cấp

2
Tôi sẽ không nói 16 hoặc 13 byte là dài!
Luis Mendo

23
Bạn phải thừa nhận rằng bài viết của bạn đi xuống khá hấp dẫn.
Dennis

10

Python, 24 byte

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

Chuyển đổi đầu vào một chuỗi hex (không có 0xtiền tố) với '%x'%n. Xem nếu tất cả các ký tự của nó lớn hơn '9'(chữ cái nào) bằng cách xem nếu minở trên '9'.


Tôi không biết Python xử lý các ký tự / số như thế nào, nhưng mã ASCII '9'là 54. Vì vậy, nếu bạn có thể viết, ...>54bạn có thể lưu một byte.
CompuChip

@CompuChip Python không coi ký tự hoặc chuỗi là số. Trong thực tế, Python 2 coi chúng lớn hơn tất cả các số.
xnor

8

TOÁN , 10

i16YA1Y2mA

Ví dụ

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

Giải trình

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

Thử thách tiền thưởng: 53−40 = 13

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

Ví dụ

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

Giải trình

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 đó là cái gì có vẻ như matlab có một số sức mạnh nuc bây giờ!
Abr001am

@ Agawa001 Hahaha. Sắp xếp
Luis Mendo


8

C, 46 43 37 byte

Bây giờ với đệ quy nhiều hơn! (Cảm ơn Dennis):

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

Phần thưởng: thậm chí ngắn hơn (33 byte), nhưng không thành công cho 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()mất một intvà trả về 0(sai) hoặc khác không (đúng).

Tôi thậm chí đã không cố gắng để đạt được tiền thưởng, chỉ "MixOnly lettersnumbers"mất 23 byte, theo dõi điều kiện mới sẽ cần thêm 9 byte, printf()là 8 byte, cộng thêm tối đa 40, vô hiệu hóa nỗ lực.

Kiểm tra chính:

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

Có gì ?:? Tôi đã phải thay thế ||nó để biên dịch nó. Ngoài ra, bạn có thể lưu một byte bằng cách thay thế *bằng một &cách tránh các ()s ở bên trái (mặc dù sau đó bạn phải thêm một khoảng trắng)?
Neil

@Neil a?:blà một phần mở rộng GNU đánh giá anếu alà một giá trị trung thực, nếu không thì b. Đi kèm tiện dụng để xử lý con trỏ null như thế nào send(message ?: "(no message)");. Tôi biết nó không phải là di động, nhưng tính di động của mã không bao giờ là vấn đề đáng lo ngại trong môn đánh gôn :)
Stefano Sanfilippo

@StefanoSanfilippo bạn có thể chuyển xuống 33byte bằng cách thực hiện điều này: F(x){x=(x%16>9)*(x<16?:F(x/16));}điều này lạm dụng một lỗi (GCC) trong đó nếu không có biến trả về trong hàm và đối số chính được đặt, nó sẽ tự động trả về đối số chính trong một số trường hợp ( dựa trên những gì logic đã được thực hiện), và điều này xảy ra là một trong những trường hợp đó! Dùng thử trực tuyến: bit.ly/2pR52UH
Albert Renshaw

8

Python 3, 30 29 byte

1 byte bị tước nhờ sysreq và Python 3.

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

Đơn giản lambdavà cắt lát.


7

Perl 6 , 18 byte

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

sử dụng:

# 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

Toán học, 32 byte

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

Giải trình:

                               &   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, không có biểu thức chính quy, 28 byte

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

Cũng có phiên bản 27 byte này nhưng nó trả về giá trị nghịch đảo.

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

Đẹp! Bạn cũng có thể sắp xếp lại nó như thế này trong 23 byte:F=n=>!n||n%16>9&F(n>>4)
user81655

@ user81655 - Thật không may, phiên bản đó trả về giá trị 0, vì vậy không chính xác.
zocky

Oh phải, tôi đoán ngắn nhất sẽ là F=n=>n%16>9&&n<16|F(n>>4)sau đó.
dùng81655

@ user81655 Tôi khá chắc chắn rằng bạn cần phải đoản mạch ||, nhưng tôi nghĩ bạn có thể thoát khỏi việc sử dụng &thay vì &&trong trường hợp đó.
Neil

@Neil Tại sao vậy? Bạn đã kiểm tra nó?
dùng81655

7

Julia, 18 byte

n->isalpha(hex(n))

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một boolean. Để gọi nó, đặt tên cho nó, vd f=n->....

Đầu vào được chuyển đổi thành một chuỗi thập lục phân bằng cách sử dụng hex, sau đó chúng tôi kiểm tra xem nó có bao gồm các ký tự chữ cái hay không isalpha.


6

JavaScript ES6, 29

Không có tiền thưởng

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

Với giá trị mới là -40 , phần thưởng gần hơn ... nhưng không đủ. Điểm thưởng 70 71 - 40 => 30 31

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

Kiểm tra đoạn mã (nhập một số bên trong hộp nhập)

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


-n-1= ~n, phải không?
Máy

@CatsAreFluffy nếu n không phải là số như 'A' (đó là toàn bộ vấn đề trong thử thách này), ~n == -1trong khi-n-1 == NaN
edc65

4

GS2 , 6 byte

V↔i/◙s

Mã nguồn sử dụng mã hóa CP437. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Một lớp lót khá đơn giản có thể chuyển đổi số nguyên thành chuỗi thập lục phân và sử dụng biểu thức chính quy để xác định xem tất cả các ký tự có phải là chữ cái không.

-2 byte nhờ @ Eng.Fouad.


"[a-f]+"sẽ tiết kiệm được 2 byte.
Tiếng Anh.

Thất bại cho 516 ..
Máy

@CatsAreFluffy Không, không.
TNT

Bây giờ, nó xác định xem chuỗi có chứa một chữ cái hex hay không, vì vậy hãy loại bỏ sự +lãng phí byte.
Máy

@CatsAreFluffy Số matches trả về true nếu toàn bộ chuỗi có thể được khớp với regex đã cho. [a-f]không có dấu cộng là không chính xác vì nó không khớp với toàn bộ chuỗi cho rằng nó chứa nhiều hơn một ký tự; nó sẽ nếu và chỉ khi một nhân vật hợp lệ có mặt.
TNT


3

Ruby, 19 byte

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

Ung dung:

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

Sử dụng:

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

Với tiền thưởng, 70 - 40 = 30 byte

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

Sử dụng:

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

Trễ, nhưng '%x'%n!~/\d/là một kiểm tra ngắn hơn cho giải pháp một và giải pháp hai có số byte thô là 70, không phải 75.
Ink Ink

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

Nói một cách đơn giản ... chúng ta định dạng dưới dạng nsố thập lục phân (tạo ra một chuỗi), gọi mỗi ký tự của chuỗi đó là .digitsố (trả về giá trị true nếu đó là một chữ số), sau đó kiểm tra xem có bất kỳ số nào là đúng không, sau đó phủ nhận điều này.

Phiên bản có tiền thưởng có số điểm cao hơn rất nhiều là 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"));

Tôi không chắc làm thế nào bất cứ ai có thể làm cho một phiên bản phần thưởng đủ ngắn để tốt hơn phiên bản không có phần thưởng, ngay cả những chuỗi đó chỉ có độ dài 28 cùng nhau. Có lẽ một ngôn ngữ làm cho nó thực sự khó tạo ra một giá trị trung thực / falsey.

Đây là một phiên bản được định dạng:

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

2

Rust, 70 byte

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

Bởi vì, bạn biết đấy, Java Rust.

Nó thực sự khá thanh lịch, mặc dù:

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
  )

Nhưng thật xấu hổ khi bản tóm tắt định nghĩa hàm quá dài ....: P


Tôi có ý này. Đóng cửa nhiều hơn!
Máy


2

Nghiêm túc, 12 byte

4ª,¡OkúOkd-Y

Bãi rác Hex:

34a62cad4f6b
a34f6b642d59

Dùng thử trực tuyến

Nó giống như các câu trả lời ngôn ngữ ngăn xếp khác. Nó sẽ chỉ có 7 byte nếu trừ chuỗi được hỗ trợ nghiêm túc.

EDIT: Nghiêm túc bây giờ hỗ trợ trừ chuỗi và giải pháp 7 byte sau đây hiện hoạt động:

ú4╙,¡-Y

Bãi rác Hex:

a334d32cad2d59

Dùng thử trực tuyến


1
11: 4╙,¡#S;ú∩S=(hoặc hoặc , rất nhiều cách để đánh vần :16:theo hai byte: P)
Mego

Tôi không biết SI nghĩ gì.
quintopia

2

05AB1E , 2 byte (không cạnh tranh)

Mã số:

ha

Hà! Đó là hai byte! Đáng buồn là không cạnh tranh vì ngôn ngữ này hoãn thách thức :(

Giải trình:

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

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm!


1
hdÔ©1åi•4?ŸâτΛ•}®0åi•4?ŸàpÕTà•}®g2Qi•²•} 36B` cho phần thưởng dẫn đến ... thêm 6! Phần thưởng Wooooo!
Bạch tuộc ma thuật Urn



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"

Tôi không thấy bất kỳ ký tự không phải ASCII nào ở đây (trừ khi có một số ký tự); truy cập này là người quyết định dứt khoát và nó nói 81.
con mèo

1
Việc triển khai sử dụng UTF-16 trong nội bộ không thành vấn đề; với phần còn lại của thế giới, chúng cũng có thể là ký tự UTF-8 trong phạm vi 0-127, do đó, số byte của bạn là 81.
mèo

Cảm ơn phản hồi, không chắc chắn nếu "byte" có nghĩa là tôi nên đếm 2 mỗi char. 81 nó là.
ốc_

Trên thực tế, sự đồng thuận + 10 / -0 hiện tại (mà hiện tại tôi không đồng ý) là chúng ta phải luôn sử dụng mã hóa mà trình thông dịch sử dụng. Nếu bạn không đồng ý, xin vui lòng gửi một ý kiến ​​không đồng tình về câu hỏi đó.
lirtosiast

@ThomasKwa pfft, được rồi, ôi, giờ tôi biết rõ hơn. Tôi đã không nhận ra rằng có một sự đồng thuận về điều đó và tôi dành một chút thời gian cho meta.
con mèo

1

Japt, 12 byte

!UsG r"[a-f]

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Tôi nghĩ rằng !!UsG r"\\dcó thể làm việc và tiết kiệm một byte
Downgoat

@Downgoat Quan sát tốt, nhưng điều đó trả về đúng cho bất kỳ số nào có chứa một chữ cái.
Sản xuất ETH

1

Gema, 41 ký tự

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

Không có boolean trong Gema, do đó, nó chỉ đơn giản là xuất ra các bản nhạc hay trò chơi.

Chạy mẫu:

bash-4.3$ echo -n '11259375' | gema '*=@c{@radix{10;16;*}};c:<D>=f@end;?=;\Z=t'
t
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.