Chạy giải mã chiều dài


20

Viết mã ngắn nhất bằng ngôn ngữ bạn chọn để thực hiện giải mã độ dài chạy của chuỗi đã cho.

Chuỗi sẽ được cung cấp làm đầu vào trên stdin dưới dạng

CNCNCNCNCNCNCNCN

trong đó mỗi Cthể là bất kỳ ký tự ASCII in và mỗi Nmột chữ số 1để 9(bao gồm).

Đầu vào mẫu:

:144,1'1

Đầu ra tương ứng:

:4444,'

Câu trả lời:


28

Brainfuck, 34 ký tự

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

5
Ồ Một giải pháp brainfuck có thể cạnh tranh với các giải pháp khác?
Julian Kuhn

13

Ngôn ngữ lập trình 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]

Phiên bản bị đánh cắp:

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]

Tôi đang sử dụng trình biên dịch Python SPL của drsam94 , có một vài lỗi (đó là lý do tại sao, ví dụ, tôi sử dụng Open your mindthay vì Open thy mindtrong phiên bản chơi gôn).

Để chạy chương trình này, sử dụng:

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

Làm thế nào nó hoạt động

SPL là một ngôn ngữ lập trình bí truyền được thiết kế để làm cho các chương trình trông giống như các vở kịch của Shakespeare. Nó thực hiện điều này bằng cách sử dụng các ký tự làm biến và việc xử lý được thực hiện bằng cách yêu cầu các ký tự nói với nhau.

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

Đây là tiêu đề của vở kịch; nó bị bỏ qua bởi trình biên dịch.

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

Ở đây chúng tôi khai báo các biến được sử dụng trong phần còn lại của chương trình. Tất cả mọi thứ betwen ,.được bỏ qua bởi trình biên dịch. Trong trường hợp này, chúng tôi khai báo Romeo, được sử dụng để giữ ký tự được giải mã và Juliet, được sử dụng để giữ độ dài chạy của ký tự.

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

Ở đây chúng tôi tuyên bố hành động đầu tiên và duy nhất trong chương trình. Hành vi và cảnh giống như nhãn hiệu; chúng có thể được nhảy tới bất cứ lúc nào bằng cách sử dụng let us return to scene IIhoặc một số biến thể của điều đó. Chúng tôi chỉ sử dụng một hành động, vì nó đủ cho nhu cầu của chúng tôi. Một lần nữa, bất cứ điều gì giữa :.được bỏ qua bởi trình biên dịch.

Scene I: A silent entrance.

Ở đây chúng tôi tuyên bố cảnh đầu tiên. Các cảnh được đánh số bằng chữ số La Mã: thứ nhất là Scene I, thứ hai Scene II, v.v.

[Enter Romeo and Juliet]

Đây là một hướng sân khấu; trong đó, chúng tôi nói RomeoJulietcác biến sẽ đi vào "giai đoạn". Chỉ có hai biến có thể ở trên "giai đoạn" cùng một lúc; giai đoạn được sử dụng để trình biên dịch có thể tìm ra biến nào được xử lý khi chúng nói. Bởi vì chúng tôi chỉ có hai biến, Romeo và Juliet sẽ ở trên sân khấu trong suốt thời gian của chương trình.

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

Một tuyên bố cảnh khác. Cảnh II sẽ được nhảy tới để giải mã một chiều dài khác.

Juliet:

Hình thức tuyên bố này có nghĩa là Juliet sẽ bắt đầu nói. Tất cả mọi thứ cho đến phần tiếp theo Romeo:, hướng sân khấu hoặc tuyên bố cảnh / hành động sẽ là một dòng được nói bởi Juliet, và do đó "tôi" sẽ đề cập đến Juliet, "bạn" / "ngươi" với Romeo, v.v.

Open your mind.

Lệnh này lưu trữ giá trị thứ tự của ký tự đơn từ STDIN trong Romeo .

Is my mother jollier than thou?

Trong SPL, danh từ dịch thành 1 hoặc -1 tùy thuộc vào việc chúng dương hay âm. Trong trường hợp này,my mother dịch sang 1. Tính từ (tích cực hoặc phủ định) nhân danh từ của chúng với 2.

Đây là một câu hỏi; trong đó, Juliet hỏi liệu my mother(AKA 1) có "vui nhộn" hơn Romeo không. So sánh hoặc dịch sang less than(nếu chúng là âm, như worse) hoặc greater than(nếu chúng là dương, nhưjollier ). Do đó, câu hỏi này sôi lên Is 1 greater than you?.

