ランレングスデコード


20

指定した文字列のランレングスデコードを実行するには、選択した言語で最短のコードを記述します。

文字列は、標準入力で次の形式で入力されます。

CNCNCNCNCNCNCNCN

それぞれ C任意の印刷可能なASCII文字である可能性があり、それぞれがN数字である19(包括的)。

サンプル入力:

:144,1'1

対応する出力:

:4444,'

回答:


28

Brainfuck、34文字

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

5
ワオ。他のソリューションと競合できるブレインファックソリューションですか?
ヨハネ

13

シェークスピアプログラミング言語、406バイト

.
Ajax,.
Ford,.
Act I:.
Scene I:.
[Enter Ajax and Ford]
Scene II:.
Ford:
Open your mind.Is sky nicer than you?If so, let us return to scene IV.
Ajax:
Open your mind.You is sum you and sum big big big big big big pig and big big big big cat!
Scene III:.
Ford:
Speak thy mind.
Ajax:
You is sum you and pig!Is you as big as zero?If so, let us return to scene II.Let us return to scene III.
Scene IV:.
[Exeunt]

ゴルフされていないバージョン:

The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.

Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.

Act I: In which the lengths of runs are decoded.

Scene I: A silent entrance.

[Enter Romeo and Juliet]

Scene II: In which neither Romeo nor Juliet believes the other open-minded.

Juliet:
  Open your mind. Is my mother jollier than thou? If so,
  we must proceed to scene IV.

Romeo:
  Open your mind. Thou art the sum of thyself and the sum of my good aunt and
  the difference between nothing and the quotient of the square of twice the sum
  of thy foul fat-kidneyed goat and thy death and thy evil variable!

Scene III: In which Romeo snaps and brutally insults Juliet.

Juliet:
  Speak thy mind.

Romeo:
  Thou art the sum of thyself and a hog! Art thou as rotten as nothing? If so,
  let us return to scene II. Let us return to scene III.

Scene IV: Finale.

[Exeunt]

私はdrsam94のPython SPLコンパイラーを使用していますが、これにはいくつかのバグがあります(たとえば、ゴルフ用バージョンではOpen your mindなく使用する理由ですOpen thy mind)。

このプログラムを実行するには、次を使用します。

$ python splc.py rld.spl > rld.c
$ gcc rld.c -o rld.exe
$ echo -n ":144,1'1" | ./rld
:4444,'

使い方

SPLは、プログラムをシェークスピアの演劇のように見せるために設計された難解なプログラミング言語です。これは、文字を変数として使用することでこれを行い、処理は、文字が互いに物事を言うことにより実行されます。

The Decoding of the Lengths of Veronan Runs - A Drama of PPCG.

これは劇のタイトルです。コンパイラーによって無視されます。

Romeo, quite a character.
Juliet, Romeo's lover and multiplicand.

ここでは、プログラムの残りで使用される変数を宣言しています。すべてがbetwen ,.、コンパイラによって無視されます。この場合、を宣言しRomeo、デコードする文字を保持するために使用し、、文字Julietのランレングスを保持するために使用します。

Act I: In which the lengths of runs are decoded.

ここでは、プログラムで最初で唯一の動作を宣言します。行為とシーンはラベルのようなものです。let us return to scene IIまたはそのバリアントを使用して、いつでもジャンプできます。それは私たちのニーズに十分であるため、私たちは1つの行為のみを使用します。ここでも、間に何:とは、.コンパイラによって無視されます。

Scene I: A silent entrance.

ここで最初のシーンを宣言します。シーンはローマ数字で番号付けされます。最初はScene I、2番目Scene IIなどです。

[Enter Romeo and Juliet]

これはステージの方向です。その中で、変数RomeoJuliet変数に「ステージ」に来るように指示します。一度に「ステージ」に配置できる変数は2つだけです。ステージは、コンパイラがどの変数がいつ話すかを特定できるように使用されます。変数が2つしかないため、ロミオとジュリエットはプログラムの期間中ステージ上に留まります。

