“0xUsernames”변환


25

0x 사용자 이름

메시징 서비스를 사용하는 사람이 너무 많아서 모든 사용자 이름을 저장할 공간이 부족합니다! 이 문제를 해결하기 위해 가능한 경우 사용자 이름을 16 진수로 저장하기 시작합니다.

사용자 이름이 문자로만 구성된 0123456789ABCDEF경우 (대소 문자 구분) 16 진수로 변환하여 정수로 저장할 수 있습니다. 예를 들어, 사용자 이름 ba5eba110xBA5EBA1116 진수 정수 로 해석 될 수 있습니다 .

그러나 어떻 05AB1E습니까? 그것은 앞에 0을 잃어 버릴 것입니다. 따라서 사용자 이름을 변환 할 때마다 1정수로 읽기 전에 앞에 붙여야합니다 .


도전

비어 있지 않은 사용자 이름을 문자열로 지정하면 사용자 이름을 '헥사 압축'하는 프로그램이나 함수를 작성해야합니다.

  • 16 진수 정수로 해석 될 수 있으면 1을 앞에 붙이고 16 진수로 해석 한 다음 결과 를 밑이 10으로 인쇄하십시오 .
  • 그렇지 않으면 문자열을 수정하지 않고 반환하십시오.

이것은 이므로 가장 짧은 솔루션 (바이트)이 이깁니다! 내장 된 기본 변환 기능이 허용됩니다.


테스트 사례

결과 정수가 언어의 표준 정수 범위 내에 있다고 가정 할 수 있습니다.

대부분의 메시징 시스템에서 사용자 이름과 마찬가지로 입력 문자열에는 영숫자와 밑줄 만 포함됩니다.

1전환 전에 항상 선행을 추가해야합니다 .

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

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

참고로, 테스트 사례에 사용 된 Python 3 구현은 다음과 같습니다.

import re

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

아, 그것을 보지 못했습니다. 또한 더 큰 테스트 사례 중 일부가 언어의 가장 큰 정수 유형의 범위를 벗어난 숫자를 만드는 경우 어떻게해야합니까?
Doorknob

2
@Doorknob 좋은 캐치. 결과 정수는 절대 언어의 표준 정수 유형보다 크지 않을 것이라고 말할 것입니다. (이것을 남용하지 말고 1 비트 정수를 가진 언어를 사용하십시오)
FlipTack

입력이 대문자로만 되어도 괜찮습니까?
Adám

@ Adám 죄송하지만 프로그램은 대소 문자를 구분하지 않아야합니다 (테스트 사례 참조)
FlipTack

BF 대신에 사용자 이름을 인코딩한다는 점을 제외하고는 단항과 비슷합니다
MilkyWay90

답변:


27

05AB1E , 4 바이트

D1ìH

설명

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

입력에 16 진 문자가 유효하지 H않으면 아무 것도 푸시하지 않으므로 스택의 마지막 값이 복제 된 입력이됩니다. 따라서 입력이 유효하지 않은 경우 프로그램이 입력을 인쇄합니다.

온라인으로 사용해보십시오!


9
아이러니는 여기서 매우 강하다. 05AB1E유효한 사용자 이름입니다.
devRicher

1
맞습니다. 그러나 이름은 16 진수 로 선택 되었습니다. 따라서 그것은 유효합니다 :)
Osable

왜 속이는 지 궁금해 그래도 대신 $를 사용하는 방법을 생각하려고 ....
Magic Octopus Urn

16

자바 스크립트 (ES6), 15 바이트

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

작동 원리

'0x1'+s입력을 앞에 붙인 리터럴 16 진 문자열로 변환합니다 ( 1예 :) 0x105ab1e. 그런 다음 -0결과를 숫자로 변환합니다. JavaScript는 0x시작 부분을 보고 16 진수에서 암시 적으로 변환을 시도합니다. s16 진수가 아닌 문자 가 포함되어 있으면를 반환합니다 NaN. 이것은 거짓이므로 ( 0앞에 추가하여 출력을 줄 수 없음 1) 16 진수 변환이 실패하면 ||s반환 s하는 데 사용할 수 있습니다 .

테스트 스 니펫

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
아주 좋은 해결책!
Grax32

암시 적 캐스팅은 정말 아름답습니다 ... : ')
Downgoat

10

파이썬 2 , 44 바이트

인용 된 문자열로 입력을받습니다. Rod 덕분에 -2 바이트!

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

