Malbolge ปกติเพื่อแปล Malbolge


12

ในงานนี้คุณจะเขียนโปรแกรม / ฟังก์ชั่นที่ใช้โปรแกรมNormalized Malbolgeและแสดงผลลัพธ์Malbolge program (นี่เป็นเครื่องมือลับที่โปรแกรมเมอร์ Malbolge ทุกคนใช้!)

อินพุต

โครงสร้างข้อมูลที่ (อย่างใด) แสดงถึงโปรแกรมปกติ Malbolge

เอาท์พุต

โครงสร้างข้อมูลที่แสดงถึงโปรแกรม Malbolge ที่เกิดขึ้น

ตัวอย่าง

jpoo*pjoooop*ojoopoo*ojoooooppjoivvvo/i<ivivi<vvvvvvvvvvvvvoji
(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/.~P<<:(8&66#"!~}|{zyxwvugJ%

jjjj*<jjjj*<v
('&%#^"!~}{XE

jjjjjjjjjjjjjjjjjjjjjjj*<jjjjjjjjjjjjjjjjjjjjjjjj*<v
('&%$#"!~}|{zyxwvutsrqpnKmlkjihgfedcba`_^]\[ZYXWVT1|

วิธีการแปลง

ทำซ้ำโปรแกรม Malbolge ปกติที่ทำตามขั้นตอนต่อไปนี้สำหรับแต่ละอักขระ:

  1. แทนที่ตัวอักษรในสตริงกับตัวละครที่สอดคล้องกันใน*jpovi</ '(>DQbcu(นั่นคือแผนที่*จะ', jการ(และอื่น ๆ .)

  2. จากนั้นลบตำแหน่งปัจจุบันของตัวนับโปรแกรม (เช่นจำนวนตัวอักษรก่อนหน้าปัจจุบัน) จากรหัส ASCII ของตัวละคร

  3. หากรหัส ASCII ที่ได้นั้นน้อยกว่า 33 ให้เพิ่มขึ้นเป็น 94 และทำซ้ำจนกว่าจะถึงอย่างน้อย 33

  4. ผนวกอักขระที่เป็นผลลัพธ์ต่อท้ายเอาต์พุต

กฎระเบียบ

  • นี่คือแข่งขัน ; คำตอบที่สั้นที่สุดชนะ
  • ไม่มีช่องโหว่มาตรฐานโปรด
  • อนุญาตให้ใช้วิธีการ I / O เริ่มต้น
  • ข้อมูลที่ป้อนจะประกอบด้วยอักขระ*jpovi</เท่านั้น

4
อินพุตมีอักขระจาก " *jpovi</" เท่านั้นหรือไม่
Joel

7
ฉันไม่เข้าใจว่า "แล้วลบตำแหน่ง" วิธี ฉันอาจจะคิดออกจาก pseudocode แต่คำอธิบายควรอยู่ในตัวเอง
xnor

1
" ในขณะที่รหัส ASCII ของ Malbolge ที่เป็นตัวแทนชั่วคราวมีค่าน้อยกว่า 33 ให้เพิ่ม char ด้วย 94 " สิ่งนี้หมายความว่าอย่างไร ฉันเข้าใจความท้าทายได้อย่างไร: 1) ตัวละครแผนที่; 2) แปลงเป็นค่า Unicode; 3) ลดแต่ละรายการโปรแกรม (ตอนนี้เรามีสิ่งที่คุณเรียกว่า 'รหัส ASCII Malbolge ชั่วคราว' รหัส ASCII '); 4) หากค่าใด ๆ น้อยกว่า 33 ให้เพิ่มขึ้นเป็น 94 5) แปลงค่าเหล่านี้กลับเป็นตัวอักษร แต่การใช้วิธีการนี้ผลลัพธ์ที่ออกมานั้นไม่ถูกต้อง .. คุณช่วยอธิบายให้ชัดเจนว่าคุณหมายถึงอะไรสำหรับอินพุตที่ยาวกว่า 33 ตัวอักษร?
Kevin Cruijssen

1
a: if ascii_code(temporary Malbolge representation) < 33: char := char + 94; goto a;

1
ฉันมีความสุขที่จะให้รางวัลกับทุกคนที่สามารถเขียนเป็นหนึ่งในสิ่งเหล่านี้ใน Malbolge :)
JDL

คำตอบ:


4

เยลลี่ , 29 22 ไบต์

Oị“%þV DCµ2®  ‘_JịØṖḊ¤

ลองออนไลน์!

ลิงก์ monadic ที่ใช้สตริง Jelly เป็นอาร์กิวเมนต์และส่งคืนสตริง Jelly

ขอบคุณ @JonathanAllan สำหรับการบันทึก 2 ไบต์!

คำอธิบาย

O                      | Convert to Unicode code points
 ị“%þV DCµ2®  ‘        | Index into compressed integer list [37, 31, 86, 32, 68, 67, 9, 50, 8, 32, 32] (note the 32s are never actually used because the input mod 11 will be one of 1,2,3,5,6,7,8,9)
               _J      | Subtract position of character in original string
                 ị   ¤ | Index into the following as a nilad:
                  ØṖ   | - Printable ASCII characters
                    Ḋ  | - With the first character (space) removed

..._J‘ịØṖḊ¤บันทึกหนึ่งไบต์
โจนาธานอัลลัน

@ Jonathanathan ขอบคุณมากโทรดี!
Nick Kennedy

2
โอ้และเราสามารถเพิ่มขึ้นได้ในการค้นหาของเรา>. < ประหยัดอีก byte:Oị“%þV DCµ2® ‘_JịØṖḊ¤
Jonathan Allan

6

Python 3 , 82 ไบต์

p=0
for c in input():print(end=chr((b"de{#0ABT"["*jpovi<".find(c)]-p)%94+33));p+=1

ลองออนไลน์!

ขอบคุณ @Joel สำหรับการแทนที่อักขระที่ไม่สามารถพิมพ์ได้น่าเกลียดในการทดสอบด้วยอักขระที่พิมพ์ได้

ฉันกำลังมองหา mod-chain เพื่อแทนที่ "*jpovi<".find(c)แต่ฉันไม่คิดว่ามันจะสั้นกว่านี้และการค้นหาแบบ brute-force ที่ไม่สิ้นเปลืองก็ยังไม่พบอะไรเลย

82 ไบต์

f=lambda s,p=0:s and chr((b"de{#0ABT"["*jpovi<".find(s[0])]-p)%94+33)+f(s[1:],p+1)

ลองออนไลน์!


อักขระ ASCII ที่ไม่สามารถพิมพ์ได้สามารถชดเชยได้ 94 เพื่อทำเป็นอักขระที่พิมพ์ได้เพื่อการอ่านที่ดีขึ้น
Joel

คุณสามารถลองค้นหาฟังก์ชันทางคณิตศาสตร์เพื่อแทนที่การแมปb"de{#0ABT"["*jpovi<".find(c)]หากคุณมีโปรแกรมสำหรับสิ่งนั้น
โจเอล

1
@ Joel น่าเสียดายที่ฉันคิดว่าการทำแผนที่กว้างเกินไปสำหรับการค้นหาฟังก์ชันทางคณิตศาสตร์อย่างน้อยก็ด้วยเครื่องมือที่ฉันมี ฉันเพิ่งค้นหาโมดูโลเชนส์x%84%15%7สำหรับครึ่งทางขวาของการทำแผนที่ แต่ฉันคิดว่าฉันสามารถรีไซเคิลโค้ดที่ฉันเขียนเพื่อความท้าทายอีกครั้งเพื่อค้นหารวมถึง*และ/ข้อกำหนด
xnor

@ Joel ฉันไม่พบ mod-chain-style สำหรับการใช้ด้านขวา%และ*( //ใน Python 3 อาจไม่คุ้มค่า) อันที่จริงไม่มีอะไรที่ตรงกับค่า 6 6 อันดับแรก ฉันหวังว่าสิ่งนี้จะได้ผลเนื่องจากการประมาณค่าเอนโทรปีบอกว่าอาจมีนิพจน์ที่ลงท้ายด้วย% 7` มากพอ แต่ก็ใกล้เคียง และโซ่เหล่านี้อาจให้ผลผลิตที่อยู่ไกลจากการกระจายอย่างเท่าเทียมกันโดยเฉพาะอย่างยิ่งเนื่องจากเมื่ออินพุตสองตัวล่มสลายเป็นค่าเดียวกัน สิ่งที่ฉันพยายามยังคงเป็นใบ้เกินไปที่จะค้นหาการแสดงออกที่ใหญ่กว่า แต่ถ้าคุณมีความคิดใด ๆ ไปเลย
xnor

map(ord, "*jpovi<")ผมคิดว่าขั้นตอนวิธีการที่ดีกว่าอาจจะเป็นสิ่งจำเป็นสำหรับปัจจัยการผลิตโดยพลการเช่น หากผลลัพธ์ไม่ได้รักษาคำสั่งสำหรับอินพุตส่วนใหญ่ (เช่นf(m)>=f(n)ถ้าm>=n) ค่าคงที่ที่สร้างขึ้นอย่างระมัดระวังสำหรับบางรายการ%และ*มีความจำเป็นและการค้นหาแบบเดรัจฉานบังคับไม่น่าจะให้ผลลัพธ์ที่เป็นบวก
โจเอล

6

Malbolge Unshackled (ตัวแปรการหมุน 20 trit), 7,784e6 ไบต์

ขนาดของคำตอบนี้เกินขนาดโปรแกรมที่สามารถโหลดสูงสุด (เอ๊ะ) ดังนั้นรหัสจะตั้งอยู่ในพื้นที่เก็บข้อมูล GitHub ของฉัน

วิธีการใช้งานนี้

นี่อาจเป็นส่วนที่ยุ่งยากเนื่องจากล่ามที่ไร้เดียงสาของ Haskell จะใช้เวลานานในการรันสิ่งนี้ TIO มีล่าม Malbogle Unshackled ที่ดี แต่น่าเศร้าที่ฉันไม่สามารถใช้งานได้ (ข้อ จำกัด )

สิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือตัวแปรความกว้างการหมุน 20 trit คงที่ซึ่งทำงานได้ดีมากโดยแปลง 0,5 อักขระต่อวินาทีตัวอักษรต่อวินาที

เพื่อให้ล่ามเร็วขึ้นฉันได้ลบเช็คทั้งหมดจาก Matthias Lutter's Malbolge Unshackled interpreter

เวอร์ชันที่แก้ไขของฉันสามารถทำงานได้เร็วขึ้นประมาณ 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
นี่มันบ้าไปแล้ว
MilkyWay90

หากต้องการผ่านคนนับไบต์เป็น 7.784MB ไม่ใช่ 7.784GB ฉันตีความเครื่องหมายจุลภาคเป็นการจัดกลุ่มหลักพันแทนที่จะเป็นจุดทศนิยมในตอนแรก
Potato44

@ Potato44 เราใช้เครื่องหมายจุลภาคเป็นตัวคั่นทศนิยมในโปแลนด์โดยใช้จุดเช่นนี้เป็นสิ่งต้องห้าม
Krzysztof Szewczyk

5

Python 3 , 84 83 ไบต์

f=lambda p,i=0:p and chr(126-(i+b"WV@:-zyg"["*jpovi<".find(p[0])])%94)+f(p[1:],i+1)

ลองออนไลน์!

นี่เป็นปัญหาทางคณิตศาสตร์ส่วนใหญ่เกี่ยวกับการทำให้การคำนวณง่ายขึ้นรวมถึงการเล่นกอล์ฟหลังจากทำคณิตศาสตร์เสร็จแล้ว รหัสรุ่นที่ไม่ได้แสดงให้เห็นด้านล่าง

เวอร์ชันที่ไม่ถูกเรียกซ้ำ

def convert(prog):
    offsets = dict(zip("*jpovi</", [87, 86, 64, 58, 45, 122, 121, 103]))  # ASCII encoded to "WV@:-zyg"
    output = ""
    for pos, c in enumerate(prog):
        output += chr(126-(offsets[c]+pos)%94)
    return output

ลองออนไลน์!




3

05AB1E , 32 31 23 22 ไบต์

žQ¦•4¡ˆ¶ü]₁η₃•₃вIÇèā-è

-8 ไบต์สร้างพอร์ตของคำตอบ JellyของNickKennedy ดังนั้นอย่าลืมโหวตให้เขา !!
-1 ไบต์ขอบคุณ @Grimy

เอาต์พุตเป็นรายการของอักขระ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

   4¡ˆ¶ü]₁η₃•          # Push compressed integer 82767635194143615015
              ₃в        # Converted to base-95 as list: [1,36,30,85,0,67,66,8,49,7,0]
                IÇ      # Push the input and convert each character to its unicode value
                  è     # Index each into the list we created
                   ā    # Push an integer list in the range [0, length] 
                        # (without popping the list itself)
                    -   # Subtract it from the previous list