Scene II: In which neither Romeo nor Juliet believes the other open-minded.

別のシーン宣言。別のランレングスをデコードするために、シーンIIにジャンプします。

Juliet:

この形式の宣言は、ジュリエットが話し始めることを意味します。次Romeo:、ステージ方向、またはシーン/アクトの宣言まではすべて、ジュリエットが話す行になるため、「私」はジュリエット、「あなた」/「トウ」はロミオなどを指します。

Open your mind.

このコマンドは、STDINの単一文字の序数値をに保存しますRomeo

Is my mother jollier than thou?

SPLでは、名詞は正か負かに応じて1または-1に変換されます。この場合、my mother1 に変換されます。形容詞(正または負)は、名詞に2を掛けます。

これは質問です。その中で、ジュリエットはmy mother(AKA 1)がロミオより「ジョリエ」かどうかを尋ねます。比較less thanは、(のような負の場合worse)またはgreater than(のような正の場合)に変換されjollierます。したがって、この質問はに要約されIs 1 greater than you?ます。

この質問をする理由は、入力の終わりを検出するためです。の値はEOFプラットフォームによって異なりますが、通常は1未満なので、これを使用して検出します。

If so, we must proceed to scene IV.

前の質問がに評価された場合、trueシーンIVにジャンプします。これは単にプログラムの終わりです。つまり、EOFを検出した場合、プログラムを終了します。

Romeo:

現在はロミオのラインです。「私」と「あなた」はそれぞれロミオとジュリエットを指します。

Open your mind.

繰り返しますが、このステートメントは、STDINから単一の文字の序数値をJulietに入れます。この場合、これはに格納されている文字のランレングスですRomeo

Thou art the sum of thyself and the sum of my good aunt and the difference 
between nothing and the quotient of the square of twice the sum of thy foul
fat-kidneyed goat and thy death and thy evil variable!

これは非常に詳細に説明するには長すぎますが、に変換されるという点で私を信頼してくださいJuliet -= 48。これは、ジュリエットがASCII値の数値を保持しているためord('0') == 48です。48を引くことで、数値のASCII値から数値自体に変換します。

Scene III: In which Romeo snaps and brutally insults Juliet.

別のシーン宣言。この一つは、我々が繰り返しの文字値印刷するループのためであるRomeoJuliet回。

Juliet:
  Speak thy mind.

このステートメントにより、Romeoは自分の値を文字として出力します。つまり、以前にロミオに保存されていた文字値がすべて出力されるようになりました。

Romeo:
  Thou art the sum of thyself and a hog!

hogは負の名詞であるためa hog、-1に変換されます。したがって、このステートメントはに評価されJuliet -= 1ます。

Art thou as rotten as nothing?

ここでロミオは、ジュリエットが「腐ったように」または0に等しいかどうかを尋ねます。

If so, let us return to scene II.

ジュリエットの値が0の場合、シーンIIにループバックして、別のキャラクターのランレングスをデコードします。

Let us return to scene III.

それ以外の場合は、シーンIIIにループバックして、ロミオのキャラクターを再び出力します。

Scene IV: Finale.

[Exeunt]

この最後のシーン宣言は、プログラムの終了を示す単なるマーカーです。[Exeunt]ステージの方向は、実際には最後のシーンを生成するようにコンパイラーを取得する必要があります。



5

perl、27文字

print<>=~s/(.)(.)/$1x$2/ger

これは不必要に冗長に見えprint<>=~s/(.)(.)/$1x$2/gerます:。また$1x$2、あなたが意図したものであり、その逆ではないこともかなり確信しています。
primo

@primo true-rフラグについて知らなかったため、見つかりませんでした。ありがとう。他の部分については-申し訳ありませんが、仕様を読み間違えました。できるときに編集します。
ジョンドヴォルザーク

BTW /rに記載されてはperlopとv5.14.0で加えた
psxls

-pフラグを使用するprint<>、をドロップして、ので、答えは単純になりますs/(.)(.)/$1x$2/ge。-> 17chars +1 for- -p> 18
F.ハウリ