입력에 영숫자와 밑줄 만 포함된다는 것이 보장되므로 0x116 진 문자열 이외의 유효한 파이썬을 만들 수있는 방법은 없습니다 . 입력이 다른 것이면 오류는 무시되고 원래 있던대로 인쇄됩니다.

보다 짧은 정규식 일치를 만들 수 없습니다 try/except. 실제로 정규 표현식은 매우 장황한 것으로 판명되었습니다.

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

당신은 또한 대체 할 수있는 a=int('1'+a,16)exec'a=0x1'+a(시험에 아마 필요)
로드

내가 계속 골프를 계속한다면 우리는 똑같은 대답을해야 할 것입니까?
Anthony Pham

해당 컨텍스트에서 유효한 Python 인 사용자 이름 (예 :)에서는 작동하지 않습니다 "+input()".
heinrich5991

"abc"에 실패합니다 (끝에 공백을
알립니다

파이썬 2가 어떻게 작동하는지는 잘 모르겠지만 다음에서 대괄호 ()를 제거 할 수 있다고 생각합니다 .input()
RudolfJelin

8

펄 6 , 19 바이트

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

그것을 테스트

넓히는:

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

펄, 27 바이트

@ardnew 덕분에 -1 바이트 .

26 바이트의 코드 + -p플래그

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

마지막 줄 바꿈 없이 입력 을 제공하십시오 . 로 echo -n예를 들면 :

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

설명
이 꽤 정직은 : /[^0-9a-f]/i입력이 16 진수 내부에 허용 된 이외의 문자가 포함 된 경우 사실이다. $_입력이 포함 된 false 인 경우 변환 된 값으로 설정됩니다 (변환은 내장에 의해 수행됨 hex).
그리고 플래그 $_덕분에 암시 적으로 인쇄됩니다 -p.


삼항 연산을 피함으로써 바이트를 면도 할 수 있습니다$_=hex"1$_"if!/[^0-9a-f]/i
ardnew

@ardnew Hum, 이제 말했듯이, 삼항은 꽤 끔찍했습니다 ... 어쨌든, 감사합니다!
Dada


3

배치, 33 바이트

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

작동 원리

문자열은 인수로 전달되고 1이 앞에오고 문자열은 내재적으로 10 진수로 변환되어 인쇄됩니다. 문자열이 16 진수로 유효하지 않으면 간단히 표시됩니다.

배치 수학은 부호있는 32 비트 정수를 사용하므로 허용되는 가장 큰 사용자 이름은 FFFFFFF입니다.

cmd /c 다음 명령을 받아서 새 터미널에서 실행 한 다음 종료합니다.

set /a 수학을 수행하고 변수에 저장되지 않은 경우 결과를 10 진수로 암시 적으로 표시합니다.

0x1%1 1을 첫 번째 인수 앞에 추가하도록 설정하고 (모든 배치 변수가 문자열이기 때문에 쉬움) 문자열이 16 진수로 처리되어야 함을 나타냅니다.

2>nul 유효하지 않은 16 진수로 인해 발생하는 모든 오류를 제거합니다.

||는 논리 OR이며 왼쪽의 명령이 실패하면 오른쪽의 명령을 수행합니다. 괄호는이 지점까지 모든 것을 하나의 명령으로 만듭니다.

echo %1 단순히 첫 번째 인수를 표시합니다.


3

커먼 리스프, 71

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

테스트

기능 정의

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

질문으로 주어진 예상 입력 목록을 인용하십시오.

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

그것을 분석하고 결과를 수집하십시오

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

예상되는 출력이 실제 출력과 일치하는지 확인하십시오.

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

2

C, 108 바이트

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

문자열을 인수로 사용하여 결과를 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

암시 적 사용 int:)
FlipTack

2

자바 스크립트 : 46 41 바이트

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

정규식은 2 바이트 더 짧을 수 있습니다./[^0-9a-f]/i
GilZ

필자 는 대소 문자를 구분하지 않는 플래그 (@GilZ 덕분에)를 추가하여, 3 바이트로 대체 0-9하여 1 바이트를 절약 \d하고 F=필요하지 않은 을 제거하여 2 바이트를 절약 했습니다. 제안 해 주셔서 감사합니다.
Luke

2

PHP, 42 바이트

입력이 유효한 16 진 문자열이 아닌 경우 hex2bin ()은 false를 리턴합니다. 이것은 16 진수가 아닌 숫자를 찾기 위해 정규식을 사용하는 것보다 짧지 만 실패 할 때 침묵하지 않기 때문에 @ 연산자가 필요합니다.

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

hex2bin길이가 고르지 않은 문자열에는 실패합니다. 그럼에도 불구하고 여전히 2 바이트 더 짧습니다 preg_match: <?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;57 바이트.
Titus

