“0xUsernames” Dönüştürme


25

0xUsernames

Mesajlaşma servisini kullanan o kadar çok insan var ki, tüm kullanıcı adlarını saklamak için yer doluyor! Bunu düzeltmek için, mümkünse kullanıcı adlarını onaltılık olarak depolamaya başlayacaklar.

Bir kullanıcı adı sadece karakterlerden oluşuyorsa 0123456789ABCDEF(büyük / küçük harfe duyarlı), onaltılık bir sayıya dönüştürülebilir ve bir tamsayı olarak saklanabilir. Örneğin, kullanıcı adı onaltılık bir tamsayı ba5eba11olarak yorumlanabilir 0xBA5EBA11.

Peki ya 05AB1E? Bu, kaybedilecek olan önde gelen bir sıfıra sahip. Dolayısıyla, bir kullanıcı adını ne zaman değiştirirsek 1, bir tamsayı olarak okumadan önce bir tane hazırladığınızdan emin oluruz .


Meydan okuma

Göreviniz, boş olmayan bir kullanıcı adı bir dize olarak verilen, kullanıcı adını 'hexa-sıkıştırma' yapan bir program veya işlev yazmaktır:

  • Onaltılık bir tam sayı olarak yorumlanabilirse, bir 1 hazırlayın, onaltılık olarak yorumlayın ve sonucu taban 10 olarak yazdırın .
  • Aksi takdirde, sadece değiştirilmemiş dizgeyi döndürün.

Bu , yani en kısa çözüm (bayt cinsinden) kazanır! Yerleşik taban dönüştürme işlevlerine izin verilir.


Test Kılıfları

Ortaya çıkan herhangi bir tamsayının, dilinizin standart tamsayı aralığında olduğunu varsayabilirsiniz.

Çoğu mesajlaşma sistemindeki kullanıcı adlarında olduğu gibi, giriş dizeleri yalnızca alfanümerik ve alt çizgi içerecektir.

Unutmayın, 1dönüşümden önce daima bir öncü eklemelisiniz !

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

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

Başvuru için, burada test durumlarda (ungolfed) kullandığım bir Python 3 uygulaması:

import re

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

Ah, bunu görmedim. Ayrıca, daha büyük sınavlardan bazıları, dilimizin en büyük tamsayı tipinin sınırları dışında sayılarla sonuçlanırsa ne olur?
Doorknob

2
@Doorknob iyi yakalamak. Ortaya çıkan bir tamsayı asla dilinizin standart tamsayı türünden daha fazla olmayacağını söyleyeceğim. (lütfen bunu kötüye kullanmayın ve 1 bitlik tamsayılarla bir dil kullanın)
FlipTack

Girişin yalnızca büyük harf olduğunu varsaymak uygun mudur?
Adám

@ Üzgünüm ama programınız büyük / küçük harfe duyarlı olmamalı (bkz. Test durumları)
FlipTack

Unary gibi BF yerine kullanıcı adlarını kodlaması dışında
MilkyWay90

Yanıtlar:


27

05AB1E , 4 bayt

D1ìH

açıklama

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

Girdide geçersiz altıgen karakterler varsa, Hhiçbir şey itmez, bu nedenle yığındaki son değer çoğaltılmış girdi olur, bu nedenle program geçersiz girdi durumunda girdi yazdırır.

Çevrimiçi deneyin!


9
İroni burada oldukça güçlü. 05AB1Egeçerli bir kullanıcı adı.
devRicher

1
Bu doğru, ancak ad onaltılık bir sayı olarak seçildi . Bu yüzden geçerli :)
Osable

Neden kandırdığını merak ettim. Ancak $ kullanmak için bir yol düşünmeye çalışıyorum ....
Magic Octopus Urn

16

JavaScript (ES6), 15 bayt

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

Nasıl çalışır

'0x1'+sgirdiyi hazırlanmış bir onaltılık dizgiye dönüştürür 1, örneğin 0x105ab1e. Sonra -0sonucu sayıya çevirir. JavaScript 0xbaşlangıçta görür ve örtülü olarak onaltılıktan dönüştürmeye çalışır; eğer solmayan herhangi onaltılık karakter, bu döner içerir NaN. Bu yanlış olduğu için (ve önceden planlanandan 0dolayı çıktı asla verilemez 1), onaltılık dönüştürme başarısız olursa ||sgeri dönmek için kullanabiliriz s.

Test snippet'i

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
Çok güzel bir çözüm!
Grax32

Örtük döküm gerçekten güzel ...: ')
Downgoat

10

Python 2,44 bayt

Girdiyi bir alıntı dizesi olarak alır. Rod sayesinde -2 bayt!

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