4

R 67

x=strsplit(readline(),"")[[1]];cat(rep(x[c(T,F)],x[c(F,T)]),sep="")

+1 引数を文字から整数に自動的にrep強制するという考えがありませんでしたtimes。ブリリアント。
plannapus

4

Python 3、52

Python 3では、2つのpython2ソリューションのアプローチを統合できます。

s=input()
t=''
while s:a,b,*s=s;t+=a*int(b)
print(t)

Python 2はraw_inputPython 3と一致しinputます。だから、最初の行の必見によってs=input()
AMK

1
49: s=input() while s:a,b,*s=s;print(a*int(b),end='')
Cees Timmerman


3

APL(22)

,/{⍺/⍨⍎⍵}/↑T⊂⍨~⎕D∊⍨T←⍞

説明:

  • T←⍞:入力を保存する T
  • T⊂⍨~⎕D∊⍨TT数字ではない文字で分割
  • :行列2ごとに変換するN/2
  • {⍺/⍨⍎⍵}/:マトリックスの各行//)で、最初の文字()を2番目の文字()のeval()で複製()
  • ,/:各行の出力を連結します

3

ルビー、30バイト

gsub!(/(.)(.)/){$1*$2.to_i}

-pフラグ付きで実行するには、27バイトのコード+ 3バイト:

$ ruby -p rld.rb <<< ":144,1'1"
:4444,'

2

8086アセンブリ、106 98文字

l:
mov ah,8
int 21h
mov bl,al
int 21h
sub al,48
mov cl,al
xor ch,ch
mov al,bl
mov ah,14
p:
int 10h
loop p
jmp l

入力ストリームの数字が文字の前にある場合、これから2行(18文字)を削ることができます。


冗長な「mov ah、8」を削除したばかりです
マイクC

2
アセンブラーの文字数ではなく、コンパイル済みのバイト数をポストする必要があります。ルールの乱用FTW
arrdem

何についてのdq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b453文字の?それは... EOFしかし非大文字を扱うか、どこで表示されない
ジェイソンGoemaatを

arrdem:良い考えです。16進エディタで手作業で組み立てると、規則に違反するのではないかと思います。私は、asmソースよりも低いレベルでコードを直接書いています。:)ジェイソン:ルールにはEOFについて何も表示されません。標準入力です。ctrl-cを押して停止します。また、なぜ小文字を処理しないのですか?
マイクC

一般的に、機械語は、解釈された言語またはコンパイルされた言語のソースコード数と比較して、バイト数でカウントされます。
ジョーZ.

2

GNU SED、122 + 2(-r)

#n
s/.*/\n&\a987654321\v\v\v\v\v\v\v\v\v/
:a
s/\n(.)(.)(.*\a.*\2.{9}(.*))/\1\n\4\3/
tb
bc
:b
s/(.)\n\v/\1\1\n/
tb
ba
:c
P

で実行される必要がある-rフラグ
置き換えることにより、110 + 2に還元することができる\v印刷不可能と0x0B\a0x07


+1(\2.{9}素晴らしいアイデアです)すばらしい!
F.ハウリ

2

C、65文字

入力をパラメーターとして取得します。

main(p,v)char*p,**v;{
    for(p=v[1];*p;--p[1]<49?p+=2:0)putchar(*p);
}

gcc:でこれを超えることはできません error: first parameter of 'main' (argument count) must be of type 'int'。コマンドラインスイッチはありますか?
ダレンストーン

@DarrenStone、このコードは100%標準に準拠していません。最初のパラメーターをパラメーターとして使用しないため、そのタイプは重要ではありません。ほとんどのコンパイラはそれほど気にしません。
ウゴレン

はい、ありがとう。あなたのゴルフに優しいコンパイラーがうらやましいです!:)
ダレンストーン




2

Windows PowerShell、55文字

-join((read-host)-split'(..)'|%{(""+$_[0])*(""+$_[1])})

