Chuyển đổi 0xUsernames


25

0x Tên người dùng

Có rất nhiều người sử dụng dịch vụ nhắn tin đến nỗi họ sắp hết dung lượng để lưu trữ tất cả tên người dùng! Để khắc phục điều này, họ sẽ bắt đầu lưu trữ tên người dùng dưới dạng thập lục phân, nếu có thể.

Nếu tên người dùng chỉ bao gồm các ký tự 0123456789ABCDEF(không phân biệt chữ hoa chữ thường), nó có thể được chuyển đổi thành số thập lục phân và được lưu dưới dạng số nguyên. Ví dụ: tên người dùng ba5eba11có thể được hiểu là 0xBA5EBA11số nguyên thập lục phân.

Nhưng còn cái gì 05AB1E? Điều đó có một số 0 hàng đầu, sẽ bị mất. Vì vậy, bất cứ khi nào chúng tôi chuyển đổi tên người dùng, chúng tôi đảm bảo đăng ký trước 1khi đọc nó dưới dạng số nguyên.


Các thách thức

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, với tên người dùng không trống dưới dạng chuỗi, 'hexa-nén' tên người dùng:

  • Nếu nó có thể được hiểu là số nguyên thập lục phân, hãy thêm vào số 1, diễn giải dưới dạng thập lục phân, sau đó in kết quả dưới dạng cơ sở 10.
  • Nếu không, chỉ cần trả về chuỗi không thay đổi.

Đây là , vì vậy giải pháp ngắn nhất (tính bằng byte) sẽ thắng! Chức năng chuyển đổi cơ sở tích hợp được cho phép.


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

Bạn có thể giả sử rằng mọi số nguyên kết quả nằm trong phạm vi số nguyên chuẩn của ngôn ngữ của bạn.

Giống như tên người dùng trên hầu hết các hệ thống nhắn tin, các chuỗi đầu vào sẽ chỉ chứa các chữ số và dấu gạch dưới.

Hãy nhớ rằng, bạn luôn cần phải thêm một hàng đầu 1trước khi chuyển đổi!

"ba5eba11" -> 7421737489
"05AB1E"   -> 17148702
"dec0de"   -> 31375582
"Beef"     -> 114415    
"da7aba5e" -> 7960443486
"500"      -> 5376

"DENNIS" -> "DENNIS"
"Garth"  -> "Garth"
"A_B_C"  -> "A_B_C"
"0x000"  -> "0x000"

Để tham khảo, đây là một triển khai Python 3 tôi đã sử dụng cho các trường hợp thử nghiệm (chưa được xử lý):

import re

def convert_name(name):
    if re.fullmatch('^[0-9A-Fa-f]+$', name):
        return int('1' + name.upper(), base = 16)
    else:
        return name

À, không thấy điều đó. Ngoài ra, điều gì sẽ xảy ra nếu một số trường hợp kiểm tra lớn hơn dẫn đến các số nằm ngoài giới hạn của loại số nguyên lớn nhất trong ngôn ngữ của chúng tôi?
Doorknob

2
@Doorknob bắt tốt. Tôi sẽ nói rằng một số nguyên kết quả sẽ không bao giờ nhiều hơn loại số nguyên tiêu chuẩn của ngôn ngữ của bạn. (vui lòng không lạm dụng điều này và sử dụng ngôn ngữ có số nguyên 1 bit)
FlipTack

Có thể giả sử đầu vào chỉ là chữ hoa?
Adám

@ Adám xin lỗi, nhưng chương trình của bạn không phân biệt chữ hoa chữ thường (xem trường hợp kiểm tra)
FlipTack

Giống như Unary ngoại trừ mã hóa tên người dùng thay vì BF
MilkyWay90

Câu trả lời:


27

05AB1E , 4 byte

D1ìH

Giải trình

D    Duplicate input
 1ì  Prepend 1
   H Interpret as hexadecimal and implicitly display the value in base 10

Nếu đầu vào có các ký tự hex không hợp lệ, Hsẽ không đẩy bất cứ thứ gì vì vậy giá trị cuối cùng trên ngăn xếp sẽ là đầu vào trùng lặp, đó là lý do tại sao chương trình in đầu vào của nó trong trường hợp đầu vào không hợp lệ.

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


9
Sự trớ trêu là khá mạnh ở đây. 05AB1Elà tên người dùng hợp lệ.
devR Rich