Lý do chúng tôi đặt câu hỏi này là để phát hiện sự kết thúc của đầu vào. Vì giá trị EOFthay đổi theo nền tảng, nhưng thường nhỏ hơn 1, chúng tôi sử dụng giá trị này để phát hiện nó.

If so, we must proceed to scene IV.

Nếu câu hỏi trước được đánh giá true, chúng ta sẽ chuyển sang cảnh IV, đó đơn giản là phần cuối của chương trình. Nói tóm lại, nếu chúng tôi phát hiện EOF, chúng tôi sẽ kết thúc chương trình.

Romeo:

Bây giờ, dòng của Romeo: "tôi" và "bạn" lần lượt đề cập đến Romeo và Juliet.

Open your mind.

Một lần nữa, tuyên bố này đặt giá trị thứ tự của một ký tự từ STDIN vào Juliet, trong trường hợp này là độ dài chạy của ký tự được lưu trữ 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!

Điều này quá dài để đi qua rất chi tiết, nhưng chỉ cần tin tưởng vào tôi mà nó dịch Juliet -= 48. Chúng tôi làm điều này bởi vì Juliet giữ giá trị ASCII của một chữ số và ord('0') == 48; trừ 48, chúng tôi dịch từ giá trị ASCII của một số sang chính số đó.

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

Một tuyên bố cảnh khác. Cái này là cho vòng lặp trong đó chúng tôi liên tục in giá trị ký tự của Romeo, Julietlần.

Juliet:
  Speak thy mind.

Tuyên bố này khiến Romeo in giá trị của mình như một nhân vật; nghĩa là, bất cứ giá trị ký tự nào trước đây được lưu trữ trong Romeo đều là đầu ra.

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

Một con heo là một danh từ phủ định, vì vậy a hogdịch thành -1; do đó, tuyên bố này ước tính Juliet -= 1.

Art thou as rotten as nothing?

Romeo ở đây hỏi Juliet có "thối như" hay bằng 0.

If so, let us return to scene II.

Nếu giá trị của Juliet là 0, chúng tôi sẽ quay lại cảnh II để giải mã thời lượng chạy của nhân vật khác.

Let us return to scene III.

Khác, chúng tôi lặp lại cảnh III để xuất lại nhân vật của Rome.

Scene IV: Finale.

[Exeunt]

Tuyên bố cảnh cuối cùng này chỉ là một điểm đánh dấu cho phần cuối của chương trình. Hướng [Exeunt]giai đoạn là cần thiết để có được trình biên dịch để thực sự tạo cảnh cuối cùng.



5

perl, 27 ký tự

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

Điều này có vẻ dài dòng không cần thiết : print<>=~s/(.)(.)/$1x$2/ger. Tôi cũng khá chắc chắn ý của bạn $1x$2, và không phải là cách khác.
primo

@primo đúng - Tôi không biết về cờ r và tôi không thể tìm thấy nó. Cảm ơn. Về phần khác - xin lỗi, tôi đọc sai thông số kỹ thuật. Tôi sẽ chỉnh sửa khi tôi có thể.
John Dvorak

BTW /rđược ghi chép lại trong perlop và đã được bổ sung trong v5.14.0
psxls

Sử dụng -pcờ cho phép bạn thả print<>, vì vậy câu trả lời sẽ trở nên đơn giản: s/(.)(.)/$1x$2/ge-> 17chars +1 cho -p-> 18 .
F. Hauri

4

R 67

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

+1 tôi không có ý tưởng rep sẽ tự động cưỡng chế timesđối số từ các ký tự sang số nguyên. Rực rỡ.
plannapus

4

Trăn 3, 52

Python 3 cho phép tôi hợp nhất các cách tiếp cận của hai giải pháp python2 của mình.

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

Python 2 raw_inputkhớp với Python 3 input. Vì vậy, dòng đầu tiên phải bằngs=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←⍞

Giải trình:

  • T←⍞: lưu trữ đầu vào trong T
  • T⊂⍨~⎕D∊⍨T: chia T trên các ký tự không phải là chữ số
  • : biến nó thành một 2-by-N/2 ma trận
  • {⍺/⍨⍎⍵}/: trên mỗi hàng của ma trận ( /), sao chép ( /) ký tự đầu tiên ( ) bằng eval ( ) của ký tự thứ hai ( )
  • ,/: nối đầu ra của mỗi hàng

3

Ruby, 30 byte

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