具体的にはcharからstringおよびintへのキャストを使用すると、これをよりゴルフダウンできるという感覚が得られますが、今すぐ作業を続ける時間はありません。


2

C、68文字

Cでの@ugorenの回答は少し短くなっていますが、この回答は「文字列はstdinの入力として提供される」という要件に準拠しています。

n;main(c){for(;;){c=getchar(),n=getchar()-48;while(n--)putchar(c);}}

「int」をドロップし、mainのパラメーターとしてcとnを宣言することで文字を削り、while(1)の代わりにfor(;;)を使用し、最後にさらに内側のwhileループにブレースをドロップすることで文字を削ることができます。
スタンデュッデ

ありがとう、@ Stuntddude!ループとブレースの提案を適用しましたが、「mainのパラメーターとしてcとnを宣言する」ことに苦労しています。それでも、これは3文字を削りました。乾杯。
ダレンストーン

main()は関数であるため、次のようなパラメーターを指定できmain(c,n){ ... }ます。プログラムの実行時にデフォルトで1が渡されます。
スタンデュッド

ありがとう@Stuntddude。私はそれを認識しており、最初のint引数を利用error: second parameter of 'main' (argument array) must be of type 'char **'できますが、私が使用するコンパイラは文句を言うので、私は逃げることができませんmain(c,n); を使用する必要がありますmain(int c,char **n)。プラットフォームまたはgccの可能性があります。
ダレンストーン

私のコンパイラーでできることはできますがn;main(c)、できませんmain(n,c)-十分です!:)
ダレンストーン

2

Haskell、58 56文字

f[]=[]
f(x:y:s)=replicate(read[y])x++f s
main=interact$f

何でもゴルフをするという私の最初の本当の試みなので、おそらくここでいくつかの改善がなされるでしょう。


1
read[y]2つの文字セーブ
MtnViewMark

@MtnViewMarkありがとう。私はそれを置く。
シルビオMayolo

私はこれのために57バイトを得ていますか?あなたは置き換えることができreplicate x y[1..x]>>[y]。したがって、2行目をに置き換えるとf(x:y:s)=(['1'..y]>>[x])++f s、53バ​​イトになります。
アンス

2

ジャプト -P、8バイト

文字の配列として入力し、文字列として出力します。

ò crÈpY°

それを試してみてください

ò crÈpYn     :Implicit input of character array
ò            :Groups of 2
   r         :Reduce each pair
    È        :By passing them through the following function as [X,Y]
     p       :  Repeat X
      Yn     :    Y, converted to an integer, times
             :Implicitly join and output

ああ、C R E EPY!
Khuldraeseth na'Barya

@ Khuldraesethna'Barya、ò crÏ°îX不気味すぎると感じるかもしれません!
シャギー

2

Malbolge Unshackled(20トリットローテーションバリアント)、4,494e6バイト

この回答のサイズは投稿可能な最大プログラムサイズ(eh)を超えているため、コードはGitHubリポジトリにあります

これを実行するには?

素朴なHaskellインタープリターはこれを実行するのに年齢を重ねるので、これは難しい部分かもしれません。TIOにはまともなMalbogle Unshackledインタプリタがありますが、残念ながら私はそれを使用できません(制限)。

私が見つけることができる最高のものは、1時間あたり360バイトの圧縮を解除する非常に優れたパフォーマンスの固定20トリット回転幅バリアントです。

インタープリターを少し速くするために、Matthias LutterのMalbolge Unshackledインタープリターからすべてのチェックを削除しました。

変更したバージョンは、約6,3%高速に実行できます。

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char* translation = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72Fh"
        "OA1CB6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@";

typedef struct Word {
    unsigned int area;
    unsigned int high;
    unsigned int low;
} Word;

