数字をそれぞれの文字で置き換えます


23

入力として数値を取り、小文字と大文字のアルファベットのASCIIコードポイントが同等の文字で置き換えられた文字列を出力する関数またはプログラムを作成します。

  • 大文字のアルファベットはコードポイントを使用します。 65-90
  • 小文字のアルファベットはコードポイントを使用します。 97-122

入力内の隣接する数字が文字のコードポイントに等しい場合、その文字が出力文字列の数字を置き換えます。

ルール:

  • 入力は1〜99桁の正の整数になります
  • 有効な入力のみが与えられていると仮定できます
  • 整数の先頭から置換を開始します(976-> a6ではなく9L
  • 入力は任意の適切な形式にすることができます(文字列表現はOKです)
  • 出力は任意の適切な形式にすることができます
  • 標準ルールが適用されます

例:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

バイト単位の最短コードが勝ちます!


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
「入力は1〜99桁の正の整数です」私が知っているプログラミング言語では、64ビットintでも10進数で最大19桁しか保持されないため、1〜99桁の文字列になります。数字...
TJクラウダー

3
@TJCrowder彼は、データ型ではなく、数学的な意味で整数を意味したと思います。
デニス

1
@TJCrowderの有効なポイント:-)ただし、私が間違っていなければ、1e99は技術的には整数です。long intだけでは不十分ですsuper long int
スチューウィーグリフィン

1
@StewieGriffin:ハァッ!:-)そのようなことをする言語がどこかにあると確信しています。
TJクラウダー

回答:


2

Jolf、18 16バイト

ここで試してみてください!いつかupperLower関数が役立つことを知っていました!交換するó΢、あるいは単に通訳のリンクを使用します。これはISO 8859-7でエンコードされています。

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl、39 38バイト

-pフラグ用に1バイトが追加されました。)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Job™に最適なツール。

説明は一つの小さな最適化(感謝の後に古くなっDEV-ヌルそれは単一バイト短い(しかし、少し少ないエレガント)を行うこと!):$"変数がどのように表しているjoin設定はので、文字列にarrrayを補間するときに$"="|"する必要がなくなりjoin

デモ:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

$"="|"結合の代わりに設定することで1バイトを保存できると思いますか?
andlrc

例えば。$"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null動作します、ありがとう!
ドアノブ

11

Javascript、80バイト

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

ここで実際に正規表現を参照してください:https : //regex101.com/r/iX8bJ2/1

好奇心のために、私がここで学んだこと:

私は変更することはできませんx=>String.fromCharCode(x)String.fromCharCode あるため...


6

CJam、22バイト

q{+'[,_el^{_is@\/*}/}*

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

バックグラウンド

数字グループのすべての出現を対応する文字で(選択した順序に関係なく)単純に置き換えると、左から右の規則に準拠できなくなります。

代わりに、入力文字列のすべてのプレフィックスを生成し、生成中に可能なすべての置換を試みることができます。別のコードポイントにコードポイントが含まれていないため、これらの試行の順序は重要ではありません。

例えば:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

使い方

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP、110 102 101 68 67バイト

かなり難しい挑戦。これは私が思いつく最高の方法です。これは完全に新しいバージョンです。

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

次のように実行します。

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • ctype_alpha代わりにpreg_matchthxを使用して8バイトを保存しました。
  • 0空ではない文字列をチェックする代わりに、文字列の先頭に1バイトを保存しました。入力の最後の文字が0の場合、取得する部分文字列は「0」になりますが、「00」は真実です。そのため、最後の0の印刷はスキップされません。
  • strtr変換ペアを使用して配列を構築した後に使用することにより、33バイトを大幅に節約しました
  • 短い印刷タグを使用してバイトを保存しました

1
Yoは#[A-Z]#i「92」を「\」に変換できるようにするため、正規表現をに変更する必要があります。またはのctype_alpha()代わりに試してくださいpreg_match()。これまでのところうまくいくようです。
マナトワーク

"0", which is falsy, whereas "00" is truthy順調です、PHP。

3

Python 3、211 189 188バイト

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • \ nを;に置き換えて23バイトを節約しました。デニスのおかげで

テスト

ここに画像の説明を入力してください


1
;改行の代わりに使用する場合、whileループ全体を1行に配置できます。また、最初の行はになりdef f(c,i=0,n=""):ます。
デニス

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)など
seequ

2

Pyth、20 18バイト

.Uu:G`CHHsrBG1+bZz

@Dennisと同じアルゴリズム。Pellyでのコーディングは、Jellyよりも携帯電話で行う方がはるかに簡単です。

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

ありがとう@isaacg

ここで試してみてください


携帯電話でこのサイトから離れることはできません。
コナーオブライエン

1
特に、すべての印刷可能なASCIIでコーディングの贅沢がある場合:D
lirtosiast

1
それは本当です、おそらくすべてのゼリーから休憩を取るのはいいことです...あなたが知っている、バランスの取れた食事;)
コナー・オブライエン

0

05AB1E、12 バイト

õsvy«žnvyÇy:

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

reduce-byを使用した12 バイトの代替:

Å»«žnvyÇy:]θ

オンラインそれを試してみたり、すべてのテストケースを確認するか、単に最初の10バイトのステップバイステップの削減を参照してください

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