Girişin yalnızca alfanümerikler ve alt çizgiler içereceğini garanti ettiğimiz için, 0x1altıgen bir dizgiden başka bir ardında geçerli Python oluşturmanın yolu yoktur . Girdi başka bir şeyse, hata yoksayılır ve orijinal haliyle yazdırılır.

Regex maç yapmaktan daha kısa bir sonuç veremedim try/except. Aslında, regex korkunç derecede ayrıntılı olduğu ortaya çıktı:

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

Ayrıca yerini alabilir a=int('1'+a,16)ile exec'a=0x1'+a(test etmek için muhtemelen ihtiyacı)
Rod

Golfe devam edersem tam olarak aynı cevaba sahip olacağız.
Anthony Pham

Bu bağlamda geçerli Python olacak olan kullanıcı adları için çalışmaz, örn "+input()".
heinrich5991

"abc" için başarısız olur (sonundaki boşlukları fark eder) (int, boşlukların başındaki ve sonlarındaki boşluklara izin verir)
Siphor

Ben Python 2 için tam olarak bilmiyorum, ama parantez kaldırabilirsiniz düşünmek ()deinput()
RudolfJelin


7

Perl, 27 bayt

-1 bayt sayesinde @ Baynew .

26 bayt kodu + -pbayrak.

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

Son hat olmadan giriş sağlayın. İle echo -nörneğin:

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

Açıklama
Bu oldukça yalındır: /[^0-9a-f]/igiriş, onaltılık sayılar içinde izin verilenden başka bir karakter içeriyorsa geçerlidir. False ise $_(girişi içeren) dönüştürülen değere ayarlanır (dönüşüm yerleşik tarafından yapılır hex).
Ve $_örtülü sayesinde yazdırılır -pbayrağı.


üçlü operasyondan kaçınarak bir baytı tıraş edebilirsiniz$_=hex"1$_"if!/[^0-9a-f]/i
saat

@ardnew Hum, şimdi söylüyorsunuz ki, bu üçlü oldukça berbattı ... Her neyse, teşekkürler!
Dada


3

Toplu iş, 33 bayt

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

Nasıl çalışır

Bir dize, argüman olarak iletilir, ona 1 eklenir ve dize örtülü olarak ondalık basamağa dönüştürülür ve yazdırılır. Dize geçerli onaltılı değilse, basitçe görüntülenir.

Toplu matematik imzalı 32 bit tam sayıları kullandığından, izin verilen en büyük kullanıcı adının belirtilmesi gerekir FFFFFFF.

cmd /c bir sonraki komutu alır, yeni bir terminalde çalıştırır ve çıkar.

set /a matematik gerçekleştirir ve bir değişkende saklanmadığında sonucu kesin olarak ondalık olarak görüntüler.

0x1%1 1'e ilk argümana hazırlanmasını söyler (bu, tüm toplu değişkenler dizge olduğu için kolaydır) ve dizenin onaltılık olarak ele alınması gerektiğini belirtir.

2>nul geçersiz onaltılık bir sayıdan kaynaklanan hataları susturur

||mantıksal bir OR'dir ve soldaki komut başarılı olmazsa sağdaki komutu yerine getirir. Parantezler bu noktaya kadar olan her şeyi bir komut haline getirir.

echo %1 sadece ilk argümanı gösterir.


3

Ortak Lisp, 71

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

Testler

Fonksiyonu tanımla

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

Soru tarafından verilen, beklenen girdilerin bir listesini alıntılayın:

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

Ayrıştır ve sonuçları topla

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

Beklenen çıktıların gerçekler ile eşleştiğini kontrol edin:

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

2

C, 108 bayt

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

Bu, dizeyi bir argüman olarak alan ve sonucu STDOUT'a basan bir fonksiyondur.

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

Örtük güzel kullanımı int:)
FlipTack

2

JavaScript: 46 41 bayt

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

Regex 2 bayt daha kısa olabilir:/[^0-9a-f]/i
GilZ

I değiştirilmesi ile 1 bayt kaydedilen 0-9tarafından \dçıkarılması ile harf duyarlı bayrağı (sayesinde @GilZ) ve 2 daha bayt eklenerek 3 bayt F=gerekli değildir ki. Önerin için teşekkürler.
Luke

2

PHP, 42 bayt

Giriş geçerli bir hex string değilse hex2bin (), false değerini döndürür. Bu, altıgen olmayan rakamları aramak için regex kullanmaktan daha kısadır, ancak @ operatörüne ihtiyacımız vardır, çünkü başarısız olduğunda sessiz değildir.

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

hex2bindüzensiz uzunlukta dizeleri için başarısız. Hala iki bayt preg_matcholsa da daha kısa : <?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;57 bayt için.
Titus,

