Jalankan Decoding Panjang

20

Tulis kode terpendek dalam bahasa pilihan Anda untuk melakukan decoding panjang run dari string yang diberikan.

String akan diberikan sebagai input pada stdin dalam formulir

CNCNCNCNCNCNCNCN

di mana masing C- masing dapat berupa karakter ASCII yang dapat dicetak dan masing-masing Ndigit 1untuk 9(inklusif).

Input sampel:

:144,1'1

Output yang sesuai:

:4444,'
Pria pengkodean
sumber

Jawaban:

28

Brainfuck, 34 karakter

,[>,>++++++[<-------->-]<[<.>-]<,]
alephalpha
sumber
5
Wow. Solusi brainfuck yang dapat bersaing dengan solusi lain?
Johannes Kuhn
13

Bahasa Pemrograman Shakespeare , 406 byte

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

Versi tidak disatukan:

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]

Saya menggunakan kompiler Python SPL drsam94 , yang memiliki beberapa bug (itulah sebabnya, misalnya, saya gunakan Open your mindsebagai ganti Open thy minddalam versi golf).

Untuk menjalankan program ini, gunakan:

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

Bagaimana itu bekerja

SPL adalah bahasa pemrograman esoteris yang dirancang untuk membuat program terlihat seperti drama Shakespeare. Ini dilakukan dengan menggunakan karakter sebagai variabel, dan pemrosesan dilakukan dengan meminta karakter mengatakan sesuatu satu sama lain.

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

Ini adalah judul drama; itu diabaikan oleh kompiler.

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

Di sini kita mendeklarasikan variabel yang digunakan di sisa program. Semuanya antara ,dan .diabaikan oleh kompiler. Dalam kasus ini, kami mendeklarasikan Romeo, digunakan untuk menahan karakter yang sedang diterjemahkan, dan Juliet, digunakan untuk menahan panjang run karakter.

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

Di sini kami menyatakan tindakan pertama dan satu-satunya dalam program ini. Kisah dan adegan seperti label; mereka dapat dilompati kapan saja dengan menggunakan let us return to scene IIatau beberapa varian itu. Kami hanya menggunakan satu tindakan, karena itu cukup untuk kebutuhan kita. Sekali lagi, apa pun di antara :dan .diabaikan oleh kompiler.

Scene I: A silent entrance.

Di sini kita mendeklarasikan adegan pertama. Adegan diberi nomor dalam angka Romawi: yang pertama adalah Scene I, yang kedua Scene II, dan seterusnya.

[Enter Romeo and Juliet]

Ini adalah arah panggung; di dalamnya, kita memberi tahu Romeodan Julietvariabel untuk datang ke "panggung". Hanya dua variabel yang bisa berada di "panggung" sekaligus; tahap ini digunakan sehingga kompiler dapat mengetahui variabel mana yang menangani yang mana ketika mereka berbicara. Karena kami hanya memiliki dua variabel, Romeo dan Juliet akan tetap di atas panggung selama jangka waktu program.

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

Deklarasi adegan lain. Adegan II akan dilompat ke untuk memecahkan kode run-length lain.

Juliet:

Bentuk pernyataan ini berarti bahwa Juliet akan mulai berbicara. Segala sesuatu sampai Romeo:deklarasi panggung, adegan, atau adegan / tindakan selanjutnya akan menjadi garis yang diucapkan oleh Juliet, dan dengan demikian "aku" akan merujuk ke Juliet, "kamu" / "kamu" ke Romeo, dll.

Open your mind.

Perintah ini menyimpan nilai ordinal karakter tunggal dari STDIN di Romeo.

Is my mother jollier than thou?

Dalam SPL, kata benda diterjemahkan menjadi 1 atau -1 tergantung pada apakah mereka positif atau negatif. Dalam hal ini, my motherditerjemahkan menjadi 1. Kata sifat (positif atau negatif) kalikan kata benda mereka dengan 2.

Ini adalah sebuah pertanyaan; di dalamnya, Juliet bertanya apakah my mother(AKA 1) "jollier" daripada Romeo. Komparatif dapat diterjemahkan menjadi less than(jika negatif, suka worse) atau greater than(jika positif, suka jollier). Oleh karena itu, pertanyaan ini sampai pada Is 1 greater than you?.

Alasan kami mengajukan pertanyaan ini adalah untuk mendeteksi akhir input. Karena nilai EOFbervariasi berdasarkan platform, tetapi biasanya kurang dari 1, kami menggunakan ini untuk mendeteksinya.

If so, we must proceed to scene IV.

Jika pertanyaan sebelumnya dievaluasi true, kita beralih ke adegan IV — yang hanyalah akhir dari program. Singkatnya, jika kami mendeteksi EOF, kami mengakhiri program.