1
Điều đó đúng, tuy nhiên tên được chọn là số thập lục phân. Do đó, nó hợp lệ :)
Có thể chấp nhận được vào

Tự hỏi tại sao bạn bị lừa Thay vào đó, cố gắng nghĩ cách sử dụng $ thay vào đó ....
Magic Octopus Urn

16

JavaScript (ES6), 15 byte

s=>'0x1'+s-0||s

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

'0x1'+schuyển đổi đầu vào thành một chuỗi thập lục phân bằng chữ với một tiền tố 1, ví dụ 0x105ab1e. Sau đó, -0đưa kết quả đến một số. JavaScript nhìn thấy 0xngay từ đầu và cố gắng chuyển đổi từ hệ thập lục phân; nếu schứa bất kỳ ký tự không thập lục phân, điều này trả về NaN. Vì đây là giả mạo (và đầu ra 0không bao giờ có thể được cung cấp vì đã được chuẩn bị trước 1), chúng tôi có thể sử dụng ||sđể trả về snếu chuyển đổi hex không thành công.

Kiểm tra đoạn

f = s=>'0x1'+s-0||s

for(i of [
  "ba5eba11", "05AB1E", "dec0de", "Beef", "da7aba5e", "500",
  "DENNIS", "Garth", "A_B_C", "0x000"
]) console.log(i + ":", f(i));


2
Giải pháp rất hay!
Grax32

Đúc ngầm thực sự rất đẹp ...: ')
Hạ cấp

10

Python 2 , 44 byte

Đưa đầu vào dưới dạng một chuỗi trích dẫn. -2 byte nhờ Rod!

a=input()
try:exec'a=0x1'+a
except:1
print a

Vì chúng tôi đảm bảo rằng đầu vào sẽ chỉ chứa chữ số và dấu gạch dưới, không có cách nào để tạo Python hợp lệ sau khi 0x1có chuỗi hex. Nếu đầu vào là bất cứ điều gì khác, lỗi sẽ bị bỏ qua và in như ban đầu.

Tôi dường như không thể tạo ra một trận đấu regex nào ngắn hơn try/except. Trong thực tế, regex hóa ra rất dài dòng:

import re
lambda n:re.match('^[0-9A-F]+$',n,2)and int('1'+n,16)or n

bạn cũng có thể thay thế a=int('1'+a,16)bằng exec'a=0x1'+a(có thể, cần kiểm tra)
Rod

Bạn biết đấy, chúng ta sẽ phải trả lời chính xác như vậy nếu tôi tiếp tục chơi golf phải không?
Anthony Phạm

Không làm việc cho tên người dùng đó sẽ là hợp lệ Python trong bối cảnh đó, ví dụ "+input()".
heinrich5991

thất bại cho "abc" (chú ý khoảng trắng ở cuối) (int cho phép khoảng trắng ở đầu và cuối)
Siphor

Tôi không biết chính xác nó như thế nào đối với Python 2, nhưng tôi nghĩ bạn có thể xóa dấu ngoặc ()tạiinput()
RudolfJelin

8

Perl 6 , 19 byte

