Запустити розшифровку довжини


20

Напишіть найкоротший код на обраній вами мові, щоб виконати розшифровку довжини виконання заданого рядка.

Рядок буде наданий у вигляді вводу на stdin у формі

CNCNCNCNCNCNCNCN

де кожен Cможе бути будь-яким символом для друку ASCII, а кожен N- цифрою 1до 9(включно).

Зразок введення:

:144,1'1

Відповідний вихід:

:4444,'

Відповіді:



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]

Я використовую компілятор Python SPL drsam94 , у якого є кілька помилок (саме тому, наприклад, я використовую 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.

Тут ми оголошуємо змінні, які використовуються в решті програми. Все відбувається ,і .ігнорується компілятором. У цьому випадку ми оголошуємо Romeo, що використовується для утримання символу, який декодується, і Juliet, що використовується для утримання довжини пробігу символу.

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

Тут ми оголошуємо перший і єдиний акт програми. Дії та сцени - як бирки; їх можна перейти в будь-який час, використовуючи let us return to scene IIчи інший варіант цього. Ми використовуємо лише один вчинок, оскільки це достатньо для наших потреб. Знову ж таки, що між ними :і .компілятор ігнорується.

Scene I: A silent entrance.

Тут ми оголошуємо першу сцену. Сцени пронумеровані римськими цифрами: перший є Scene I, другий Scene IIтощо.

[Enter Romeo and Juliet]

Це сценічний напрямок; в ньому ми повідомляємо, Romeoі Julietзмінні повинні вийти на "етап". Лише дві змінні можуть бути одразу на "сцені"; етап використовується для того, щоб компілятор міг зрозуміти, до якої змінної звертається, до якої, коли вони говорять. Оскільки у нас є лише дві змінні, Ромео і Джульєтта залишаться на сцені протягом тривалості програми.

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 motherперекладається на 1. Прикметники (позитивні чи негативні) множать свій іменник на 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 в Джульєтту, що в даному випадку є довжиною пробігу символу, що зберігається в 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.

Ще одна декларація сцени. Цей для циклу, в якому ми неодноразово друкуємо значення символів Romeo, Julietразів.

Juliet:
  Speak thy mind.

Це твердження змушує Ромео друкувати його значення як персонажа; тобто будь-яке значення символу раніше зберігалося в Ромео, тепер виводиться.

Romeo:
  Thou art the sum of thyself and a 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 правда - я не знав про r прапор і не зміг його знайти. Спасибі. Щодо іншої частини - вибачте, я неправильно прочитав специфікацію. Я редагую, коли зможу.
Джон Дворак

BTW /rзадокументовано в перлопі та додано у v5.14.0
psxls

Використовуючи -pпрапор, ви можете скинути printі <>, тому відповідь стане просто: s/(.)(.)/$1x$2/ge-> 17chars +1 for -p-> 18 .
Ф. Хаурі

4

R 67

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

+1 Я не мав ідеї rep, що timesаргумент від символів до цілих чисел буде автоматично примусований . Блискуча.
планнапус

4

Пітон 3, 52

Python 3 дозволяє мені об'єднати підходи двох моїх рішень python2.

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

Python 2 raw_inputвідповідає Python 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∊⍨T: розділити Tна символи, які не цифри
  • : перетворити його на 2-by- N/2матрицю
  • {⍺/⍨⍎⍵}/: у кожному рядку матриці ( /), повторити ( /) перший символ ( ) на знак eval ( ) другого символу ( )
  • ,/: об'єднати вихід кожного ряду

3

Рубін, 30 байт

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

27 байт коду + 3 байти, щоб запустити його -pпрапором:

$ 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

Якщо цифри були перед символами у вхідному потоці, два рядки (18 символів) могли бути відточені від цього.


Щойно видалили зайвий "mov ah, 8"
Майк C

2
Ви повинні розміщувати складене число байтів, а не наш номер асемблера. Правила зловживають FTW
arrdem

А як щодо dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b453 символів? Я не бачу, де він обробляє
непомітні

arrdem: Гарна ідея. Цікаво, чи це навіть порушує правила, якщо я вручну збираю його в шестигранному редакторі. Я б все-таки безпосередньо писав код, лише на нижчому рівні, ніж джерело ASM. :) Джейсон: Я нічого не бачу про правила EOF у правилах. Це stdin, просто натисніть 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та \aна0x07


