カウントとスペルアップ


26

次のプロパティを持つ文字列を出力する文字列を入力として受け取るプログラムを作成します。

  • 文字列内の文字が大文字(ASCII 41-5A)の場合、その文字は元の文字までのすべての文字を含む文字列に置き換えられます。たとえば、入力文字列がのI場合、出力はになりますABCDEFGHI
  • 同様に、文字が小文字(ASCII 61-7A)の場合、その文字は同じ方法で置き換えられます。iに置き換えられabcdefghiます。
  • 文字が数字(ASCII 30-39)の場合、文字は数字から始まり数字まで0カウントするすべての数字に置き換えられます。
  • 入力に連結された個々の文字が含まれる場合、置換シーケンスは一緒に連結されます。
  • 他のすべての文字は修正なしで印刷されます。

サンプル入力(空白行で区切られている)

AbC123

pi=3.14159

Hello, World!

サンプル出力

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

これはコードゴルフです。標準ルールが適用されます。バイト単位の最短コードが優先されます。


リーダーボードを表示するには、[コードスニペットを表示]をクリックし、一番下までスクロールして[►コードスニペットを実行]をクリックします。オプティマイザーによって作成されたスニペット。


10
続編のアイデア:この変換を元に戻します。
ETHproductions

2
@ETHproductionsおそらく、ここでの方法はあらゆる入力を受け入れることができるため、私にとってはより良いように見えますが 逆に入力があった場合はどうなりますHello, World!か?
アークトゥルス

入力文字列でNUL(ascii 0x00)文字をサポートする必要がありますか?
nimi

このような場合の@Eridanでは、コードはエラーを出力するか、面白いことに上記の変換を実行する必要があります。すなわち、f(f(input))== input。英数字の入力がこの関係に反することは不可能だと思います。
ジェイク

1
それは完全に真実です-「文字列が変換の結果になる可能性がある場合、それを逆にします。そうでなければ、変換を適用します」。-それはあなたの挑戦です。(a)一貫性があり、(b)検証可能であり、解決するために数学のまったく新しいブランチを必要としない限り、選択したルールを指定できます。サイドノート:照射(b)は興味深いでしょう。NP問題の多項式時間アルゴリズムを思いつくことで、誰かが偶然コンピューターサイエンスに革命を起こすのはいつかわかりません。これは、4バイトを節約する限り、ここでは実際に妥当です。
ジェイク

回答:


11

Pyth、19バイト

sXzsJ+rBG1jkUTs._MJ

オンラインで試す:デモンストレーションまたはテストスイート

説明

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

パイソン2.7、100の 98 96バイト

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

TeaScript、24バイト26 28

TeaScriptはゴルフ用のJavaScriptです

xl(#(i=lN()1)h(ii(l)+1))

とても短い

オンラインで試す

説明

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

ルビー、137 87 82 76 67 55バイト

ゴルフはしていませんが、パターンを見ることができます。

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

編集:正規表現を1つだけに絞り込みます。

編集2:余分なスペースがたくさんありました。

編集3:12バイトのゴルフのマナトワークに感謝します!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
マナトワーク

@manatworkくそーそれは賢いです!
ピーターレンケフィ

4

パイソン2、145 140 133 103 102バイト

リスト内包表記を使用した、それほど滑らかではない匿名関数。ロジックはもっと短くする必要があると感じています。

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

使用する名前を指定する必要があります、すなわち f=...


@Megoああ、ハハ!心配ありません:)
Kade

4

Haskell、95 91 86 60バイト

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

使用例:f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

仕組み:cがA/ Za/ zまたは0/の間になければ、入力文字列内のすべての文字cをコピーし、9そうであればのリストを取得します[<first char in pair> ... <c>]

編集:@Zgarbは多くのバイトを節約しました。ありがとう!


完全に定義c#_=[c]してスキップできると思いますt
-Zgarb

@Zgarb:確かにそうですし、それからsも不要です。どうもありがとう!
nimi

4

JavaScript(ES6)、143 138バイト

文字列比較を使用して、使用する文字をテストします。

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

オンラインデモ。FirefoxおよびChromeでテスト済み。

編集:に置き換えa='0123456789abcdefghijklmnopqrstuvwxyz'て5バイトを保存しました

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP、146バイト

ゴルフ

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

改訂1:順序範囲を直接foreachに入れます。増加したord範囲が最大になり、に変更され$d<=$mました$d<$m。およびのfor代わりにcharを反復するために使用します。にコードを移動してすべて削除foreachstr_split{}for

非ゴルフ

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

説明: 文字列を配列に分割します。ascii値が範囲内にある場合(az、AZ、0-9の場合)、カウンターを範囲の最小値からcharのascii値まで増分し、charのascii値に達するまで各値を追加します。

