アルファベットから数字および数字からアルファベット


26

チャレンジ

この課題では、数字を入力として使用し、アルファベットの対応する文字を出力する必要があります。逆も同様です。(1 <=> A、2 <=> B)など。

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

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

ルール

  • これはなので、バイト単位の最短コードが優先されます。
  • 入力のみから大文字のいずれかからなるであろうAZ、または整数126含め。
  • 末尾の空白(スペースと改行)は許可されます。

1
なぜ複製するのですか?Ooそれは等しくありません。
チャド

3
プログラミングパズルとコードゴルフへようこそ!この課題では、少し明確にする必要があります。たとえば、無効な入力があるため、処理する必要がある入力を指定できます。メインサイトに投稿する前に意味のあるフィードバックを得ることができるサンドボックスに将来の課題を投稿することをお勧めします。
リーキー修道女

1
26整数として受け取るか"26"文字列として受け取るか、または両方とも許可されますか?
リーキー修道女

2
大文字にする必要がありますか、それとも代わりに小文字を使用できますか?
メゴ

1
真剣に、別のアルファベットの挑戦?(͡°͜ʖ͡°)
shooqie

回答:


6

実際には、7バイト

ú' +ûEí

オンラインでお試しください!

説明:

ú' +û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)

小文字が許容される場合、これは6バイトです。

ú' +Eí

オンラインでお試しください!


1
あなたは現時点で勝っています、私は誰も7バイト未満でプログラムを行うことができなかったと思います。
チャド

1
これを聞くためだけに参加しました。@Megoこれは何語ですか?
FoldedChromatin

2
@FoldedChromatinはgithub.com/Mego/Seriouslyのように見えます
アルフレッドベズ

1
@FoldedChromatin実際には、Actuallyです。したがってActually, 7 bytes。:P
ダン

2
このような瞬間は、私が自分の言語に選んだ名前について私を幸せにします:)
Mego

12

Pure Bash、51

残りの回答のほとんどは、何らかの条件を使用しています。これは、条件を完全に省き、代わりに適切に構築されたbash-brace-expansion配列にインデックスを付けるbase-36の数値として入力を扱います:

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

イデオネ。


1
だから何をし#ますか?
R. Kap


9

アーラン、26バイト

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

Erlangの文字列の振る舞いが役立つ数少ない時間の1つ。



7

Python 3、43バイト

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

このソリューションの興味深い点は、OR、ビットごとのOR |、論理OR or、ビットごとのXOR ^および論理XORのすべての感覚を取り入れていること!=です...


6

2sable9 8バイト

コード:

.bAu¹kr,

説明:

.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.

CP-1252エンコードを使用します。オンラインでお試しください!


1
を削除できませんか?どのバイトがありませんか?新しい行を印刷する必要はありません。
チャド