2

bash, 46 35 31 bayt

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

Bir komut dosyası olarak kaydedin ve kullanıcı adını bir argüman olarak iletin.


1

Python 2 - 63, 52, 50, 46 Bayt

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

Bu int(), uygun tabanı olan herhangi bir dizeyi taban 10'a dönüştüren Python'ları kullanır . Bu durumda, dize girişe eklenen 1 sayısıdır. Girdi geçersizse ( 0123456789ABCDEFharf büyüklüğüne duyarsız) dışında karakter içeriyorsa, döndürür 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

Burada dene!

15 byte tasarruf için @FlipTack teşekkürler!


Peki ya dize sıfır ile başlamazsa? Sıfırla başlıyorsa yalnızca dizenin soluna bir tane eklemelisiniz.
0WJYxW9FMN

@ FlipTack Whoops, beni aptal.
0WJYxW9FMN

1

Yakut, 47 44 bayt

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

ben olabilir değiştirerek 3 bayt kaldırmak putsiçin p, ama sonunda bir yeni satır sahip olduğundan çıkış yanlış olarak düşünülebilir gibi hissediyorum.

Düzenleme: Değiştirildi putsiçinp sondaki yeni satırlar tipik kabul edilir olarak, teşekkürler @Mego.


STDOUT'daki takip eden yeni satırlar genellikle kabul edilebilir olarak kabul edilir.
Mego


1

Dyalog APL , 37 bayt

Dahili doğrulama veya hex-dec dönüştürme kullanmaz. ⎕IO←0Birçok sistemde varsayılan olanı gerektirir .

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

Ungolfed:

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

d ← ⎕D , 6 ↑ ⎕Ad , A lphabet'in ilk 6 elementini izleyen D igits alır

u ← 1 (819⌶) ⍵u büyük harf alıyor (819 ≈ "Büyük") argümanı

∧/ u ∊ d: tüm elemanları ise u üyeleridir d , o zaman:
16 ⊥ 1 , d ⍳ u ve indisler u içinde d , başına bir 1 ve taban 16 olarak değerlendirilmesi

else: (değiştirilmemiş) argümanı döndür

TryAPL çevrimiçi:

  1. Set ⎕IOsıfıra bir için yedek tanımlar (güvenlik nedenleriyle TryAPL yasak) ve bir dizi ⎕PP( P Rint P büyük sonuç için recision) 10

  2. Tüm test durumlarını deneyin


1

REXX, 49 48 bayt

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

signal on syntaxEtikete atlanır tercüman söyler syntaxbir sözdizimi hatası olduğunda. Program, baştaki 1 aile onaltılık bir ondalık dönüştürülmüş sürümle atama yapmaya çalışır , ancak syntaxbaşarısız olursa etikete atlar . Dönüştürme geçerse, yalnızca etiketi yok sayar ve yeniden atanan değişkeni çıkarır.


2
Kodunuzu lütfen açıklayabilir misiniz
Anthony Pham

0

PowerShell , 35 bayt

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

Çevrimiçi deneyin! veya Tüm test durumlarını çalıştır!

açıklama

  1. Parametre al ( $v)
  2. İlk öğenin ( 0), eşzamanlı olarak bu değeri atarken, ( ) 0x1$viçine piped içeren bir dizgenin sonucudur olduğu iki öğeli bir dizi oluşturun . Dönüşüm başarısız olursa, kalır .Invoke-Expressioniex$h$h$null
  3. Dizinin ikinci elemanı orjinal parametredir.
  4. Boole -notdeğeri olan diziye indeksleyin $h. Ne olursa olsun $hörtük dönüştürülecektir edilir [bool]( $nullgeçersiz dönüşüm olgu haline gelecek içinde $false, başarılı bir dönüşüm söz konusu olduğunda pozitif bir tamsayı olur $truesonra örtülü olarak dönüştürülür olan negated önce) [int]dizi dizinleyiciden []( $trueolacak 1, $falseolacak 0bu nedenle, dönüşüm başarılı olmuşsa seçilen dizinin ilk dönüşümüne (dönüşüm sonucu) ve dönüşüm başarısız olursa seçilen ikinci öğeye neden olur.

0

Scala, 40 bayt

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

Kullanımı:

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

Açıklama:

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 bayt

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

Test durumlarıyla affetmemiş:

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

Çevrimiçi deneyin


0

Dart, 51 bayt

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

Burada dene

Genel giderlerin çoğu adlandırılmış parametrelerden geliyor ... Ah, peki!

En azından Dart, isterseniz dinamik olarak yazmanıza izin verir: D

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.