{:16(1~S/_/Z/)//$_}

Kiểm tra nó

Mở rộng:

{   # bare block lambda with implicit parameter 「$_」

    :16(     # convert from base 16
      1
      ~      # Str concatenated
      S/_/Z/ # replace an underscore with an invalid base 16 character
    )

  //         # defined or

    $_       # the input unchanged

}

7

Perl, 27 byte

-1 byte nhờ @ardnew .

26 byte mã + -pcờ.

$_=hex"1$_"if!/[^0-9a-f]/i

Cung cấp đầu vào mà không có dòng mới cuối cùng. Với echo -nví dụ:

echo -n 05AB1E | perl -pe '$_=hex"1$_"if!/[^0-9a-f]/i'

Giải thích
Điều này khá dễ dàng: /[^0-9a-f]/ilà đúng nếu đầu vào chứa một ký tự không phải là ký tự được phép bên trong các số thập lục phân. Nếu nó sai, $_(chứa đầu vào), nó được đặt thành giá trị được chuyển đổi (việc chuyển đổi được thực hiện bởi nội dung hex).
$_được in ngầm nhờ -pcờ.


bạn có thể cạo một byte bằng cách tránh thao tác ternary$_=hex"1$_"if!/[^0-9a-f]/i
ardew

@ardnew Hum, bây giờ bạn nói điều đó, chú chim nhạn đó khá là kinh khủng ... Dù sao đi nữa, cảm ơn!
Dada


3

Mẻ, 33 byte

@(cmd/cset/a0x1%1 2>nul)||echo %1

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

Một chuỗi được truyền vào dưới dạng đối số, 1 được thêm vào chuỗi đó và chuỗi được chuyển đổi hoàn toàn thành số thập phân và được in. Nếu chuỗi không phải là thập lục phân hợp lệ, nó được hiển thị đơn giản.

Cần lưu ý rằng vì toán toán lô sử dụng các số nguyên 32 bit đã ký, tên người dùng được phép lớn nhất là FFFFFFF.

cmd /c nhận lệnh tiếp theo, chạy nó trong một thiết bị đầu cuối mới và thoát.

set /a thực hiện toán học và hiển thị ngầm định kết quả ở dạng thập phân khi không được lưu trữ vào một biến.

0x1%1 thông báo được đặt để đặt trước 1 cho đối số đầu tiên (điều này rất dễ vì tất cả các biến bó là chuỗi) và chỉ ra rằng chuỗi phải được coi là thập lục phân.

2>nul làm im lặng mọi lỗi phát sinh từ số thập lục phân không hợp lệ

||là một OR logic và thực hiện lệnh bên phải nếu lệnh bên trái không thành công. Các dấu ngoặc đơn làm cho mọi thứ cho đến thời điểm này một lệnh.

echo %1 chỉ đơn giản là hiển thị đối số đầu tiên.


3

Lisp thường gặp, 71

(lambda(n)(or(ignore-errors(parse-integer(format()"1~A"n):radix 16))n))

Xét nghiệm

Xác định hàm

CL-USER> (lambda(n)(or(ignore-errors(parse-integer(format()"1~A"n):radix 16))n))
#<FUNCTION (LAMBDA (N)) {10041D213B}>

Trích dẫn một danh sách các đầu vào dự kiến, như được đưa ra bởi câu hỏi:

CL-USER> '("ba5eba11" -> 7421737489
"05AB1E"   -> 17148702
"dec0de"   -> 31375582
"Beef"     -> 114415    
"da7aba5e" -> 7960443486
"500"      -> 5376

"DENNIS" -> "DENNIS"
"Garth"  -> "Garth"
"A_B_C"  -> "A_B_C"
"0x000"  -> "0x000")
("ba5eba11" -> 7421737489 "05AB1E" -> 17148702 "dec0de" -> 31375582 "Beef" ->
 114415 "da7aba5e" -> 7960443486 "500" -> 5376 "DENNIS" -> "DENNIS" "Garth" ->
 "Garth" "A_B_C" -> "A_B_C" "0x000" -> "0x000")

Phân tích cú pháp và thu thập kết quả

CL-USER> (loop for (in _ out) on * by #'cdddr
               collect (list in out (funcall ** in)))
(("ba5eba11" 7421737489 7421737489) ("05AB1E" 17148702 17148702)
 ("dec0de" 31375582 31375582) ("Beef" 114415 114415)
 ("da7aba5e" 7960443486 7960443486) ("500" 5376 5376)
 ("DENNIS" "DENNIS" "DENNIS") ("Garth" "Garth" "Garth")
 ("A_B_C" "A_B_C" "A_B_C") ("0x000" "0x000" "0x000"))

Kiểm tra xem kết quả đầu ra dự kiến ​​có khớp với kết quả thực tế không:

CL-USER> (every (lambda (x) (equalp (second x) (third x))) *)
T

2

C, 108 byte

i;f(char*s){char*S=malloc(strlen(s)+2);*S=49;strcpy(S+1,s);sscanf(S,"%x%c",&i,&i)<2?printf("%d",i):puts(s);}

Đây là một hàm lấy chuỗi làm đối số và in kết quả ra STDOUT.

i;                           // declare i as an int
f(char*s){
char*S=malloc(strlen(s)+2);  // allocate space for a new string with 1 more char
*S=49;                       // set the first char to '1' (ASCII 49)
strcpy(S+1,s);               // copy the original string to the remainder
sscanf(S,"%x%c",&i,&i)       // scan a hex integer followed by any char
<2?                          // if less than 2 items were scanned (i.e. the hex
                             // integer made up the entire string),
printf("%d",i)               // output the hex integer
:puts(s);}                   // otherwise, output the original string

