「0xUsernames」の変換


25

0xユーザー名

メッセージングサービスを使用しているユーザーが非常に多いため、すべてのユーザー名を保存するためのスペースが不足しています。これを修正するために、可能であれば16進数としてユーザー名の保存を開始します。

ユーザー名が文字のみで構成されている0123456789ABCDEF場合(大文字と小文字は区別されません)、16進数に変換して整数として保存できます。たとえば、ユーザー名ba5eba110xBA5EBA11、16進整数として解釈できます。

しかし、どう05AB1Eですか?先行ゼロがあり、これは失われます。そのため、ユーザー名を変換するときは常に1、整数として読み取る前に必ずaを追加します。


チャレンジ

あなたの仕事は、空でないユーザー名を文字列として与えられたユーザー名を 'hexa-compresss'するプログラムまたは関数を書くことです:

  • 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

ああ、それを見なかった。また、いくつかの大きなテストケースで、言語の最大整数型の範囲外の数値が発生した場合はどうでしょうか。
ドアノブ

2
@Doorknob良いキャッチ。結果の整数は、あなたの言語の標準の整数型を超えることは決してないと言います。(これを乱用しないで、1ビット整数の言語を使用してください)
-FlipTack

入力が大文字のみであると仮定しても大丈夫ですか?
アダム

@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

あなたがだまされている理由を疑問に思いました。....かかわらず、代わりに$を使用する方法を考えるようにしよう
マジックタコ壺

16

JavaScript(ES6)、15バイト

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

使い方

'0x1'+s先頭に追加して16進数リテラル文字列に入力変換1、例えば0x105ab1e。次に-0、結果を数値にキャストします。JavaScriptは0x最初にを見て、暗黙的に16進数からの変換を試みます。s16進数以外の文字が含まれている場合、これはを返しますNaN。これは偽であるため(prependedのために出力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

Python 2、44バイト

入力を引用符付き文字列として受け取ります。-2バイトのおかげでロッド!

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

入力には英数字とアンダースコアのみが含まれることが保証されているため、有効なPython 0x1を16進文字列以外に作成する方法はありません。入力がそれ以外の場合、エラーは無視され、元の状態で印刷されます。

正規表現の一致をこれより短くすることはできなかったようです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(テストにはおそらく、必要性)
ロッド・

あなたが知っている、私が正しいゴルフを続けるならば、我々は同じ正確な答えをしなければならないだろうか?
アンソニーファム

そのコンテキストで有効なPythonであるユーザー名(たとえば、)では機能しません"+input()"
heinrich5991

「abc」で失敗します(末尾の空白に注意してください)(intは先頭と末尾に空白を許可します)
Siphor

Python 2の正確な方法はわかりませんが、ブラケット()input()
-RudolfJelin


7

Perl、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進数の内部で許可されている文字以外の文字が含まれている場合はtrueです。false $_(入力を含む)の場合、変換された値に設定されます(変換は組み込みによって行われますhex)。
そして、$_暗黙のうちに感謝印刷されて-pフラグを。


三項演算を回避することでバイトを削ることができます$_=hex"1$_"if!/[^0-9a-f]/i
-ardnew

@ardnewハム、あなたがそれを言った今、その三項はかなりひどかった...とにかく、ありがとう!
ダダ


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で、左側のコマンドが成功しなかった場合に右側のコマンドを実行します。括弧は、これまでのすべてを1つのコマンドにします。

echo %1 単に最初の引数を表示します。


3

Common Lisp、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

JavaScript:46 41バイト

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

正規表現は2バイト短くすることができます/[^0-9a-f]/i
。– GilZ

に置き換え0-9て1バイトを保存\dし、大文字と小文字を区別しないフラグを追加して3バイト(@GilZに感謝)F=、を削除してさらに2 バイトを保存しましたが、これは不要です。提案をありがとう。
ルーク

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バイトです。
タイタス


1

Python 2- 635250、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に感謝します!


文字列がゼロで始まらない場合はどうなりますか?ゼロで始まる場合にのみ、文字列の左側に1を追加する必要があります。
0WJYxW9FMN

@FlipTackおっと、愚かな私。
0WJYxW9FMN

1

ルビー、47 44バイト

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

私は可能性が変更することで、3つのバイトを削除するputsためにp、私はそれが最後に改行を持っているため、出力が間違っていると考えられるような気がします。

編集:変更putsのためのp末尾の改行が一般的に受け入れられているように、感謝@Mego。


通常、STDOUTの末尾の改行は受け入れ可能と見なされます。
メゴ


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 ↑ ⎕Adは、D igitsに続いてA lphabetの最初の6要素を取得します

u ← 1 (819⌶) ⍵uは大文字(819≈ "Big")引数を取得します

∧/ u ∊ d: すべての要素場合uはのメンバーであるdは、次に:
16 ⊥ 1 , d ⍳ u のインデックス検索UD、プリペンド1は、ベース16として評価

その他:(変更されていない)引数を返します

TryAPLオンライン:

  1. セット⎕IOゼロへ、の代替定義(セキュリティ上の理由TryAPL上禁止)を、セット⎕PPP RINT P大きい結果を得るために10 recision)

  2. すべてのテストケースを試す


1

REXX、 49 48バイト

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

signal on syntaxラベルにジャンプするインタプリタを指示するsyntax構文エラーが発生するたびに。プログラムはa、先頭に1を付けた16進数から10進数への変換バージョンで再割り当てを試みsyntaxますが、失敗するとラベルにジャンプします。変換が成功した場合、ラベルを単に無視し、再割り当てされた変数を出力します。


2
コードを教えてください
アンソニーファム

0

PowerShell、35バイト

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

オンラインでお試しください!またはすべてのテストケースを実行します!

説明

  1. パラメータを取る($v
  2. 最初の要素(0)が()に0x1$vパイプされた文字列の結果である2要素配列を作成し、同時にこの値をに割り当てます。変換が失敗した場合、が残ります。Invoke-Expressioniex$h$h$null
  3. 配列の2番目の要素は、元のパラメーターです。
  4. ブール-not値の配列にインデックスを付けます$h。どのような$h暗黙的に変換されている[bool]$null無効な変換の場合になるであろう$false成功した変換の場合には正の整数となり、$trueその後、暗黙的に変換され、ネゲートされる前に)[int]アレイインデクサによって[]$trueなり1$falseあろう0)、したがって、変換が成功した場合は配列の最初の要素(変換結果)が選択され、変換が失敗した場合は2番目の要素が選択されます。

0

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

オンラインで試す


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.