void word2string(Word w, char* s, int min_length) {
    if (!s) return;
    if (min_length < 1) min_length = 1;
    if (min_length > 20) min_length = 20;
    s[0] = (w.area%3) + '0';
    s[1] = 't';
    char tmp[20];
    int i;
    for (i=0;i<10;i++) {
        tmp[19-i] = (w.low % 3) + '0';
        w.low /= 3;
    }
    for (i=0;i<10;i++) {
        tmp[9-i] = (w.high % 3) + '0';
        w.high /= 3;
    }
    i = 0;
    while (tmp[i] == s[0] && i < 20 - min_length) i++;
    int j = 2;
    while (i < 20) {
        s[j] = tmp[i];
        i++;
        j++;
    }
    s[j] = 0;
}

unsigned int crazy_low(unsigned int a, unsigned int d){
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    int position = 0;
    unsigned int output = 0;
    while (position < 10){
        unsigned int i = a%3;
        unsigned int j = d%3;
        unsigned int out = crz[i+3*j];
        unsigned int multiple = 1;
        int k;
        for (k=0;k<position;k++)
            multiple *= 3;
        output += multiple*out;
        a /= 3;
        d /= 3;
        position++;
    }
    return output;
}

Word zero() {
    Word result = {0, 0, 0};
    return result;
}

Word increment(Word d) {
    d.low++;
    if (d.low >= 59049) {
        d.low = 0;
        d.high++;
        if (d.high >= 59049) {
            fprintf(stderr,"error: overflow\n");
            exit(1);
        }
    }
    return d;
}

Word decrement(Word d) {
    if (d.low == 0) {
        d.low = 59048;
        d.high--;
    }else{
        d.low--;
    }
    return d;
}

Word crazy(Word a, Word d){
    Word output;
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    output.area = crz[a.area+3*d.area];
    output.high = crazy_low(a.high, d.high);
    output.low = crazy_low(a.low, d.low);
    return output;
}

Word rotate_r(Word d){
    unsigned int carry_h = d.high%3;
    unsigned int carry_l = d.low%3;
    d.high = 19683 * carry_l + d.high / 3;
    d.low = 19683 * carry_h + d.low / 3;
    return d;
}

// last_initialized: if set, use to fill newly generated memory with preinitial values...
Word* ptr_to(Word** mem[], Word d, unsigned int last_initialized) {
    if ((mem[d.area])[d.high]) {
        return &(((mem[d.area])[d.high])[d.low]);
    }
    (mem[d.area])[d.high] = (Word*)malloc(59049 * sizeof(Word));
    if (!(mem[d.area])[d.high]) {
        fprintf(stderr,"error: out of memory.\n");
        exit(1);
    }
    if (last_initialized) {
        Word repitition[6];
        repitition[(last_initialized-1) % 6] =
                ((mem[0])[(last_initialized-1) / 59049])
                    [(last_initialized-1) % 59049];
        repitition[(last_initialized) % 6] =
                ((mem[0])[last_initialized / 59049])
                    [last_initialized % 59049];
        unsigned int i;
        for (i=0;i<6;i++) {
            repitition[(last_initialized+1+i) % 6] =
                    crazy(repitition[(last_initialized+i) % 6],
                        repitition[(last_initialized-1+i) % 6]);
        }
        unsigned int offset = (59049*d.high) % 6;
        i = 0;
        while (1){
            ((mem[d.area])[d.high])[i] = repitition[(i+offset)%6];
            if (i == 59048) {
                break;
            }
            i++;
        }
    }
    return &(((mem[d.area])[d.high])[d.low]);
}

unsigned int get_instruction(Word** mem[], Word c,
        unsigned int last_initialized,
        int ignore_invalid) {
    Word* instr = ptr_to(mem, c, last_initialized);
    unsigned int instruction = instr->low;
    instruction = (instruction+c.low + 59049 * c.high
            + (c.area==1?52:(c.area==2?10:0)))%94;
    return instruction;
}