Cách sử dụng tuyệt vời int:)
FlipTack

2

JavaScript: 46 41 byte

s=>/[^\dA-F]/i.test(s)?s:parseInt(1+s,16)

Regex có thể ngắn hơn 2 byte:/[^0-9a-f]/i
GilZ

Tôi đã lưu 1 byte bằng cách thay thế 0-9bằng \d3 byte bằng cách thêm cờ không phân biệt chữ hoa chữ thường (cảm ơn @GilZ) và thêm 2 byte bằng cách xóa F=, điều này không cần thiết. Cám ơn vì sự gợi ý.
Lu-ca

2

PHP, 42 byte

hex2bin () trả về false nếu đầu vào không phải là chuỗi hex hợp lệ. Điều này ngắn hơn so với việc sử dụng regex để tìm kiếm các chữ số không hex, nhưng chúng tôi cần toán tử @ vì nó không im lặng khi thất bại.

<?=@hex2bin($s=$argv[1])?hexdec("1$s"):$s;

hex2binthất bại cho các chuỗi có độ dài không đồng đều. Vẫn còn hai byte ngắn hơn so với preg_matchmặc dù: <?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;cho 57 byte.
Tít

2

bash, 46 35 31 byte

(echo $[0x1$1])2> >(:)||echo $1

Lưu dưới dạng tập lệnh và chuyển tên người dùng làm đối số.


1

Con trăn 2 - 63, 52, 50, 46 byte

n=input()
try:n=int("1"+n,16)
except:1
print n

Cái này sử dụng Python int()để chuyển đổi bất kỳ chuỗi nào có cơ sở thích hợp thành cơ sở 10. Trong trường hợp này, chuỗi là số 1 được gắn vào đầu vào. Nếu đầu vào không hợp lệ (có các ký tự khác 0123456789ABCDEF(không phân biệt chữ hoa chữ thường), nó sẽ trả về ValueError:

n = input()                   # Get input (with quotes)
try:                          # Trying conversion to base 10
    n = int("1"+n,16)        
except:                       # If invalid string for base 36,
    1                         # do nothing to n
print n                       # Print result

Hãy thử nó ở đây!

Cảm ơn @FlipTack đã lưu 15 byte!


Điều gì xảy ra nếu chuỗi không bắt đầu bằng 0? Bạn chỉ nên thêm một ở bên trái của chuỗi nếu nó bắt đầu bằng số không.
0WJYxW9FMN

@FlipTack Rất tiếc, tôi thật ngốc.
0WJYxW9FMN

1

Ruby, 47 44 byte

p gets=~/^[a-f\d]+\s$/i?('1'+$&).to_i(16):$_

Tôi có thể loại bỏ 3 byte bằng cách thay đổi putscho p, nhưng tôi có cảm giác như đầu ra sẽ được coi là sai vì nó có một dòng mới vào cuối.

Chỉnh sửa: Thay đổi putscho pnhư newlines trailing thường được chấp nhận, nhờ @Mego.


Trailing newlines trên STDOUT thường được coi là chấp nhận được.
Mego

1

Japt , 11 byte

+`0x1{U}`ªU

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

Cảm ơn rất nhiều đến ETHproductions!


1
Đây là một trong những trường hợp hiếm hoi mà bạn có thể thoát khỏi không gian :-) (Ngoài ra, liên kết TIO là chương trình "Xin chào, Thế giới!")
ETHproductions

1

APL Dyalog , 37 byte

Sử dụng không có xác nhận tích hợp hoặc chuyển đổi hex-dec. Yêu cầu ⎕IO←0mặc định trên nhiều hệ thống.

{∧/(u1(819⌶)⍵)∊d←⎕D,6↑⎕A:161,du⋄⍵}

Ung dung:

{
    d  D , 6  A
    u1 (819⌶) 
    ∧/ u  d: 16  1 , d  u
    
}

d ← ⎕D , 6 ↑ ⎕Ad được D igits theo sau bởi 6 yếu tố đầu tiên của A lph.us

u ← 1 (819⌶) ⍵bạn nhận được đối số (819 Big "Lớn")

∧/ u ∊ d: nếu tất cả các phần tử của u là thành viên của d , thì:
16 ⊥ 1 , d ⍳ u tìm các chỉ số của u trong d , nhập trước 1 và đánh giá là cơ sở 16

} khác: trả về đối số (chưa sửa đổi)