žQ                      # Push builtin with all printable ASCII characters,
  ¦                     # and remove the leading space
                     è  # Index the values of the list into the ASCII characters
                        # (after which the result is output implicitly)

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดจำนวนเต็มขนาดใหญ่?และวิธีการบีบอัดรายการจำนวนเต็ม? )จะเข้าใจว่าทำไม•4¡ˆ¶ü]₁η₃•เป็น82767635194143615015และเป็น•4¡ˆ¶ü]₁η₃•₃в[1,36,30,85,0,67,66,8,49,7,0]


•1ÃQWý₂Ýδ9•86в->•4¡ˆ¶ü]₁η₃•₃в
Grimmy

@Grimy Thanks :)
Kevin Cruijssen

2

Perl 5 ( -p), 53 , 51 ไบต์

ประหยัด 2 ไบต์ใช้de{#0ABTแทน'(>DQbcuดังนั้น61ไม่จำเป็นอีกต่อไป

y;*jpovi</;de{#0ABT;;s/./chr 33+(-"@-"+ord$&)%94/ge

TIO

คำตอบแรกคือ

y;*jpovi</;'(>DQbcu;;s/./chr 33+(61-"@-"+ord$&)%94/ge

TIO


2

Japté , 24 23ไบต์

ท่าเรือนิคเป็นวิธีการแก้ปัญหาวุ้น

;£EÅgYn" #T BA0 "cXc

ลองมัน

;£EÅgYn"..."cXc     :Implicit input of string
 £                  :Map each character X at 0-based index Y
; E                 :ASCII
   Å                :Slice of the first character (space)
    g               :Get character at index
     Y              :  Increment Y
      n             :  Subtract from
       "..."        :    Literal string (Codepoints: 32,35,29,84,32,66,65,7,48,6,32)
            c       :    Codepoint at index
             Xc     :      Codepoint of X

1

เรติน่า 0.8.2 , 50 ไบต์

T`*j\p\ovi</`'(>DQbcu
.
$.`$* $&¶
+T`!p`~_p` .¶
¶

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

T`*j\p\ovi</`'(>DQbcu

ทำทับศัพท์ตามที่อธิบายไว้ในคำถาม p(อธิบายไว้ด้านล่าง) และoมีความหมายพิเศษเพื่อTransliterate ดังนั้นพวกเขาจำเป็นต้องอ้าง

.
$.`$* $&¶

รายการตัวละครแต่ละตัวในบรรทัดของตัวเองนำหน้าด้วยจำนวนช่องว่างตามดัชนีของมันคือสิ่งที่เคาน์เตอร์โปรแกรมจะเป็น

+T`!p`~_p` .¶

ลดจำนวนอักขระตัวสุดท้ายของแต่ละบรรทัดอย่างซ้ำ ๆ เป็นวงกลมและลบช่องว่างก่อนหน้าในแต่ละครั้งจนกว่าช่องว่างทั้งหมดจะถูกลบ pย่อมาเช่น ASCII พิมพ์ -~แต่เราต้องการ!ที่จะแมปไป~เพื่อให้มีการทับศัพท์แรกและจากนั้น_ทำให้เกิดช่องว่างในการแข่งขันที่จะถูกลบในขณะที่ตัวอักษรที่เหลือได้รับการทับศัพท์หนึ่งรหัสอักขระที่เวลา

เข้าร่วมตัวละครทั้งหมดกลับมารวมกัน


1

ถ่าน 23 ไบต์

⭆S§Φγμ⁻℅§ #{T BAe0d ℅ικ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำตอบ JavaScript ของ Port of @ Arnauld คำอธิบาย:

 S                      Input string
⭆                       Map over characters and join
                     ι  Current character
                    ℅   ASCII code
        §               Cyclically indexed into
          #{T BAe0d     Literal string ` #{T BAe0d `
       ℅                ASCII code
      ⁻                 Subtract
                      κ Current index
  §                     Cyclically indexed into
    γ                   Printable ASCII
   Φ                    Filtered on
     μ                  Inner index (i.e. skip initial space)
                        Implicitly print


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.