@Chad Nope、数値入力では機能しません:(
Adnan

6

Ruby、47 39 + nフラグ= 40バイト 33 34 31バイト

匿名関数。@KarlNapfのPythonソリューションのような例外処理トリックを使用します。

@manatworkから-3バイト

オンラインで試す

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

オリジナルのフルプログラムバージョン n40バイトフラグとSTDINからの読み取りを含む:

puts$_!~/\d/?$_.ord-64:(64+$_.to_i).chr

ideone実行しようとすると構文エラーが発生します。テスト方法を教えてください。
ライブルグ

@Leibrugおっと!現在修正済み
値インク

彼のPythonソリューションからカールナフのトリックを恥知らずに適用することでそれをさらに減らすことができます->i{(64+i).chr rescue i.ord-64}
マナトワーク

5

チェダー、 34 32バイト

@LeakyNunのおかげで2バイト節約

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

文字列か数字かを確認する方法がもっと短いといいのですが。

オンラインでお試しください!または テストスイート

説明

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==n文字列かどうかを簡単な方法でチェックします。"%s"は文字列形式であり、%例えば"a %s c" % "b"でフォーマットできます"a b c"%s文字列であることを指定します%s。数字が渡された場合、として残ります。


"%s"%n==n2バイトを節約
Leaky Nun

@LeakyNunおお、それは賢い!私はやってみましたが、うまくいき"%d"%n==nませんでした:/
Downgoat

5

Mathematica 54 41バイト

LegionMammal978からの13バイトを節約する絶対に賢い提案があります。

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

If[#>0,FromLetterNumber,,LetterNumber]入力するFromLetterNumberLetterNumber、入力するかを決定するという唯一の目的を果たします。

#>0入力#が数値の場合に満たされ、その場合FromLetterNumberは選択されます。

ただし、文字の#>0場合#は真でも偽でもないため、LetterNumber代わりに選択されます。


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

4


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

d


MathematicaではFromLetterNumberLetterNumber他のアルファベットでも動作します。これには、あと数バイトしか必要ありません。

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


1
いくつかのゴルフ、41バイトにそれをもたらす:If[#>0,FromLetterNumber,,LetterNumber]@#&
LegionMammal978

あなたの提案を次のように解釈しますIf[#>0,FromLetterNumber[#],LetterNumber@#]‌&。けれどもIf[#>0,FromLetterNumber[#],LetterNumber@#]‌&[4]作品、If[#>0,FromLetterNumber[#],LetterNumber@#]‌&["c"]しません。どうやら解決できないよう"c">0です。誤解しましたか?
DavidC

double ,,は意図的であり、外部も同様@#です。それはとして評価されIf[# > 0, FromLetterNumber, Null, LetterNumber][#]&、4引数形式を使用しますIf(ルックアップ)。
LegionMammal978

4引数形式の仕組みは驚くべきIfものです。
DavidC

4

Haskell、54バイト

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

使用例:map f ["1","26","A","Z"]->["A","Z","1","26"]

Haskellの厳密な型システムは、ここで本当に苦痛です。さらに、すべての短い文字< - >のようなint型の関数chrとは、ord私は手でそれをしなければならないので、インポートする必要があります。文字-> intの場合、たとえば、変換する必要がありますString-> Char(経由!!0)-> Integer(経由fromEnum)-> String(経由show)。


4

C、55バイト

i;f(char*s){i=atol(s);printf(i?"%c":"%d",64^(i?i:*s));}

4

Perl 6、25バイト

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

説明:

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

例:

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)

2
構文が非常に異なっていても、その同じメカニズムはPerl 5の同じバイト数です:perl -pe '$_=/\d/?chr$_+64:-64+ord'
ドムヘイスティングス

3

C#、32バイト

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

にキャストしFunc<int, object>ます。

入力:char暗黙的に変換するintため、int(1-26)またはchar( 'A'-Z')で呼び出すことができます。

出力:a charまたはint


3

PHP、49 41 40バイト

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

私はis_numeric右に良い選択肢があるとは思わない?

これはコマンドラインから実行されます($argv[1]最初に指定された変数です)

おかげで:

@insertusernamehere:ゴルフされた8バイト。交換is_numeric($i=$argv[1])して0<($i=$argv[1])いるので.This作品(int)"randomLetter" == 0

@manatwork:1バイト削減。交換してください0<+。この場合に発生するのは、+シグナルが「Z」(または任意の文字)を0にキャストすることです。これにより、falseになります。そのため、どの文字も常に偽であり、数字は常に真です。


2
0<($i=$argv[1])代わりにis_numeric($i=$argv[1])を使用すると、8バイト節約できます
insertusernamehere

1
その考えを続ける:0<+
マナトワーク

2

Python 2、61バイト

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

はい、私はPython 3に切り替えることができました input


input()それでも使用し、に変更int(i)iます。
リーキー修道女

その場合、文字入力は機能しません。
カールナップ

2
入力を受け取る"A"
Leaky Nun

3
ださいよ。Aまたは何もありません。
カールナップ

関数として再定式化することで、数バイトをノックオフできます:行1:、def f(i):行2:<スペース> try:o=chr(i+64)、行3 <スペース>それ以外は変更なし、行4:<スペース> return o その形式では、Python 2で動作しますまたはPython 3
cdlane

2

PowerShell v2 +、42バイト

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

入力を$n(整数または明示的なcharとして)受け取り、疑似3進数を使用して配列の2つの要素から選択します。条件は$n-ge65(つまり、入力ASCII A以上)です。その場合、単純に入力をintとしてキャストし、減算し64ます。それ以外の場合、64入力整数に追加し、それをとしてキャストし[char]ます。いずれの場合も、結果はパイプラインに残り、印刷は暗黙的に行われます。

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

2

Befunge-98 *、19バイト

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

質問があなたが受け取ると言ったので、私はこれが数字26または文字AZを意味1-26するA-Zと仮定した。ほとんどの解釈は代替コードの入力に苦労する&ため、26の場合は26、「Z」の場合は90などの値を使用して入力する方が簡単です。~です。

擬似コード

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

テストする(Windows) ここでください!

*これは技術的にUnefunge-98です。これは1次元しか使用しないためですが、その名前はなじみがないかもしれません。


2

Befunge 93144の90 66 54 36 19バイト

これが許可されているかどうかは100%確かではありませんが、Aを65、Bを66などと入力することが許可されている場合、([私の]便宜上):

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

それ以外の場合、36バイトで:

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

(提案をしてくれたtngreeneに感謝します!)

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

(再配置により12バイトを節約してくれたSp3000に感謝します!)

~: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*-.@

ゴルフをしていない:

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

これは私の初めてのBefungeプログラムであり、これをさらにゴルフする必要性を感じています。どんな助けも大歓迎です。

ここで Befungeコードをテストできます


1
一目コメントを渡す:Befungeはラップアラウンドするので、あなたが前に二行目の最後の12個の文字を移動して取得することができます52**\28*++,@>~:0`!#^_\68*-
SP3000

@ Sp3000、ああ、私はそれに気づかなかった。ありがとう!
ダニエル

初めてのプログラムおめでとうございます!考慮すべきことの1つは、文字列にASCII値をプッシュすることで大きな数値を生成することです。と比較567+*してください"A"。また、忘れてはいけないgp価値を再利用する代わりに繰り返し、それを構築することに関する指示。また、IPをブランチに渡す入力が見つかりませんでした>$ 28* + , @。これは何のため?本当に必要ですか?
tngreene

最後に、「26」または「08」の解析に対するあなたの献身を称賛します。私が読んだ方法では、( '2' to 2 back to '2')のように、多くのシンボル<->数値変換数学が含まれています。比較を開始する前に最初と2番目の入力を数値として使用すると、ASCII算術演算の量を減らすことができます。あるいは、入力をシンボルとして効率的に処理する方法があるかもしれません(「2」のように「2」)、数値への変換は必要ありません!
tngreene

@tngreene、整数入力<10はブランチに進み、$28*+,@> = 10は他のブランチに進みます。私の知る限り、入力を何度も読み直すことができないため、これは最終的に行われました。
ダニエル

2

Brainfuck、445キャラクター

ゴルフのコードよりも概念の証明。署名なし、ラップなしのBrainfuckが必要です。

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

コメント付き

,[>+>+<<-] 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

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

2

Java、104 98 97 83 54 53 51 50 30バイト

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

テストプログラム

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

1
:あなたはそうのように三項演算子を使って、20バイト程度ドロップすることができますreturn(s.matches("\\d+")?(char)(Integer.parseInt(s)+64)+"":(s.charAt(0)-64)+"");
yitzih

intへのキャストも削除できます。これにより、7バイト削減できます。
user902383

プログラムは入力を受け取りません。プログラムは何も出力しません。プログラムもありません!
ニコラスバルブレスコ

@NicolasBarbulesco特に明記しない限り、完全なプログラムを書く必要はありません。
ショーンワイルド


1

R、73バイト

f=function(x){L=LETTERS;if(is.numeric(x)){i=L[(x)]}else{i=which(L==x)};i}

必要ありませんf=、そしてあなたはifelse多分いくつかのバイトをゴルフアウトするために関数を使用しようとします!
フレデリック


1

Python 3、49 48 53 50バイト

どういうわけか、バイトカウントを間違えました; _; おかげダフグレニー

isalpha より短い isnumeric

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

入力を文字列として受け取ります。文字または数字の場合があります


1
x.isnumeric()との間のスペースを削除してelse1バイト節約できます。
アクロリス

1

Java、61バイト

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

呼び出しf('A')再同調、最初の関数呼び出しint1。呼び出しf(1)を返す、第二の機能呼び出し、char「A」を。


`入力として数字を取り、アルファベットの対応する文字を出力する必要があり、その逆も同様です。(1 <=> A、2 <=> B)など。`一連の関数がこれに適しているとは思わない。
ショーンワイルド

1
@SeanBeanそれは関数のオーバーロードです。
-NoOneIsHere

1
入力は必要ありません。出力はありません。プログラムはありません!
ニコラスバルブレスコ

入力は「A」..「Z」または「0」..「9」のいずれかであると想定する必要があります。文字列はどちらかを保持できる唯一のプリミティブであるため(入力がどうなるかはわかりません)、関数は文字列引数を予期する必要があります。
RobIII

1

Javascript 86 77 66 60バイト

i=>typeof i<'s'?String.fromCharCode(i+64):i.charCodeAt(0)-64
  • 矢印関数の使用に関するコメントの後に7バイトを保存しました
  • @manatworkで示されているように、リターン/ブラケットを削除して、さらに11バイトを節約しました。
  • @manatworkのおかげでさらに6バイト節約しました

1
矢印関数を使用してください
Bald Bantha

@BaldBantha歓声、変更:-)
ディラン

次のreturn文は不要ですi=>typeof i=='number'?String.fromCharCode(i+64):i.charCodeAt(0)-64
マナトワーク

@manatwork乾杯!
ディランミーウス

1
タスクの説明によると、typeof入力は「数値」または「文字列」のみです。だから、かどうかを確認する必要が=='number'<'s'またそれを行いません。
マナトワーク

1

ASM:10バイト

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

説明:これは、求められていることを正確に行うプログラムのアセンブルされた表現です。いくつかのディレクティブが必要なため、完全に機能するわけではありませんが、アセンブリプログラムのコードセグメントに追加されれば動作するはずです。ALレジスタで入力を受信し、その文字がASCIIコード値から40hを引くと、数字だけが残ります(つまり、B = 42h、42h-40h = 2h)。入力が数値の場合、40hを追加することで逆の手順を実行します。結果はALレジスタに残ります。以下はアセンブリソースコードです

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

また、他のすべての答えをマシンコードに変換すると、私のものが最小になると確信しています。


いくつかの問題があると思い77 02 2Cます77 **04** 2C。逆方向にあります。subadd
ceilingcat

上記の修正を適用し、x86_64マシン上のCプログラムから呼び出すことができる「関数」を作成しました。#define F(x) ((int(*)(int))"\x89\xf8\x3c\x40\x76\4\x2c\x40\xeb\2\4\x40\xc3")(x)
ceilingcat

これはどのタイプのアセンブリですか?
mbomb007




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