+1 ( \2.{9}це чудова ідея) чудовий!
Ф. Хаурі

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% стандарту. Я не використовую перший параметр як параметр, тому його тип не має значення. Більшість компіляторів не так сильно проти.
ugoren

Добре, дякую. Я заздрю ​​вашому компілятору-гольфу! :)
Даррен Стоун

2

Perl, 19 18 символів

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

Правила підрахунку комутаторів у командному рядку тут .




2

Windows PowerShell, 55 символів

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

У мене виникає відчуття, що це можна відіграти ще більше, зокрема з ролях від char до string та int, але я не маю часу продовжувати працювати над цим зараз.


2

C, 68 символів

Відповідь @ ugoren на C трохи коротша, але ця відповідь відповідає вимозі, що "рядок буде наданий як вхід на stdin ."

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

Ви можете голити символ, скинувши "int" і оголосивши c і n як параметри головного, інший, використовуючи для (;;) замість while (1), і нарешті ще два, скинувши дужки на внутрішню петлю.
Stuntddude

Дякую, @Stuntddude! Я застосував пропозиції циклу та дужки, але я борюся з "оголошенням c і n як параметрів основних". Все-таки це поголене 3 ч. Ура.
Даррен Стоун

Оскільки main () є функцією, ви можете надати їй параметри, наприклад: main(c,n){ ... }який буде переданий за замовчуванням 1, коли програма запускається.
Stuntddude

Дякуємо @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

Хаскелл, 58 56 символів

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

Моя перша реальна спроба займатися гольфом чим завгодно, тому, мабуть, тут слід зробити щось покращення.


1
read[y]зберігає два символи
MtnViewMark

@MtnViewMark Дякую Я поклав це.
Сільвіо Майоло

Я отримую за це 57 байт? Ви можете замінити replicate x yна [1..x]>>[y]. Таким чином, ваш другий рядок можна замінити на f(x:y:s)=(['1'..y]>>[x])++f s, що зводить його до 53 байт.
Ангс

2

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

О, з т е EPY!
Khuldraeseth na'Barya

@ Khuldraesethna'Barya, це також може бути, ò crϰîXякщо ти вважаєш себе занадто моторошним!
Кудлатий

2

Malbolge Неперероблений (варіант обертання на 20 тріт), 4,494e6 байт

Розмір цієї відповіді перевищує максимальний розмір програми, що висилається (eh), тому код знаходиться у моєму сховищі GitHub .

Як це запустити?

Це може бути складним, тому що наївний перекладач Хаскелла віками буде віком для цього. TIO має пристойного перекладача Malbogle Unshackled, але, на жаль, я не зможу ним користуватися (обмеження).

Найкраще, що я міг знайти, - це фіксований варіант ширини обертання на 20 тріт, який спрацьовує дуже добре, пригнічуючи 360 байт на годину .

Щоб зробити перекладача трохи швидшим, я видалив усі чеки з неперевершеного перекладача Мальтіаса Лютера.

Моя змінена версія може працювати на 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;
}

Це працює!

Це працює


2

05AB1E , 6 5 байт

2ι`ÅΓ

-1 байт завдяки @Grimy .

Виводи у вигляді списку символів.

Спробуйте в Інтернеті.

Старий 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.
Grimmy

@Grimy Ах, це справді краще, дякую! :)
Кевін Круїссен

1

Пітон, 78 72 66 char

d = raw_input ()
print "". приєднатися ([x * int (d [i + 1]) для i, x в перерахуванні (d), якщо ~ i & 1])

s = raw_input ()
print "". join (i * int (j) для i, j in zip (s [:: 2], s [1 :: 2]))


1

J - 24

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

Суть цього подання полягає у використанні прислівника-інфіксатора.




1

Пітон 2, 58

Це натхнене пітонним рішенням Даррена Стоун - зловживання ітератором!

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

Ява: 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.