Romeo:

Sekarang kalimat Romeo: "aku" dan "kamu" masing-masing merujuk ke Romeo dan Juliet.

Open your mind.

Sekali lagi, pernyataan ini menempatkan nilai ordinal dari satu karakter dari STDIN ke Juliet, yang dalam hal ini adalah run-length dari karakter yang disimpan 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!

Yang ini terlalu lama untuk dibahas dengan sangat terperinci, tetapi percayalah pada saya yang diterjemahkan Juliet -= 48. Kami melakukan ini karena Juliet memegang nilai ASCII dari suatu angka, dan ord('0') == 48; dalam mengurangi 48, kita menerjemahkan dari nilai ASCII dari angka ke angka itu sendiri.

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

Deklarasi adegan lain. Yang ini untuk loop di mana kita berulang kali mencetak nilai karakter Romeo, Julietkali.

Juliet:
  Speak thy mind.

Pernyataan ini menyebabkan Romeo mencetak nilainya sebagai karakter; artinya, nilai karakter apa pun yang sebelumnya disimpan di Romeo sekarang menjadi keluaran.

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

Babi adalah kata benda negatif, jadi a hogditerjemahkan menjadi -1; Oleh karena itu, pernyataan ini dievaluasi untuk Juliet -= 1.

Art thou as rotten as nothing?

Romeo di sini bertanya apakah Juliet "sama busuknya", atau sama dengan, 0.

If so, let us return to scene II.

Jika nilai Juliet adalah 0, kita kembali ke adegan II untuk memecahkan kode run-length karakter lain.

Let us return to scene III.

Lain lagi, kita kembali ke adegan III untuk menampilkan karakter Romeo lagi.

Scene IV: Finale.

[Exeunt]

Deklarasi adegan terakhir ini hanyalah penanda untuk akhir program. The [Exeunt]arah panggung yang diperlukan untuk mendapatkan compiler untuk benar-benar menghasilkan adegan akhir.

Tembaga
sumber
6

GolfScript, 10 karakter

2/{1/~~*}/
Howard
sumber
5

perl, 27 karakter

print<>=~s/(.)(.)/$1x$2/ger
John Dvorak
sumber
Hal ini tampaknya tidak perlu verbose: print<>=~s/(.)(.)/$1x$2/ger. Saya juga cukup yakin maksud Anda $1x$2, dan bukan sebaliknya.
Primo
@rimo true - Saya tidak tahu tentang bendera r dan saya tidak bisa menemukannya. Terima kasih. Adapun bagian lain - maaf, saya salah membaca spec. Saya akan mengedit ketika saya bisa.
John Dvorak
BTW /rdidokumentasikan dalam perlop dan ditambahkan dalam v5.14.0
psxls
Menggunakan -pbendera membiarkan Anda jatuh printdan <>, jadi jawabannya akan menjadi sederhana: s/(.)(.)/$1x$2/ge-> 17chars +1 for -p-> 18 .
F. Hauri
4

R 67

x=strsplit(readline(),"")[[1]];cat(rep(x[c(T,F)],x[c(F,T)]),sep="")
flodel
sumber
+1 Saya tidak tahu repakan memaksa timesargumen dari karakter ke integer secara otomatis. Cemerlang.
plannapus
4

Python 3, 52

Python 3 memungkinkan saya untuk menggabungkan pendekatan dua solusi python2 saya.

s=input()
t=''
while s:a,b,*s=s;t+=a*int(b)
print(t)
stan
sumber
Python 2 raw_inputcocok dengan Python 3 input. Jadi baris pertama harus olehs=input()
AMK
1
49:s=input() while s:a,b,*s=s;print(a*int(b),end='')
Cees Timmerman
46 byte
movatica
3

APL (22)

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

Penjelasan:

  • T←⍞: simpan input dalam T
  • T⊂⍨~⎕D∊⍨T: pisahkan Tkarakter-karakter yang bukan digit
  • : 2ubah menjadi -by- N/2matrix
  • {⍺/⍨⍎⍵}/: pada setiap baris dari matriks ( /), mereplikasi ( /) karakter pertama ( ) dengan eval ( ) dari karakter kedua ( )
  • ,/: menyatukan output dari setiap baris
marinus
sumber
3

Ruby, 30 byte

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

27 byte kode + 3 byte untuk menjalankannya dengan -pflag:

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

8086 perakitan, 106 98 karakter

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

Jika angkanya sebelum karakter dalam aliran input, dua baris (18 karakter) dapat dicukur.