27 byte mã + 3 byte để chạy nó với -pcờ:

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

2

Lắp ráp 8086, 106 98 ký tự

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

Nếu các số nằm trước các ký tự trong luồng đầu vào, hai dòng (18 ký tự) có thể được loại bỏ khỏi số này.


Chỉ cần xóa một "Mov ah, 8" dư thừa
Mike C

2
Bạn nên đăng số byte đã biên dịch thay vì đếm char của trình biên dịch chương trình. Lạm dụng quy tắc FTW
arrdem 4/12/13

Còn dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b453 ký tự thì sao? Tôi không thấy nơi nó xử lý các ký tự không phải chữ hoa hoặc eof mặc dù ...
Jason Goemaat

arrdem: Ý kiến ​​hay. Tôi tự hỏi nếu nó thậm chí phá vỡ các quy tắc nếu tôi lắp ráp nó trong một trình soạn thảo hex. Tôi vẫn sẽ trực tiếp viết mã, chỉ ở mức thấp hơn nguồn asm. :) Jason: Tôi không thấy bất cứ điều gì về EOF trong các quy tắc. Đó là stdin, chỉ cần nhấn ctrl-c để ngăn chặn nó. Ngoài ra tại sao nó sẽ không xử lý chữ thường?
Mike C

Nói chung, mã máy được tính theo số byte so với số mã nguồn cho các ngôn ngữ được dịch hoặc biên dịch, vì thực sự không có sự thay thế hợp lý nào.
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

Nhu cầu được chạy với -rcờ
Có thể giảm xuống 110 + 2 bằng cách thay thế \vbằng không thể in được 0x0B\abằng0x07


+1 ( \2.{9}là một ý tưởng tuyệt vời) lộng lẫy!
F. Hauri

2

C, 65 ký tự

Lấy đầu vào là một tham số.

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

Tôi không thể vượt qua điều này với gcc : error: first parameter of 'main' (argument count) must be of type 'int'. Có một chuyển đổi dòng lệnh?
Darren Stone

@DarrenStone, mã này không tuân thủ tiêu chuẩn 100%. Tôi không sử dụng tham số đầu tiên làm tham số, vì vậy loại của nó không thành vấn đề. Hầu hết các trình biên dịch không bận tâm quá nhiều.
ugoren

Được rồi cảm ơn. Tôi ghen tị với trình biên dịch thân thiện với golf của bạn! :)
Darren Stone


2

Forth, 45 ký tự

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

Đã thử nghiệm với pforth trên OS X.


2

Con trăn, 63 62 ký tự

print''.join([c*int(n)for c,n in zip(*[iter(raw_input())]*2)])

Thủ thuật hay iterđấy ... Tôi nghĩ tôi sẽ tự mình sử dụng nó!
gian hàng

2

Windows PowerShell, 55 ký tự

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

Tôi có cảm giác rằng điều này có thể được chơi golf nhiều hơn, đặc biệt là với các diễn viên từ char đến chuỗi và int, nhưng tôi không có thời gian để tiếp tục làm việc với nó ngay bây giờ.


2

C, 68 ký tự

Câu trả lời của @ ugoren trong C ngắn hơn một chút, nhưng câu trả lời này tuân thủ yêu cầu "chuỗi sẽ được cung cấp làm đầu vào trên stdin ."

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

Bạn có thể tắt một ký tự bằng cách bỏ "int" và khai báo c và n là tham số của main, một số khác bằng cách sử dụng for (;;) thay vì while (1), và cuối cùng là hai lần nữa bằng cách thả dấu ngoặc vào vòng lặp trong cùng.
Diễn viên đóng thế

Cảm ơn, @Stuntddude! Tôi đã áp dụng các đề xuất vòng lặp và dấu ngoặc, nhưng tôi đang vật lộn với "khai báo c và n là tham số của chính". Tuy nhiên, điều này cạo 3 ký tự. Chúc mừng.
Darren Stone

Vì hàm main () là một hàm, bạn có thể cung cấp cho nó các tham số, như: main(c,n){ ... }sẽ được truyền 1 theo mặc định khi chương trình được chạy.
Stuntddude

Cảm ơn @Stuntddude. Tôi biết điều đó và có thể tận dụng lợi thế của đối số thứ nhất int, nhưng trình biên dịch tôi sử dụng khiếu nại error: second parameter of 'main' (argument array) must be of type 'char **'để tôi không thể thoát khỏi main(c,n); Tôi phải sử dụng main(int c,char **n). Có thể là một nền tảng hoặc điều gcc.
Darren Stone