int main(int argc, char* argv[]) {
    Word** memory[3];
    int i,j;
    for (i=0; i<3; i++) {
        memory[i] = (Word**)malloc(59049 * sizeof(Word*));
        if (!memory) {
            fprintf(stderr,"not enough memory.\n");
            return 1;
        }
        for (j=0; j<59049; j++) {
            (memory[i])[j] = 0;
        }
    }
    Word a, c, d;
    unsigned int result;
    FILE* file;
    if (argc < 2) {
        // read program code from STDIN
        file = stdin;
    }else{
        file = fopen(argv[1],"rb");
    }
    if (file == NULL) {
        fprintf(stderr, "File not found: %s\n",argv[1]);
        return 1;
    }
    a = zero();
    c = zero();
    d = zero();
    result = 0;
    while (!feof(file)){
        unsigned int instr;
        Word* cell = ptr_to(memory, d, 0);
        (*cell) = zero();
        result = fread(&cell->low,1,1,file);
        if (result > 1)
            return 1;
        if (result == 0 || cell->low == 0x1a || cell->low == 0x04)
            break;
        instr = (cell->low + d.low + 59049*d.high)%94;
        if (cell->low == ' ' || cell->low == '\t' || cell->low == '\r'
                || cell->low == '\n');
        else if (cell->low >= 33 && cell->low < 127 &&
                (instr == 4 || instr == 5 || instr == 23 || instr == 39
                    || instr == 40 || instr == 62 || instr == 68
                    || instr == 81)) {
            d = increment(d);
        }
    }
    if (file != stdin) {
        fclose(file);
    }
    unsigned int last_initialized = 0;
    while (1){
        *ptr_to(memory, d, 0) = crazy(*ptr_to(memory, decrement(d), 0),
                *ptr_to(memory, decrement(decrement(d)), 0));
        last_initialized = d.low + 59049*d.high;
        if (d.low == 59048) {
            break;
        }
        d = increment(d);
    }
    d = zero();

    unsigned int step = 0;
    while (1) {
        unsigned int instruction = get_instruction(memory, c,
                last_initialized, 0);
        step++;
        switch (instruction){
            case 4:
                c = *ptr_to(memory,d,last_initialized);
                break;
            case 5:
                if (!a.area) {
                    printf("%c",(char)(a.low + 59049*a.high));
                }else if (a.area == 2 && a.low == 59047
                        && a.high == 59048) {
                    printf("\n");
                }
                break;
            case 23:
                a = zero();
                a.low = getchar();
                if (a.low == EOF) {
                    a.low = 59048;
                    a.high = 59048;
                    a.area = 2;
                }else if (a.low == '\n'){
                    a.low = 59047;
                    a.high = 59048;
                    a.area = 2;
                }
                break;
            case 39:
                a = (*ptr_to(memory,d,last_initialized)
                        = rotate_r(*ptr_to(memory,d,last_initialized)));
                break;
            case 40:
                d = *ptr_to(memory,d,last_initialized);
                break;
            case 62:
                a = (*ptr_to(memory,d,last_initialized)
                        = crazy(a, *ptr_to(memory,d,last_initialized)));
                break;
            case 81:
                return 0;
            case 68:
            default:
                break;
        }

        Word* mem_c = ptr_to(memory, c, last_initialized);
        mem_c->low = translation[mem_c->low - 33];

        c = increment(c);
        d = increment(d);
    }
    return 0;
}

動いています!

It's working


2

05AB1E6 5 バイト

2ι`ÅΓ

@Grimyのおかげで-1バイト。

文字のリストとして出力します。

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

ランレングスデコードが組み込まれていない古い6 バイトの回答:

2ôε`×?

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

説明:

2ι      # Uninterleave the (implicit) input-string in two parts
        #  i.e. ":144,1'3" → [":4,'","1413"]
  `     # Push both separated to the stack
   ÅΓ   # Run-length decode
        #  i.e. ":4,'" and "1413" → [":","4","4","4","4",",","'","'","'"]
        # (after which the result is output implicitly)

2ô      # Split the (implicit) input-string into parts of size 2
        #  i.e. ":144,1'3" → [":1","44",",1","'3"]
  ε     # Loop over each of these pairs:
   `    #  Push both characters separated to the stack
    ×   #  Repeat the first character the digit amount of times as string
        #   i.e. "'" and "3" → "'''"
     ?  #  And print it without trailing newline