私が渡した&$varので、出力はむしろ参照によって行われますreturn


変数$ zが範囲の配列を保持する必要はありませんforeach。配列リテラルをに直接入れることができます。
マナトワーク

使用してみましたrange()か?pastebin.com/k2tqFEgD
manatwork

@manatwork、宣言から変更し$z、他のいくつかの変更を行いました。range()おそらくより良いでしょう。後で範囲のあるものを試すかもしれません。
リード

を使用してrange、私function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}は166 を手に入れました。-
リード

1
はい、146文字に書き換えた後のrange()利点はあまりありません。しかし、その166は長すぎます:配列リテラルの$ oが戻ってきました。asキーワードの周りに余分なスペースがあり、のjoin()エイリアスですimplode()。(先ほどリンクしたpastebinコードを確認しましたか?範囲のエンドポイントを保存する別の可能性を示しています。)146文字のソリューションに関しては、ord()呼び出し内で$ cに割り当てを移動できます$d=ord($c=$n[$r])
マナトワーク

2

Python、143バイト

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

オンラインで試す


2
z = rangeを使用して4バイトを節約できます。
アークトゥルス

1
あなたはあなたにいくつかのバイトを救う単一のタブでダブルスペースのインデントを置き換えることができることをかなり確信して
基金モニカの訴訟

2

Perl 6、101バイト

ここに最初のパスがあります:

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


.transon $_を使用して削除しis copyます。

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


サブルーチン@*ARGSを定義する代わりに、直接行動してくださいMAIN
(その他の点では前の例と同じ)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

Scala、111 91バイト

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

これは失敗しpi=3.14159ます。ソリューションval f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)は、なんと128文字にもなりますか?
レオナルド

2

ジュリア、102 98 90 84バイト

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

これにより、文字列を受け入れて文字列を返す名前のない関数が作成されます。

ゴルフをしていない:

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell、155バイト

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

技術的にはワンライナーであり、PowerShellはそれらに関するすべてです;-)

入力を分割し、それをForEach-Objectループにパイプし、キャスト文字の整数値をオンにしてchar[]、適切な範囲の新しい値を生成します。switchステートメントで$b入力をキャストする行為は、$_使用を続けることができない$_か、ファンキーな出力が得られることを意味するため、一時変数を設定するにはバイトを費やす必要があることに注意してください。

編集-最初のオブジェクトが%{...}nullオブジェクトであるため、これによりエラーが発生することを指摘する必要があります。STDERRはデフォルトでは無視されるため、これは問題になりません。問題がある場合は、最初のビットを変更して($args-split''-ne''|...、nullオブジェクトを削除します。


2

JavaScript(ES6)、340 258 273 271バイト

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

forループの代わりに、("")およびf=i=""forループでテンプレート文字列 ``を使用できます。さらにいくつかのバイトを保存できる場合があります。
intrepidcoder

@intrepidcoder最初のものが機能します。私は2番目にチェックしています。
コナーオブライエン

2

C(269バイト)

(明確にするために改行を追加)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

非ゴルフ

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

Perl 5の66 61(51バイト+ 1)52

この場合、正規表現と条件演算子を組み合わせるとうまくいきました。
結合を使用して、マップを使用して範囲を配列に結合します。

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

テスト

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

説明

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

JavaScript(ES7)、125バイト

文字列のエンコードに焦点を当てた2つのJS回答が既にあったので、私は以下を使用して、よりアルゴリズム的なアプローチを採用することにしましたString.fromCharCode()

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

このメソッドを使用joinすることの利点は、任意の量の文字コードを使用するため、リストを作成する必要がないことです。これは他のどの手法よりも短いことが判明したため、結果に満足しています。


1

MUMPS、131バイト

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

MUMPSの動的スコープのおかげで、ここでかなりの数バイトを節約できました。MUMPS Prettifyモジュールのサポートのみが利用可能な場合、これはおおよそ同等の機能なしのバージョンです

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

Perl 6の、78の 77バイト

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

ケースとケースを組み合わせることで短縮できることはわかっいましたが、もっと一生懸命努力する必要がありました。'a'..'z''A'..'Z'
ブラッドギルバートb2gills

正しく強調表示されるように、<!-- language-all: lang-perl6 -->直後に追加することをお勧め## Perl 6します。(この回答の変更はすでに保留中です)
Brad Gilbert b2gills

あなたは切り替えることができます{[~](0..$/)}{[~] 0..$/}1つのバイトを救うであろう。
ブラッドギルバートb2gills

0

Mathematica、102バイト

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

しかたがない...


0

CJam、32 31バイト

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

CJamインタープリターでオンラインで試してください。

使い方

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

Python 2、135 117バイト

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP-291バイト

文字列をに渡しますGET["s"]

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

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