回答:
.
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]
これはステージの方向です。その中で、変数Romeo
とJuliet
変数に「ステージ」に来るように指示します。一度に「ステージ」に配置できる変数は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 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から単一の文字の序数値を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.
別のシーン宣言。この一つは、我々が繰り返しの文字値印刷するループのためであるRomeo
、Juliet
回。
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]
ステージの方向は、実際には最後のシーンを生成するようにコンパイラーを取得する必要があります。
print<>=~s/(.)(.)/$1x$2/ger
print<>=~s/(.)(.)/$1x$2/ger
ます:。また$1x$2
、あなたが意図したものであり、その逆ではないこともかなり確信しています。
-p
フラグを使用するprint
と<>
、をドロップして、ので、答えは単純になりますs/(.)(.)/$1x$2/ge
。-> 17chars +1 for- -p
> 18。
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文字)を削ることができます。
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
53文字の?それは... EOFしかし非大文字を扱うか、どこで表示されない
入力をパラメーターとして取得します。
main(p,v)char*p,**v;{
for(p=v[1];*p;--p[1]<49?p+=2:0)putchar(*p);
}
error: first parameter of 'main' (argument count) must be of type 'int'
。コマンドラインスイッチはありますか?
Cでの@ugorenの回答は少し短くなっていますが、この回答は「文字列はstdinの入力として提供される」という要件に準拠しています。
n;main(c){for(;;){c=getchar(),n=getchar()-48;while(n--)putchar(c);}}
main(c,n){ ... }
ます。プログラムの実行時にデフォルトで1が渡されます。
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)
-十分です!:)
f[]=[]
f(x:y:s)=replicate(read[y])x++f s
main=interact$f
何でもゴルフをするという私の最初の本当の試みなので、おそらくここでいくつかの改善がなされるでしょう。
read[y]
2つの文字セーブ
replicate x y
て[1..x]>>[y]
。したがって、2行目をに置き換えるとf(x:y:s)=(['1'..y]>>[x])++f s
、53バイトになります。
-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
ò crÏ°îX
不気味すぎると感じるかもしれません!
この回答のサイズは投稿可能な最大プログラムサイズ(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;
}
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
2ι`ÅΓ
5バイトです。RLEビルトインがRLEチャレンジに勝てなかったら悲しいでしょう。
これは、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())
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++;}}}}
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
クロージュア(107)
(pr(apply str(map #(apply str(repeat(Integer/parseInt(str(second %)))(first %)))(partition 2(read-line)))))
これはClojureであるために非常に長いと感じています。誰かがもっとうまくできるなら、それを投稿してください。