Mike C
sumber
Baru saja menghapus "mov ah, 8" yang berlebihan
Mike C
2
Anda harus memposting hitungan byte yang dikompilasi daripada hitungan char assembler kami. Aturan penyalahgunaan FTW
arrdem
Bagaimana dengan dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b453 karakter? Saya tidak melihat di mana ia menangani karakter non-huruf besar atau bahkan ...
Jason Goemaat
arrdem: Ide bagus. Saya bertanya-tanya apakah itu melanggar aturan jika saya memasangnya di hex editor. Saya masih akan langsung menulis kode, hanya pada tingkat yang lebih rendah daripada sumber asm. :) Jason: Saya tidak melihat apa pun tentang EOF dalam aturan. Ini stdin, tekan saja ctrl-c untuk menghentikannya. Juga mengapa tidak menangani huruf kecil?
Mike C
Umumnya kode mesin dihitung oleh jumlah byte dibandingkan dengan jumlah kode sumber untuk bahasa yang ditafsirkan atau dikompilasi, karena sebenarnya tidak ada alternatif yang masuk akal.
Joe 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

Perlu dijalankan dengan -rbendera
Dapat dikurangi menjadi 110 + 2 dengan mengganti \vdengan yang tidak patut 0x0Bdan \adengan0x07

Hasturkun
sumber
+1 ( \2.{9}adalah ide bagus) luar biasa!
F. Hauri
2

C, 65 karakter

Mendapat input sebagai parameter.

main(p,v)char*p,**v;{
    for(p=v[1];*p;--p[1]<49?p+=2:0)putchar(*p);
}
ugoren
sumber
Aku tidak bisa melewati ini dengan gcc: error: first parameter of 'main' (argument count) must be of type 'int'. Apakah ada saklar baris perintah?
Darren Stone
@ DarrenStone, kode ini tidak 100% sesuai standar. Saya tidak menggunakan parameter pertama sebagai parameter, jadi tipenya tidak masalah. Kebanyakan penyusun tidak begitu keberatan.
ugoren
Ok terima kasih. Saya iri dengan kompiler golf-friendly Anda! :)
Darren Stone
2

Perl, 19 18 karakter

perl -pe 's/(.)(.)/$1x$2/ge'

Aturan untuk menghitung sakelar pada baris perintah ada di sini .

kotak roti
sumber
2

Keempat, 45 karakter

BEGIN KEY KEY 48 - 0 DO DUP EMIT LOOP 0 UNTIL

Diuji dengan pforth pada OS X.

Darren Stone
sumber
2

Python, 63 62 karakter

print''.join([c*int(n)for c,n in zip(*[iter(raw_input())]*2)])
Darren Stone
sumber
Trik yang bagus dengan iteritu ... Saya pikir saya akan menggunakannya sendiri!
stan
2

Windows PowerShell, 55 karakter

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

Saya mendapatkan perasaan bahwa ini bisa diturunkan lebih, terutama dengan gips dari char ke string dan int, tetapi saya tidak punya waktu untuk terus mengerjakannya sekarang.

goric
sumber
2

C, 68 karakter

@ ugoren jawaban dalam C sedikit lebih pendek, tetapi jawaban ini sesuai dengan persyaratan bahwa "string akan diberikan sebagai input pada stdin ."

n;main(c){for(;;){c=getchar(),n=getchar()-48;while(n--)putchar(c);}}
Darren Stone
sumber
Anda dapat mencukur karakter dengan menjatuhkan "int" dan mendeklarasikan c dan n sebagai parameter utama, yang lain dengan menggunakan untuk (;;) alih-alih sementara (1), dan akhirnya dua lagi dengan menjatuhkan kawat gigi pada loop sementara yang paling dalam.
Stuntddude
Terima kasih, @Stuntddude! Saya menerapkan saran loop dan brace, tapi saya berjuang dengan "menyatakan c dan n sebagai parameter utama". Namun, ini mencukur 3 karakter. Tepuk tangan.
Darren Stone
Karena main () adalah fungsi, Anda dapat memberikan parameternya, seperti: main(c,n){ ... }yang akan diteruskan 1 secara default saat program dijalankan.
Stuntddude
Terima kasih @Stuntddude. Saya sadar akan hal itu dan dapat mengambil keuntungan dari intarg 1 , tetapi kompiler (s) saya menggunakan komplain error: second parameter of 'main' (argument array) must be of type 'char **'sehingga saya tidak bisa lolos main(c,n); Saya harus menggunakan main(int c,char **n). Bisa jadi platform atau gcc.
Darren Stone
Kompiler saya memungkinkan saya melakukannya n;main(c)tetapi tidak main(n,c)- cukup baik! :)
Darren Stone
2

Haskell, 58 56 karakter

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

Upaya nyata pertama saya dalam bermain golf apa pun, jadi mungkin ada beberapa perbaikan yang harus dilakukan di sini.