Dùng thử trực tuyến:

  1. Đặt ⎕IOthành không, xác định thay thế cho (bị cấm trên TryAPL vì lý do bảo mật) và đặt ⎕PP( P rint P recision) thành 10 cho kết quả lớn

  2. Hãy thử tất cả các trường hợp thử nghiệm


1

REXX, 49 48 byte

signal on syntax
pull a
a=x2d(1||a)
syntax:
say a

Các signal on syntax cho trình thông dịch nhảy đến nhãn syntaxbất cứ khi nào xảy ra lỗi cú pháp. Chương trình cố gắng gán lại avới phiên bản được chuyển đổi từ thập phân sang thập phân với số 1 đứng đầu, nhưng nhảy sang syntaxnhãn nếu thất bại. Nếu chuyển đổi không vượt qua, nó chỉ cần bỏ qua nhãn và xuất ra biến được gán lại.


2
Bạn có thể giải thích mã của mình được không
Anthony Phạm

0

PowerShell , 35 byte

param($v)(($h="0x1$v"|iex),$v)[!$h]

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

Giải trình

  1. Lấy tham số ( $v)
  2. Tạo một mảng hai phần tử trong đó phần tử đầu tiên ( 0) là kết quả của một chuỗi chứa 0x1$vđường ống vào Invoke-Expression( iex), đồng thời gán giá trị này cho $h. Nếu chuyển đổi không thành công,$h sẽ vẫn còn $null.
  3. Phần tử thứ hai của mảng là tham số ban đầu.
  4. Chỉ mục vào mảng với -notgiá trị boolean của $h. Bất cứ điều gì $hsẽ được chuyển đổi hoàn toàn thành [bool]( $nulltrong trường hợp chuyển đổi không hợp lệ sẽ trở thành $false, một số nguyên dương trong trường hợp chuyển đổi thành công sẽ trở thành $true) trước khi bị phủ định, sau đó được chuyển đổi ngầm định sang bộ [int]chỉ mục mảng []( $truesẽ 1, $falsesẽ được 0), do đó dẫn đến phần tử đầu tiên của mảng (kết quả chuyển đổi) được chọn nếu chuyển đổi thành công và phần tử thứ hai được chọn nếu chuyển đổi không thành công.

0

Scala, 40 byte

s=>try{BigInt("1"+s,16)}catch{case e=>s}

Sử dụng:

val f:(String=>Any)=s=>try{BigInt("1"+s,16)}catch{case e=>s}
f("ba5eba11") //returns 7421737489

Giải trình:

s=>                //define a anonymous function with a parameter called s
  try {              //try...
    BigInt("1"+s,16)   //to contruct a BigInt from "1" prepended to the number, parsing it as base 16
  } catch {          //if the constructor throws an exception
    case e =>          //in case of an execption which we'll call e
      s                  //return s
  }

0

C #, 58 byte

u=>{try{u=Convert.ToInt64("1"+u,16)+"";}catch{}return u;};

Ung dung với các trường hợp thử nghiệm:

using System;
class Class
{
    public static void Main()
    {
        Func<string, string> convert = 
            u=>
            {
                try
                {
                    u = Convert.ToInt64("1" + u, 16) //Prepends "1" and tries to convert the string to and integer using base 16.
                        + ""; //Appending an empty string converts the integer to a string. Shorter than calling .ToString()
                }
                catch { } //If the conversion fails catch the exception and discard it.
                return u; //Return the result, or the unmodified input if the conversion failed.
            };

        Console.WriteLine(convert("ba5eba11"));
        Console.WriteLine(convert("05AB1E"));
        Console.WriteLine(convert("dec0de"));
        Console.WriteLine(convert("Beef"));
        Console.WriteLine(convert("da7aba5e"));
        Console.WriteLine(convert("500"));
        Console.WriteLine(convert("DENNIS"));
        Console.WriteLine(convert("Garth"));
        Console.WriteLine(convert("A_B_C"));
        Console.WriteLine(convert("0x000"));
        Console.Read();
    }
}

Thử trực tuyến


0

Phi tiêu, 51 byte

(s)=>int.parse('1$s',radix:16,onError:(_)=>null)??s

Hãy thử nó ở đây

Hầu hết các chi phí đến từ các tham số được đặt tên ... Oh tốt!

Ít nhất là Dart cho phép bạn được gõ động, nếu bạn muốn: D

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.