Alfabet na numer i Liczba na alfabet

26

Wyzwanie

W tym wyzwaniu musisz wziąć liczbę jako dane wejściowe i wyjściowe odpowiedniej litery alfabetu i odwrotnie. (1 <=> A, 2 <=> B) itp.

1 -> A
2 -> B
...
26 -> Z

A -> 1
B -> 2
...
Z -> 26

Zasady

  • To jest , więc wygrywa najkrótszy kod w bajtach.
  • Dane wejściowe będą się składać wyłącznie z dużej litery od Ado Zlub liczby całkowitej od 1do 26włącznie.
  • Końcowe białe znaki (spacja i nowa linia) są dozwolone.
Czad
źródło
1
Po co duplikować? Oo To nie jest równe.
Czad
3
Witamy w Programowaniu zagadek i Code Golf! To wyzwanie może wymagać nieco wyjaśnienia. Na przykład możesz określić, jakie dane wejściowe musielibyśmy obsłużyć, ponieważ są nieprawidłowe dane wejściowe. Polecam publikowanie przyszłych wyzwań w piaskownicy, gdzie mogą uzyskać znaczącą informację zwrotną przed opublikowaniem na głównej stronie.
Leaky Nun
1
Czy otrzymamy 26jako liczbę całkowitą lub "26"jako ciąg, czy oba są dozwolone?
Leaky Nun
2
Czy musi to być duża litera, czy zamiast tego dopuszczalne są małe litery?
Mego
1
Poważnie, kolejne wyzwanie alfabetyczne? (͡ ° ͜ʖ ͡ °)
shooqie

Odpowiedzi:

6

Właściwie 7 bajtów

ú' +ûEí

Wypróbuj online!

Wyjaśnienie:

ú' +ûEí
ú' +     lowercase English alphabet, prepend space
    û    uppercase
     E   element (pushes the nth letter if input is an integer, leaves stack alone otherwise)
      í  index (pushes index of input if input is a string, leaves stack alone otherwise)

Jeśli dopuszczalne są małe litery, jest to 6 bajtów:

ú' +Eí

Wypróbuj online!

Mego
źródło
1
W tej chwili wygrywasz, myślę, że nikt nie mógłby zrobić programu z mniejszą liczbą 7 bajtów.
Czad
1
Przyłączyłem się, żeby o to zapytać. @Mego, co to za język?
FoldedChromatin
2
@FoldedChromatin wygląda jak github.com/Mego/Seriously
Alfred Bez
1
@FoldedChromatin Właściwie to jest Actually. Stąd Actually, 7 bytes. : P
Dan
2
Chwile takie jak te sprawiają, że cieszę się z nazwisk, które wybrałem dla moich języków :)
Mego
12

Pure Bash, 51

Większość pozostałych odpowiedzi używa pewnego rodzaju warunkowych. Ten całkowicie rezygnuje z warunkowych i zamiast tego traktuje dane wejściowe jako liczbę podstawową 36, która indeksuje w odpowiednio skonstruowaną tablicę rozszerzeń bash-nawias klamrowy:

a=(_ {A..I} {1..26} {J..Z} {A..Z})
echo ${a[36#$1]}

Ideone.

Cyfrowa trauma
źródło
9

Erlang, 26 bajtów

f([X])->X-64;f(X)->[X+64].

Jeden z niewielu przypadków, w których zachowanie łańcucha Erlanga jest przydatne.

spaghetto
źródło
7

Python 2, 38 bajtów

lambda x:x>''and 64^ord(x)or chr(64^x)

Przetestuj na Ideone .

Dennis
źródło
7

Python 3, 43 bajty

lambda x:x!=str(x)and chr(64|x)or ord(x)^64

Ciekawą rzeczą w tym rozwiązaniu jest to, że zawiera wszystkie zmysły OR, bitowe OR |, logiczne OR or, bitowe XOR ^i logiczne XOR !=...

cdlane
źródło
6

2sable , 9 8 bajtów

Kod:

.bAu¹kr,

Wyjaśnienie:

.b        # Convert 1 -> A, 2 -> B, etc.
  A       # Push the alphabet.
   u      # Convert it to uppercase.
    ¹k    # Find the index of the letter in the alphabet.
      r   # Reverse the stack.
       ,  # Pop and print with a newline.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
1
Nie możesz usunąć? Których bajtów nie ma? Nie musisz drukować nowej linii.
Czad
@Chad Nie, to nie zadziała dla danych numerycznych :(
Adnan
6

Rubinowy, 47 39 + nflaga = 40 bajtów 33 34 31 bajtów

Funkcja anonimowa. Wykorzystuje sztuczkę związaną z obsługą wyjątków, jak w rozwiązaniu Python @ KarlNapf .

-3 bajty z @manatwork

Wypróbuj online

->i{(64+i).chr rescue i.ord-64}

Oryginalna pełna wersja programu z nflagą na 40 bajtów i odczytywana ze STDIN:

puts$_!~/\d/?$_.ord-64:(64+$_.to_i).chr
Wartość tuszu
źródło
Podczas próby uruchomienia ideonu pojawia się błąd składniowy. Czy możesz powiedzieć, jak testować?
Leibrug
@Leibrug oops! Jest już naprawiony
Value Ink
Można je zmniejszyć bardziej bezwstydnie stosowania przez Karla Napf „s sztuczki z jego roztworu Python : ->i{(64+i).chr rescue i.ord-64}.
manatwork
5

Cheddar, 34 32 bajty

Zaoszczędź 2 bajty dzięki @LeakyNun

n->"%s"%n==n?n.ord()-64:@"(n+64)

Chciałbym, aby istniał krótszy sposób sprawdzenia, czy łańcuch lub liczba.

Wypróbuj online! lub pakiet testowy

Wyjaśnienie

n ->                // func with arg `n`
    "%s"%n==n ?     // if n is string... (see below)
       n.ord() - 64  // return code point - 64
    :               // else...
    @"(n+64)         // chr(n+64)

"%s"%n==nw prosty sposób sprawdza, czy jest to ciąg znaków. "%s"jest formatem ciągu, który mogę sformatować %np. "a %s c" % "b"jest równy "a b c". %sokreśla, że ​​jest to ciąg znaków, jeśli cyfra zostanie przekazana, pozostanie jako %s.

Downgoat
źródło
"%s"%n==noszczędza 2 bajty
Leaky Nun
@LeakyNun oh to mądre! Próbowałem robić, "%d"%n==nale to nie działało: /
Downgoat
5

Mathematica 54 41 bajtów

Z absolutnie sprytną sugestią LegionMammal978, która oszczędza 13 bajtów.

If[#>0,FromLetterNumber,,LetterNumber]@#&

If[#>0,FromLetterNumber,,LetterNumber]służy wyłącznie do podjęcia decyzji, czy zastosować, FromLetterNumberczy LetterNumberdo wkładu.

#>0będzie spełniony, jeśli wejście,, #jest liczbą, w którym to przypadku FromLetterNumberzostanie wybrany.

Jednak #>0nie będzie ani prawdą, ani fałszem, jeśli #jest literą i LetterNumberzostanie wybrana zamiast tego.


If[#>0,FromLetterNumber,,LetterNumber]@#&["d"]

4


If[#>0,FromLetterNumber,,LetterNumber]@#&[4]

re


W Mathematica, FromLetterNumbera LetterNumbertakże będzie działać z innymi alfabetami. Wymaga to tylko kilku dodatkowych bajtów.

If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Greek"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Russian"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[4, "Romanian"]

δ
г
b

If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[δ, "Greek"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[г, "Russian"]
If[# > 0, FromLetterNumber, , LetterNumber][#, #2] &[b, "Romanian"]

4
4
4

DavidC
źródło
1
Trochę gry w golfa, przynosząc do 41 bajtów:If[#>0,FromLetterNumber,,LetterNumber]@#&
LegionMammal978
Interpretować swoje sugestie jak: If[#>0,FromLetterNumber[#],LetterNumber@#]‌&. Chociaż If[#>0,FromLetterNumber[#],LetterNumber@#]‌&[4]działa, If[#>0,FromLetterNumber[#],LetterNumber@#]‌&["c"]nie działa. Najwyraźniej nie może rozwiązać "c">0. Czy źle zrozumiałem?
DavidC
Podwójne ,,jest zamierzone, podobnie jak zewnętrzne @#; ocenia as If[# > 0, FromLetterNumber, Null, LetterNumber][#]&, który używa 4-argumentowej formy If(wyszukaj).
LegionMammal978
Zadziwiające, jak działa 4-argumentowa forma If.
DavidC,
4

Haskell, 54 bajty

f s|s<"A"=[['@'..]!!read s]|1<2=show$fromEnum(s!!0)-64

Przykład użycia: map f ["1","26","A","Z"]-> ["A","Z","1","26"].

System ścisłego pisania Haskella jest tutaj prawdziwym bólem. Dodatkowo wszystkie krótkie char <-> int działają jak chri ordwymagają importu, więc muszę to zrobić ręcznie. W przypadku litery -> int, na przykład muszę przekonwertować String-> Char(przez !!0) -> Integer(przez fromEnum) -> String(przez show).

nimi
źródło
4

C, 55 bajtów

i;f(char*s){i=atol(s);printf(i?"%c":"%d",64^(i?i:*s));}
orlp
źródło
4

Perl 6 , 25 bajtów

{+$_??chr $_+64!!.ord-64}

Wyjaśnienie:

# bare block lambda with implicit parameter of 「$_」
{
    +$_         # is the input numeric
  ??
    chr $_ + 64 # if it is add 64 and get the character
  !!
    $_.ord - 64 # otherwise get the ordinal and subtract 64
}

Przykład:

say ('A'..'Z').map: {+$_??chr $_+64!!.ord-64}
# (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26)

say (1..26).map: {+$_??chr $_+64!!.ord-64}
# (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
Brad Gilbert b2gills
źródło
2
Mimo, że składnia jest tak różny, że sam mechanizm jest taka sama liczba bajtów w Perlu 5: perl -pe '$_=/\d/?chr$_+64:-64+ord'!
Dom Hastings
3

C #, 32 bajty

n=>(n^=64)>26?(object)(char)n:n;

Przesyłanie do Func<int, object>.

Dane wejściowe: chardomyślnie konwertuje na, intwięc można je wywołać za pomocą int(1-26) lub char(„A'-Z”).

Wyjście: albo a charalbo int.

mleko
źródło
3

PHP, 49 41 40 bajtów

<?=+($i=$argv[1])?chr($i+64):ord($i)-64;

Nie sądzę, że istnieje dobra alternatywa dla is_numericdobra?

Jest to wykonywane z wiersza poleceń ( $argv[1]jest to pierwsza podana zmienna)

Dzięki:

@insertusernamehere: Golfed 8 bajtów. Zastąpienie is_numeric($i=$argv[1])przez 0<($i=$argv[1]).To działa, ponieważ (int)"randomLetter" == 0.

@manatwork: Zmniejszony o 1 bajt. Wymień 0<się +. W tym przypadku dzieje się tak, że sygnał + wyrzuci „Z” (lub dowolną literę) na zero. Spowoduje to fałsz. Dlatego każda litera jest zawsze fałszywa, a liczba jest zawsze prawdziwa.

Jeroen
źródło
2
Używanie 0<($i=$argv[1])zamiast is_numeric($i=$argv[1])oszczędza 8 bajtów .
inserttusernamehere
1
Kontynuując ten pomysł: 0<+.
manatwork
2

Python 2, 61 bajtów

i=raw_input()
try:o=chr(int(i)+64)
except:o=ord(i)-64
print o

Tak, mógłbym przejść na Python 3 dla input

Karl Napf
źródło
Użyj input()jednak i zmień int(i)na i.
Leaky Nun
Wówczas znaki wejściowe nie działają.
Karl Napf,
2
Weź dane jako"A"
Leaky Nun
3
To kiepskie. Alub nic.
Karl Napf
Możesz zrzucić kilka bajtów, przeformułowując go jako funkcję: linia 1:, def f(i):linia 2: <spacja> try:o=chr(i+64), linia 3 <spacja> w przeciwnym razie niezmieniona, linia 4: <spacja> return o W tej formie działałoby to w Pythonie 2 lub Python 3
cdlane
2

PowerShell v2 +, 42 bajty

param($n)([char](64+$n),(+$n-64))[$n-ge65]

Pobiera dane wejściowe $n(jako liczbę całkowitą lub jawny znak) i używa pseudo-trójki do wyboru między dwoma elementami tablicy. Warunkiem jest $n-ge65(tzn. Wejściowy ASCII Alub wyższy). Jeśli tak, po prostu rzutujemy dane wejściowe jako int i odejmujemy 64. W przeciwnym razie dodajemy 64do wejściowej liczby całkowitej i rzucamy ją jako [char]. W obu przypadkach wynik pozostaje w potoku, a drukowanie jest niejawne.

Przykłady

PS C:\Tools\Scripts\golfing> ([char[]](65..90)|%{.\alphabet-to-number.ps1 $_})-join','
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26

PS C:\Tools\Scripts\golfing> (1..26|%{.\alphabet-to-number.ps1 $_})-join','
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
AdmBorkBork
źródło
2

Befunge-98 *, 19 bajtów

&:39*\`'@\j;+,@;-.@

Ponieważ pytanie brzmiało, że dostaniesz a 1-26lub an A-Z, założyłem, że oznaczało to liczbę 26 lub znak AZ. Większość interpretuje problemy z wprowadzaniem kodów alt, więc łatwiej jest używać &i wprowadzać wartości takie jak 26 dla 26 lub 90 dla „Z”, w przeciwieństwie do ~.

Pseudo kod

int c = get stdin
push the value of 27
bool is_number =  27 > c
push the value of `@` (64)
if is_number == 1
   jump to adding 64 to c //putting it the ASCII range
   print as ASCII
   end
else
   jump to subtracting 64 from c //putting it in the numerical range
   print as number
   end

Przetestuj to (w systemie Windows) tutaj!

* Technicznie jest to Unefunge-98, ponieważ używa tylko 1 wymiaru, ale ta nazwa może być nieznana.

tngreene
źródło
2

Befunge 93 , 144 90 66 54 36 19 bajtów

Nie jestem w 100% pewien, czy jest to dozwolone, ale jeśli możesz wpisać A jako 65, B jako 66 itd., To (dla mojej [wygody]):

&:"@"`"@"\#. #-_+,@

W przeciwnym razie przy 36 bajtach:

~:0\"A"-`#v_88*-.@
**~28*++,@>68*-52

(Dzięki tngreene za sugestie!)

~:0\567+*-`#v_88*-.>$28*+,@
52**\28*++,@>~:0`!#^_\68*-

(Dzięki Sp3000 za zaoszczędzenie 12 bajtów przez przestawienie!)

~:0\567+*-`#v_88*-.>$82*+,@
            >~:0`!#^_\68*-52**\28*++,@


v                   >$28*+,@
             >~:0`!#^_\68*-52**\28*++,@
>~:0\567+*-`#^_88*-.@


v                    >$28*+,@
~           >11g~:0`!|
1                    >\68*-52**\28*++,@
1
p           
>011g567+*-`|
            >11g88*-.@

Nie golfowany:

v                       >$ 28* + , @
                 >~:0 `!|
                        >\ 68* - 52* * \ 28* + + , @
>~:0\ 5 67+ * - `|
                 >88* - . @

To mój pierwszy działający program Befunge w historii i czuję potrzebę dalszej gry w golfa. Każda pomoc byłaby bardzo mile widziana.

Można przetestować kod befunge tutaj .

Daniel
źródło
1
Komentarz do szybkiego spojrzenia: Befunge owija się wokół, dzięki czemu możesz przesunąć ostatnie 12 znaków drugiej linii na przód i uzyskać52**\28*++,@>~:0`!#^_\68*-
Sp3000,
@ Sp3000, och, nie zauważyłem tego. Dzięki!
Daniel
Gratulujemy pierwszego programu! Jedną rzeczą do rozważenia byłoby wygenerowanie dużych liczb poprzez wypychanie wartości ASCII w ciągu. Porównaj 567+*z "A". Nie należy również zapominać o gi pinstrukcje ponowne wartość zamiast budować go wielokrotnie. Ponadto nie mogłem znaleźć żadnych danych wejściowych, które doprowadziłyby adres IP do oddziału >$ 28* + , @. Po co to? Czy na pewno jest to potrzebne?
tngreene,
Wreszcie podziwiam twoje poświęcenie dla parsowania „26” lub „08”. Twoja metoda, jak czytam, obejmuje wiele matematyki konwersji liczb <->, jak w ('2' do 2 z powrotem do '2'). Pierwsze i drugie wejście jako liczby przed ich porównaniem może zmniejszyć ilość arytmetyki ASCII. Alternatywnie, być może istnieje sposób na skuteczne radzenie sobie z wejściami jako symbolami („2” jak w „2”), bez konieczności konwersji na liczby!
tngreene,
@tngreene, Wejścia całkowite <10 przechodzą do gałęzi, $28*+,@a te> = 10 przechodzą do drugiego. Dokonano tego ostatecznie, ponieważ o ile wiem, nie można odczytać danych wejściowych więcej niż raz.
Daniel
2

Brainfuck, 445 znaków

Bardziej dowód koncepcji niż kod do gry w golfa. Wymaga Bez podpisu, bez opakowania Brainfuck.

,[>+>+<<-]>[<+>-]>>++[->++++++<]>[-<<<+++++>>>]<<<<[->-<]>[,<++++[->------------<]++++[->>------------<<][-<<++++++++++>>]>[-<+>]>[-<<++++++++++>>]>++[->++++++<]>+[-<+++++>]<-[-<<<+>>>]<<<.>]>[[-<+<+>>]>++[->++++++<]>+[-<+++++>]<-[-<<->>]<<[->+>+<<]>>>++++++++++<+[>[->+>+<<]>[-<<-[>]>>>[<[-<->]<[>]>>[[-]>>+<]>-<]<<]>>>+<<[-<<+>>]<<<]>>>>>[-<<<<<+>>>>>]<<<<<-[->+>+<<]>[-<++++++++++>]<[-<->]++++[-<++++++++++++>]++++[->>++++++++++++<<]>>.<<<.>]

Z komentarzami

,[>+>+<<-] Firstly Duplicate it across two buffers
>[<+>-] Move the second buffer back to the first buffer
>>++[->++++++<]>[-<<<+++++>>>] Establish 60 in the second buffer
<<<<
Compare Buffers 1 and 2
[->-<]
>
[ If there's still data in buffer 2
, Write the value in the units column to buffer two
<
++++
[->------------<] Subtract 12 from the units buffer
++++
[->>------------<<] Subtract 12 from the tens buffer
[-<<++++++++++>>] Multiply buffer three by ten into buffer 1
>
[-<+>] Add the units
>
[-<<++++++++++>>] Add the tens
>++ Add 65 to the buffer
[->++++++<]>+
[-<+++++>]
<- Actually we need 64 because A is 1
[-<<<+>>>] Add 64 to the first buffer
<<<
. Print the new letter
> Move to blank buffer
]
>
[ Otherwise we're a letter
[-<+<+>>] Copy it back over the first two buffers
>++ Write 64 to the buffer
[->++++++<]>+
[-<+++++>]
<-
[-<<->>] Subtract 64 from the letter
<<[->+>+<<]
>>>++++++++++< Copy pasted Division step x = current buffer y = 10 rest of the buffers are conveniently blank

+
[>[->+>+<<]>[-<<-[>]>>>[<[-<->]<[>]>>[[-]>>+<]>-<]<<]>>>+<<[-<<+>>]<<<]>>>>>[-<<<<<+>>>>>]<<<<<
-
[->+>+<<]
>[-<++++++++++>]
<[-<->]
++++
[-<++++++++++++>]
++++
[->>++++++++++++<<]
>>.<<<.>
] 
ATaco
źródło
2

Java, 104 98 97 83 54 53 51 50 30 bajtów

x->(x^=64)>64?(char)x+"":x+"";

Program testowy :

IntFunction<String> f = x -> (x ^= 64) > 64 ? (char) x + "" : x + "";
out.println(f.apply('A')); // 1
out.println(f.apply('Z')); // 26
out.println((f.apply(1))); // A
out.println((f.apply(26))); //Z
Shaun Wild
źródło
1
Możesz upuścić około 20 bajtów za pomocą trójskładnikowego operatora w następujący sposób:return(s.matches("\\d+")?(char)(Integer.parseInt(s)+64)+"":(s.charAt(0)-64)+"");
yitzih
możesz również usunąć rzutowanie do int, co pozwala zmniejszyć o 7 bajtów.
user902383,
Program nie pobiera żadnych danych wejściowych. Program nie daje żadnych wyników. Nie ma nawet programu!
Nicolas Barbulesco,
@NicolasBarbulesco Nie musisz pisać pełnego programu, chyba że zaznaczono inaczej.
Shaun Wild,
1

R, 73 bajty

f=function(x){L=LETTERS;if(is.numeric(x)){i=L[(x)]}else{i=which(L==x)};i}
Mamie
źródło
Nie ma f=takiej potrzeby , a w chmurze spróbuj użyć tej ifelsefunkcji, aby zagrać w bajty!
Frédéric
1

MATL, 10 bajtów

6WZ~t42>?c

Wyjaśnienie:

6W              % 2**6 = 64, but golfier looking
  Z~            % bit-wise XOR with input
    t42>?       % if result is greater than 42
         c      % convert it to a character 
                % else, don't

Wypróbuj online! z wejściami numerycznymi.
Wypróbuj online! z wprowadzaniem alfabetycznym.

zlewka
źródło
1

Python 3, 49 48 53 50 bajtów

Jakoś źle pomyliłem liczbę bajtów; _; dzięki dahuglenny

isalpha jest krótszy niż isnumeric

lambda x:x.isalpha()and ord(x)-64or chr(int(x)+64)

przyjmuje dane wejściowe jako ciąg znaków, który może być literą lub cyfrą

Zniszczalna cytryna
źródło
1
Możesz usunąć odstęp między x.isnumeric()i, elseaby zapisać jeden bajt.
acrolith
1

Java, 61 bajtów

int f(char c){return c^64;}char f(int i){return(char)(i^64);}

Ungolf'd:

int f(char c) {
    return c^64;
}

char f(int i) {
    return (char) (i^64);
}

Wywołanie f('A')wywołuje pierwszą funkcję, strojenie int1; wywołanie f(1)wywołuje drugą funkcję, zwracając char„A”.

AJNeufeld
źródło
`musisz wziąć liczbę jako dane wejściowe i wypisać odpowiednią literę alfabetu i odwrotnie. (1 <=> A, 2 <=> B) itp. 'Nie sądzę, że zestaw funkcji jest do tego odpowiedni.
Shaun Wild,
1
@SeanBean to przeciążenie funkcji.
NoOneIsHere
1
To nie wymaga wkładu. To nie daje wyników. Nie ma programu!
Nicolas Barbulesco,
Należy założyć, że wejście to „A” .. „Z” lub „0” .. „9”. Ponieważ ciąg znaków jest jedynym prymitywem, który może pomieścić jedno z nich (nie wiesz, jaki będzie to sygnał wejściowy), funkcja powinna oczekiwać argumentu ciągu.
RobIII
1

JavaScript 86 77 66 60 bajtów

i=>typeof i<'s'?String.fromCharCode(i+64):i.charCodeAt(0)-64
  • zapisano 7 bajtów po komentarzach na temat używania funkcji strzałek
  • zapisał kolejne 11 bajtów, usuwając return / nawiasy, jak zauważył @manatwork
  • zapisał kolejne 6 bajtów dzięki @manatwork
Dylan Meeus
źródło
1
Użyj funkcji strzałek
Bald Bantha
@BaldBantha wiwaty, zmieniłem to :-)
Dylan Meeus
Nie potrzeba returnstwierdzenia: i=>typeof i=='number'?String.fromCharCode(i+64):i.charCodeAt(0)-64.
manatwork
@manatwork Cheers!
Dylan Meeus,
1
Zgodnie z opisem zadania typeofwejściem może być tylko „liczba” lub „ciąg”. Więc nie trzeba sprawdzać =='number', <'s'zrobi to również.
manatwork
1

ASM: 10 bajtów

3C 40 77 04 2C 40 EB 02 04 40

Objaśnienie: Jest to złożona reprezentacja programu, który robi dokładnie to, o co proszono. Nie jest w pełni funkcjonalny, ponieważ wymaga pewnych dyrektyw, ale jeśli zostanie dodany do segmentu kodu programu asemblera, powinien działać. Odbiera dane wejściowe do rejestru AL, a jeśli jest to litera, odejmuje 40 godzin od wartości kodu ASCII, pozostawiając tylko liczbę (tj. B = 42h, 42h-40h = 2h). Jeśli wartością wejściową jest liczba, wykonuje odwrotną procedurę, dodając 40 godzin. Pozostawia wynik w rejestrze AL. Poniżej znajduje się kod źródłowy zestawu

cmp al,40h
ja letter_to_number
sub al,40h
jmp continue
letter_to_number: add ax,40h
continue:

Ponadto, jeśli przekonwertujesz wszystkie pozostałe odpowiedzi na kod maszynowy, jestem przekonany, że moje byłoby najmniejsze.

6a75616e
źródło
Myślę, że jest kilka kwestii: 77 02 2Cpowinno być 77 **04** 2C; subi addsą do tyłu.
ceilingcat
Zastosowałem powyższe poprawki i stworzyłem „funkcję”, którą można wywołać z programu C na maszynie x86_64. #define F(x) ((int(*)(int))"\x89\xf8\x3c\x40\x76\4\x2c\x40\xeb\2\4\x40\xc3")(x)
ceilingcat
Jaki to rodzaj montażu?
mbomb007,
Turbo Asembler
6a75616e 28.10.16
1

Excel, 33 bajty

=IFERROR(CHAR(A1+64),CODE(A1)-64)
Wernisch
źródło
1

Japt , 11 bajtów

;BbU Ī´UgB

Spróbuj

;BbU Ī´UgB     :Implicit input of integer or string U
;B              :Uppercase alphabet
  bU            :0-based index of U (-1 if not found)
     Ä          :Add 1
      ª         :Logical OR with
       ´U       :Decrement U
         gB     :Index into the uppercase alphabet
Kudłaty
źródło