Trình biên dịch của tôi cho phép tôi làm n;main(c)nhưng không main(n,c)- đủ tốt! :)
Darren Stone

2

Haskell, 58 56 ký tự

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

Nỗ lực thực sự đầu tiên của tôi trong việc chơi golf bất cứ điều gì, vì vậy có lẽ có một số cải tiến được thực hiện ở đây.


1
read[y]lưu hai ký tự
MtnViewMark 6/12/13

@MtnViewMark Cảm ơn. Tôi đặt nó vào.
Silvio Mayolo 7/12/13

Tôi đang nhận được 57 byte cho điều này? Bạn có thể thay thế replicate x ybằng [1..x]>>[y]. Do đó, dòng thứ hai của bạn có thể được thay thế bằng f(x:y:s)=(['1'..y]>>[x])++f s, đưa nó xuống tới 53 byte.
Angs

2

Japt -P , 8 byte

Nhập dưới dạng một mảng các ký tự, đầu ra dưới dạng một chuỗi.

ò crÈpY°

Thử nó

ò 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

Oh, c r e epy!
Khuldraeseth na'Barya

@ Khuldraesethna'Barya, nó cũng có thể là ò crÏ°îXnếu bạn thấy nó quá đáng sợ!
Xù xì

2

Malbolge Unshackled (biến thể xoay 20 trit), 4.494e6 byte

Kích thước của câu trả lời này vượt quá kích thước chương trình có thể đăng tối đa (eh), vì vậy mã được đặt trong kho GitHub của tôi .

Làm thế nào để chạy này?

Đây có thể là một phần khó khăn, bởi vì thông dịch viên Haskell ngây thơ sẽ mất nhiều thời gian để điều hành việc này. TIO có trình thông dịch Malbogle Unshackled đàng hoàng, nhưng thật đáng buồn là tôi sẽ không thể sử dụng nó (giới hạn).

Cái tốt nhất tôi có thể tìm thấy là biến thể chiều rộng xoay cố định 20 trit, hoạt động rất tốt, giải nén 360 byte mỗi giờ .

Để làm cho trình thông dịch nhanh hơn một chút, tôi đã xóa tất cả các kiểm tra khỏi trình thông dịch Malbolge Unshackled của Matthias Lutter.

Phiên bản sửa đổi của tôi có thể chạy nhanh hơn khoảng 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;
}

Nó đang hoạt động!

It's working


2

05AB1E , 6 5 byte

2ι`ÅΓ

-1 byte nhờ @Grimy .

Đầu ra dưới dạng một danh sách các ký tự.

Hãy thử trực tuyến.

Câu trả lời 6 byte cũ mà không có giải mã độ dài chạy:

2ôε`×?

Hãy thử trực tuyến.

Giải trình:

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ι`ÅΓlà 5 byte. Sẽ rất buồn nếu RLE tích hợp không chiến thắng thử thách RLE.
Grimmy

@Grimy Ah, điều đó thực sự tốt hơn, cảm ơn! :)
Kevin Cruijssen

1

Con trăn, 78 72 66

d = raw_input ()
in "". tham gia ([x * int (d [i + 1]) cho i, x trong liệt kê (d) nếu ~ i & 1])

s = raw_input ()
in "". tham gia (i * int (j) cho i, j trong zip (s [:: 2], s [1 :: 2]))


1

J - 24

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

Điểm của bài nộp này là sử dụng trạng từ infix.


1

Befunge, 49 ký tự

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


1

Con trăn 2, 58

Điều này được lấy cảm hứng từ giải pháp trăn của Darren Stone - lạm dụng lặp!

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

Đây là giải pháp ban đầu của tôi (60 ký tự)

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

Một cách tiếp cận khác là 3 ký tự dài hơn:

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

1

Java: 285 than

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

Sử dụng các khối tĩnh thay vì chính và biên dịch nó với Java6!
Fabinout


1

Khoảng trắng, 135

LSSSLSSSSLSLSTLTSTTTSLSSSSTSSSSLTSSTLTTTTLSSSSLSLSTLTSTTTSSSTTSSSSLTSSTLSSSSLSLSLTSTLSSSTLTSSTSTSSTLTLSSLSLSSLLSSTLSLLSLLLSLSLLSSTTLLLL

(Thay thế các ký tự S, T, L bằng Space, Tab, Linefeed.)

Hãy thử trực tuyến [tại đây] .

Giải trình:

"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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.