2

bash, 46 35 31 바이트

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

스크립트로 저장하고 사용자 이름을 인수로 전달하십시오.


1

파이썬 2- 63, 52, 50, 46 바이트

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

이것은 int()적절한 밑이있는 문자열을 밑이 10으로 변환하는 Python을 사용 합니다.이 경우 문자열은 입력에 첨부 된 숫자 1입니다. 입력이 유효하지 않은 0123456789ABCDEF경우 (대소 문자 구분) 이외의 문자가 있으면 다음 을 리턴합니다 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

여기 사용해보십시오!

15 바이트를 절약 한 @FlipTack에 감사합니다!


문자열이 0으로 시작하지 않으면 어떻게됩니까? 문자열이 0으로 시작하면 문자열 왼쪽에 하나만 추가해야합니다.
0WJYxW9FMN

@FlipTack 으악, 바보.
0WJYxW9FMN

1

루비, 47 44 바이트

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

에 대해 변경 하여 3 바이트를 제거 할 수는 있지만 끝에 줄 바꿈이 있기 때문에 출력이 잘못 된 것 같습니다.putsp

편집 : @Mego 덕분에 후행 줄 바꿈이 일반적으로 허용되므로 변경 puts되었습니다 p.


STDOUT의 후행 줄 바꿈은 일반적으로 허용 가능한 것으로 간주됩니다.
Mego


1

Dyalog APL , 37 바이트

기본 제공 유효성 검사 또는 16 진법 변환을 사용하지 않습니다. ⎕IO←0많은 시스템에서 기본값이 필요합니다 .

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

언 골프 드 :

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

d ← ⎕D , 6 ↑ ⎕AdD igits와 A lphabet 의 처음 6 개 요소를 차례로 얻습니다.

u ← 1 (819⌶) ⍵당신 은 대문자 (819 ≈ "큰") 인수를 얻는다

∧/ u ∊ d: 모든 요소 경우 U가 구성원 인 D는 다음 :
16 ⊥ 1 , d ⍳ u 의 인덱스 찾기 U 에서 D , 앞에 추가 1, 그리고베이스 (16)로 평가

else : (수정되지 않은) 인수를 반환

TryAPL 온라인 :

  1. ⎕IO0으로 설정 하고 (보안상의 이유로 TryAPL에서 금지됨) 대체를 정의 하고 큰 결과의 경우 ⎕PP( P rint P recision)을 10으로 설정하십시오.

  2. 모든 테스트 사례를 시도하십시오


1

REXX, 49 48 바이트

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

signal on syntax라벨로 이동 인터프리터를 알려줍니다 syntax구문 오류가 발생할 때마다. 이 프로그램 a은 1을 16 진수로 변환 한 16 진수 버전 으로 다시 할당하려고 시도 하지만 syntax실패하면 레이블로 이동 합니다. 변환이 통과하면 레이블을 무시하고 재 할당 된 변수를 출력합니다.


2
코드를 설명해 주시겠습니까?
Anthony Pham

0

PowerShell , 35 바이트

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

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 실행하십시오!

설명

  1. 매개 변수 사용 ( $v)
  2. 첫 번째 요소는 (두 소자 어레이 생성 0)이 포함 된 문자열의 결과 0x1$v로 파이프를 Invoke-Expression( iex동시에,이 값을 할당하면서) $h. 변환이 실패 $h하면 남아 있습니다 $null.
  3. 배열의 두 번째 요소는 원래 매개 변수입니다.
  4. 부울 -not값이 인 배열로 인덱스합니다 $h. 무엇이든 $h암시 적으로 변환됩니다있다 [bool]( $null잘못된 변환의 경우가 될 것이다에서 $false, 성공적인 전환의 경우에는 양의 정수가 될 것입니다 $true암시 적으로 변환되는, 부정되기 전에) [int]배열 인덱서하는 []( $true할 것이다 1, $false될 것입니다 0), 따라서 변환에 성공하면 선택된 배열의 첫 번째 요소 (변환 결과)와 변환에 실패하면 두 번째 요소가 선택됩니다.

0

스칼라, 40 바이트

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

용법:

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

설명:

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 바이트

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

테스트 케이스를 사용하지 않은 경우 :

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

온라인으로 시도


0

다트, 51 바이트

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

여기 사용해보십시오

오버 헤드의 대부분은 명명 된 매개 변수에서 비롯됩니다 ... 오 잘!

최소한 Dart를 사용하면 원하는 경우 동적으로 입력 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.