1
2ι`ÅΓ5バイトです。RLEビルトインがRLEチャレンジに勝てなかったら悲しいでしょう。
グリムミー

@Grimy Ah、それは本当に良いです、ありがとう!:)
ケビンクルーッセン

1

Python、78 72 66文字

d = raw_input()
print ""。join([x * int(d [i + 1])for i、x in enumerate(d)if〜i&1])

s = raw_input()
print ""。join(i * int(j)for i、j in zip(s [:: 2]、s [1 :: 2])))


1

J-24

;@(_2(<@#~".)/\])@1!:1 3

この投稿の目的は、中置副詞を使用することです。




1

Python 2、58

これは、Darren Stoneのpythonソリューション-イテレーターの乱用に触発されました!

x=iter(raw_input())
print''.join(a*int(next(x))for a in x)

これは私のオリジナルのソリューションです(60文字)

s=raw_input()
t=''
while s:t+=s[0]*int(s[1]);s=s[2:]
print t

別のアプローチは3文字長くなります:

f=lambda a,b,*x:a*int(b)+(x and f(*x)or'')
print f(raw_input())

1

Java:285文字

import java.util.Scanner;public class A{public static void main(String args[]){Scanner s = new Scanner(System.in);while(s.hasNext()){String t=s.next();for(int i=0;i<t.length();i++) {for(int j=0; j<(Byte.valueOf(t.substring(i+1,i+2)));j++){System.out.print(t.substring(i,i+1));}i++;}}}}

メインの代わりに静的ブロックを使用し、Java6でコンパイルします!
Fabinout


1

空白、135

LSSSLSSSSLSLSTLTSTTTSLSSSSTSSSSLTSSTLTTTTLSSSSLSLSTLTSTTTSSSTTSSSSLTSSTLSSSSLSLSLTSTLSSSTLTSSTSTSSTLTLSSLSLSSLLSSTLSLLSLLLSLSLLSSTTLLLL

(S、T、Lをスペース、タブ、改行文字に置き換えます。)

オンラインで試してみてください[こちら]

説明:

"assembly"      whitespace                                      stack
----------      ----------                                      -----
s:              LSS SL      ;input loop                         []
    push 0      SS SSL                                          [0]
    dup         SLS                                             [0,0]
    getc        TLTS        ;input & store char c               [0]
    rcl         TTT         ;recall c                           [c]
    dup         SLS                                             [c,c]
    push 16     SS STSSSSL                                      [c,c,16]
    sub         TSST                                            [c,c-16]
    jlt  tt     LTT TTL     ;exit if ord(c) < 16                [c]       
    push 0      SS SSL                                          [c,0]
    dup         SLS                                             [c,0,0]
    getc        TLTS        ;input & store char n               [c,0]
    rcl         TTT         ;recall n                           [c,n]
    push 48     SS STTSSSSL ;convert n to m = ord(n)-ord('0')   [c,n,48]
    sub         TSST                                            [c,m]

ss:             LSS SSL     ;inner loop outputs c, m times      [c,m]
    dup         SLS                                             [c,m,m]
    jeq  t      LTS TL      ;if m==0, stop outputting this c    [c,m]
    push 1      SS STL      ;otherwise decr m                   [c,m,1]
    sub         TSST                                            [c,m-1]
    copy 1      STS STL     ;copy c to tos                      [c,m-1,c]
    putc        TLSS        ;output this c                      [c,m-1]
    jmp  ss     LSL SSL     ;loop back to output this c again   [c,m-1]

t:              LSS TL                                          [c,m]
    pop         SLL                                             [c]
    pop         SLL                                             []
    jmp  s      LSL SL      ;loop back to get the next c,n      []

tt:             LSS TTL                                         [c]
    end         LLL         ;exit

1

クロージュア(107)

(pr(apply str(map #(apply str(repeat(Integer/parseInt(str(second %)))(first %)))(partition 2(read-line)))))

これはClojureであるために非常に長いと感じています。誰かがもっとうまくできるなら、それを投稿してください。


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