Silvio Mayolo
sumber
1
read[y]menyimpan dua karakter
MtnViewMark
@MtnViewMark Terima kasih. Saya memasukkannya.
Silvio Mayolo
Saya mendapatkan 57 byte untuk ini? Anda bisa menggantinya replicate x ydengan [1..x]>>[y]. Dengan demikian, baris kedua Anda dapat diganti f(x:y:s)=(['1'..y]>>[x])++f s, yang membuatnya menjadi 53 byte.
Angs
2

Japt -P , 8 byte

Input sebagai array karakter, output sebagai string.

ò crÈpY°

Cobalah

ò 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
Shaggy
sumber
Oh, c r e Epy!
Khuldraeseth na'Barya
@ Khuldraesethna'Barya, bisa juga ò crÏ°îXjika Anda merasa terlalu menyeramkan!
Shaggy
2

Malbolge Unshackled (varian rotasi 20-trit), 4,494e6 byte

Ukuran jawaban ini melebihi ukuran program maksimum yang dapat diposkan (eh), jadi kodenya terletak di repositori GitHub saya .

Bagaimana cara menjalankannya?

Ini mungkin bagian yang sulit, karena juru bahasa Haskell yang naif akan membutuhkan waktu lama untuk menjalankannya. TIO memiliki juru bahasa Malbogle Unshackled yang layak, tetapi sayangnya saya tidak akan dapat menggunakannya (batasan).

Yang terbaik yang bisa saya temukan adalah varian lebar rotasi 20-trit, yang berkinerja sangat baik, mendekompresi 360 byte per jam .

Untuk membuat penerjemah sedikit lebih cepat, saya telah menghapus semua cek dari penerjemah Malbolge Unshackled milik Matthias Lutter.

Versi modifikasi saya dapat berjalan sekitar 6,3% lebih cepat.

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

Bekerja!

Bekerja

Krzysztof Szewczyk
sumber
2

05AB1E , 6 5 byte

2ι`ÅΓ

-1 byte terima kasih kepada @Grimy .

Output sebagai daftar karakter.

Cobalah online.

Jawaban 6 byte lama tanpa built-length decode builtin:

2ôε`×?

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
1
2ι`ÅΓadalah 5 byte. Akan sedih jika built-in RLE tidak memenangkan tantangan RLE.
Grimmy
@ Grimy Ah, itu memang lebih baik, terima kasih! :)
Kevin Cruijssen
1

Python, 78 72 66 char

d = raw_input ()
print "". join ([x * int (d [i + 1]) untuk i, x dalam penghitungan (d) jika ~ i & 1])

s = raw_input ()
print "". join (i * int (j) untuk i, j in zip (s [:: 2], s [1 :: 2])))
Pria pengkodean
sumber
1

GolfScript (10 karakter)

2/{)15&*}/
Peter Taylor
sumber
1

J - 24

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

Inti dari pengajuan ini adalah untuk menggunakan keterangan infix.

jpjacobs
sumber
1

Befunge, 49 karakter

>~:25*-      v
$>\1-:v:-*68~_@
$^ ,:\_v
^      <
Saeedn
sumber
1

K, 35

{,/(#).'|:'"*I"$/:(2*!-_-(#x)%2)_x}
tmartin
sumber
,/{(. y)#x}.'0N 2#selama 18 byte .
streetster
1

Python 2, 58

Ini terinspirasi oleh solusi python Darren Stone - penyalahgunaan iterator!

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

Ini adalah solusi asli saya (60 karakter)

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

Pendekatan yang berbeda adalah 3 karakter lebih lama:

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

Jawa: 285 charas

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++;}}}}
masterX244
sumber
Gunakan blok statis bukan utama, dan kompilasi dengan Java6!
Fabinout
1

Befunge-98, 22 karakter

>#@~~"0"-v
^#:\,:\-1<_
FireFly
sumber
1

Spasi, 135

LSSSLSSSSLSLSTLTSTTTSLSSSSTSSSSLTSSTLTTTTLSSSSLSLSTLTSTTTSSSTTSSSSLTSSTLSSSSLSLSLTSTLSSSTLTSSTSTSSTLTLSSLSLSSLLSSTLSLLSLLLSLSLLSSTTLLLL

(Ganti S, T, L dengan Spasi, Tab, karakter Linefeed.)

Cobalah online [di sini] .

Penjelasan:

"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
res
sumber
1

Clojure (107)

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

Ini terasa sangat lama untuk menjadi Clojure, jika seseorang dapat melakukan yang lebih baik, silakan posting.

Kepala sekolahpanggilan
sumber
60 atau 73 byte di codegolf.stackexchange.com/a/188823/59617 ;)
NikoNyrh