Tạo một; # thông dịch viên


62

Gần đây tôi đã tạo ra một ngôn ngữ mới gọi là ;#(phát âm là "Dấu chấm phẩy") chỉ có hai lệnh:

; thêm một vào bộ tích lũy

#sửa đổi bộ tích lũy bằng 127, chuyển đổi thành ký tự ASCII và đầu ra mà không có dòng mới. Sau đó, đặt lại bộ tích về 0. Có, 127 là chính xác.

Bất kỳ nhân vật khác được bỏ qua. Nó không có tác dụng đối với người tích lũy và không nên làm gì.

Nhiệm vụ của bạn là tạo ra một trình thông dịch cho ngôn ngữ mạnh mẽ này!

Nó phải là một chương trình đầy đủ hoặc một chức năng sẽ lấy một ;#chương trình làm đầu vào và tạo ra đầu ra chính xác.

Ví dụ

Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o

Output: Fizz Buzz output
Program: link below

Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Fizz Buzz lên tới 100


1
Có thể chấp nhận được không nếu một trình thông dịch không chấm dứt việc thực hiện nó ở cuối đầu vào mà thay vào đó cứ lặp đi lặp lại vô thời hạn mà không tạo ra đầu ra thêm?
Leo

5
Ví dụ thứ hai khiến tôi băn khoăn về một chương trình mã hóa chương trình để tạo đầu ra ... biên dịch đệ quy!
frarugi87

@Leo đúng vậy
caird coinheringaahing

1
@iamnotmaynard Dấu chấm phẩy Hash
caird coinheringaahing

2
Có lẽ Wink Hash sẽ dễ nói hơn
James Waldby - jwpat7

Câu trả lời:



17

JavaScript (ES6), 76 82 80 byte

s=>s.replace(/./g,c=>c=='#'?String.fromCharCode(a%(a=127)):(a+=(c==';'),''),a=0)

Bản giới thiệu

Phiên bản đệ quy, 82 77 byte

Đã lưu 5 byte nhờ Neil

Cái này có khả năng bị sập đối với các đầu vào lớn như ví dụ Fizz Buzz.

f=([c,...s],a=0)=>c?c=='#'?String.fromCharCode(a%127)+f(s):f(s,a+(c==';')):""

Tôi nghĩ rằng f(s,a+(c==';'))có thể loại bỏ ba byte khỏi phiên bản đệ quy của bạn.
Neil

@Neil Nó thực sự tiết kiệm 5 byte. :-)
Arnauld

Tôi cảm thấy thực sự ngớ ngẩn bây giờ. Ban đầu tôi có phiên bản lỗi và trừ 2 byte để sửa lỗi. Nhưng tôi đã nhầm lẫn và phiên bản lỗi thực sự đã lưu 7 byte ...
Neil

12

Võng mạc , 336 63 67 65 66 62 59 byte

T`;#-ÿ`¯_
;{127}|;+$

(^|¯)
¯
+T`-~`_-`[^¯]
T\`¯`

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

Phiên bản có thể đọc được bằng cú pháp thoát giả định :

T`;#\x01-ÿ`\x01¯_
;{127}|;+$

(^|¯)\x01\x01
¯\x02
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
T\`¯`

Không in byte NUL, vì TIO không cho phép chúng trong mã nguồn. Đồng thời in thêm một dòng mới ở cuối, nhưng tôi đoán nó không thể làm khác được. Trailing newline bị đàn áp nhờ @Leo .

-273 byte (!) Nhờ @ETHproductions .

-2 byte nhờ @ovs .

-3 byte nhờ @Neil . Kiểm tra giải pháp 34 byte tuyệt vời của họ .


1
Oh từ ngữ của tôi. Nhưng bạn có thể không lưu một ngàn byte với +T`\x01-~`_\x03-\x7f`[^\x01¯]\x01? (dĩ nhiên bao gồm cả những thứ không thể in thành ký tự đơn)
ETHproductions

@ETHproductions Tất nhiên bạn có thể. Cảm ơn bạn! :)
eush77

1
Hiện tại chữ cái cuối cùng luôn ở đầu ra, ngay cả khi không có dấu #ở đầu vào. Bạn có thể sửa chữa nó bằng cách thay đổi giai đoạn thứ hai của bạn để(;{127}|;+$)
OVS

1
Bạn có cần + `trên dòng thứ ba không? Khi bạn loại bỏ toàn bộ trận đấu, sẽ không còn gì để thay thế trong lần lặp thứ hai.
trứng

1
Tôi nghĩ rằng tôi có thể làm điều này trong 34 byte: T`;#\x01-ÿ`\x80\x7F_ \x80+$(dòng trống) \+T`\x7Fo`\x01-\x80_`\x80[^\x80](sử dụng thoát thập lục phân để thể hiện không thể in được). Đầu ra \ x7F thay vì null.
Neil

12

Java 8, 100 byte

s->{int i=0;for(byte b:s.getBytes()){if(b==59)i++;if(b==35){System.out.print((char)(i%127));i=0;}}};

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


3
Chào mừng đến với trang web! :)
DJMcMayhem

Tôi đã thêm một liên kết đến một trình thông dịch trực tuyến với ví dụ FizzBuzz cho bạn (văn bản liên kết quá dài để phù hợp với một nhận xét)
Jonathan Allan

Java sử dụng UTF-16 cho các chương trình của mình . Vì vậy, đây không phải là 100 byte mà là 100 ký tự .
G.Broser nói Phục hồi lại

5
@GeroldBroser Unicode là một bộ ký tự: UTF-8 và UTF-16 là hai bảng mã của bộ ký tự đó. Nguồn ASCII hoàn toàn hợp lệ như một chương trình Java và tôi có rất nhiều tệp nguồn Java được mã hóa theo ASCII (cũng là UTF-8 hợp lệ, do đó cũng là mã hóa Unicode).

1
Hoàn toàn chơi gôn, với 81 byte là Consumer<char[]>:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Olivier Grégoire

11

Japt , 18 byte

®è'; %# d}'# ë ¯J

Có một char \ x7f không thể in được sau %#. Kiểm tra nó trực tuyến!

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

®   è'; %#   d}'# ë ¯  J
mZ{Zè'; %127 d}'# ë s0,J
                         // Implicit: operate on input string
mZ{           }'#        // Split the input at '#'s, and map each item Z to
   Zè';                  //   the number of semicolons in Z,
        %127             //   mod 127,
             d           //   turned into a character.
m              '#        // Rejoin the list on '#'. At this point the Hello, World! example
                         // would be "H#e#l#l#o#,# #W#o#r#l#d#!#" plus an null byte.
                  ë      // Take every other character. Eliminates the unnecessary '#'s. 
                    ¯J   // Slice off the trailing byte (could be anything if there are
                         // semicolons after the last '#').
                         // Implicit: output result of last expression

1
D'oh, nên đã kiểm tra câu trả lời! Chỉ cần dành một chút thời gian cho việc này chỉ để thấy rằng bạn đã đánh bại tôi. q'# ®è'; u# dì¯Jcũng hoạt động cho cùng một số điểm.
Xù xì

11

Python , 65 byte

Đây là một sân golf của này câu trả lời trước đó.

lambda t:''.join(chr(x.count(';')%127)for x in t.split('#')[:-1])

Hãy thử trực tuyến! Python2

Hãy thử trực tuyến! Python3

Giải trình

Đây là một câu trả lời khá đơn giản, chúng tôi xác định có bao nhiêu ;s giữa mỗi #bản và in chrmod 127. Điều duy nhất có thể hơi lạ một chút là [:-1]. Chúng tôi cần phải bỏ nhóm cuối cùng bởi vì sẽ không có #sau đó.

Ví dụ

;;#;;;;#;;;;;#;;;

Sẽ được chia thành

[';;',';;;;',';;;;;',';;;']

Nhưng chúng tôi không muốn cuối cùng ;;;vì không có #nó sau khi in giá trị.


1
Tôi đã bận rộn để có được tất cả các bài kiểm tra trong một liên kết TIO. Là chr cho chr ngoại trừ tx.
Jonathan Allan

9

> <> , 35 byte

>i:0(?;:'#'=?v';'=?0
^   [0o%'␡'l~<

Hãy thử trực tuyến! Thay thế bằng 0x7F ^?hoặc "xóa".

Vòng lặp chính

>i:0(?;:'#'=?v      
^            <

Cái này lấy một ký tự của input ( i), kiểm tra nếu nó nhỏ hơn 0 tức là EOF ( :0() và chấm dứt chương trình nếu nó là ( ?;). Mặt khác, kiểm tra xem đầu vào có bằng #( :'#'=) không. Nếu có, phân nhánh xuống và khởi động lại vòng lặp ( ?v... ^ ... <).

Bộ đếm logic

              ';'=?0
              

Kiểm tra xem đầu vào có bằng ;( ';'=) không. Nếu có, đẩy a 0. Nếu không, không làm gì cả. Điều này khởi động lại vòng lặp chính.

In logic

>       '#'=?v      
^   [0o%'␡'l~<

Khi ký tự đầu vào là #, bật đầu vào ra khỏi ngăn xếp ( ~), lấy số lượng thành viên trên ngăn xếp ( l), đẩy 127 ( '␡') và lấy mô-đun ( %). Sau đó, xuất nó dưới dạng một ký tự ( o) và bắt đầu một ngăn xếp mới ( [0). "Số không" này ra khỏi quầy. Sau đó, vòng lặp khởi động lại.


3
Nghèo> <>. Thật đáng buồn :0(:(
caird coinheringaahing

9

Python 3, 69 byte

Được cải thiện, nhờ @Wheat Wizard, @Uriel

print(''.join(chr(s.count(';')%127)for s in input().split('#')[:-1]))

3
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Mục tiêu ở đây là làm cho mã càng ngắn càng tốt (tính bằng byte), vì vậy bạn cần bao gồm số byte trong tiêu đề :).
Ad Nam

Cảm ơn đã giải thích, không biết điều đó. Tôi sẽ làm việc với nó sau đó.
MrGeek

2
Bạn có thể loại bỏ không gian sau :s.
Pavel

1
Tôi đếm 74 byte. tio.run/nexus/ Kẻ
Dennis

2
Ngoài ra, ';'==ctiết kiệm một không gian, nhưng hoàn toàn không sử dụng các ifcâu lệnh sẽ còn ngắn hơn.
Dennis

9

Röda , 44 39 38 byte

5 byte được lưu nhờ @fergusq

{(_/`#`)|{|d|d~="[^;]",""chr #d%127}_}

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

Hàm ẩn danh lấy đầu vào từ luồng.


Nếu các nhân vật khác không phải bỏ qua, tôi nhận được điều này:

Röda , 20 byte

{(_/`#`)|chr #_%127}

8

Ruby, 41 35 34 ký tự

( 40 34 mã 33 ký tự + tùy chọn dòng lệnh 1 ký tự)

gsub(/.*?#/){putc$&.count ?;%127}

Nhờ vào:

  • Jordan đã đề xuất sử dụng putcđể không cần chuyển đổi rõ ràng với .chr(6 ký tự)
  • Kirill L. vì đã tìm dấu ngoặc đơn không cần thiết (1 ký tự)

Chạy mẫu:

bash-4.4$ ruby -ne 'gsub(/.*?#/){putc$&.count ?;%127}' < '2d{.;#' | od -tad1
0000000    2  etb    d  nul  nul  nul  nul    {  nul  nul  nul
          50   23  100    0    0    0    0  123    0    0    0
0000013

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


Doh. Mặc dù tôi đã làm C trong những năm đầu, tôi hoàn toàn quên mất putc(). Cảm ơn bạn, @Jordan
manatwork 16/12/17

1
Thật ngạc nhiên, bạn thực sự có thể bỏ dấu ngoặc đơn sau khi đếm để lưu một byte
Kirill L.

Bắt tốt đẹp, @KirillL., Cảm ơn bạn.
manatwork

7

05AB1E , 16 15 14 byte

Mã số:

'#¡¨ʒ';¢127%ç?

Giải trình:

'#¡              # Split on hashtags
   ¨             # Remove the last element
    ʒ            # For each element (actually a hacky way, since this is a filter)
     ';¢         #   Count the number of occurences of ';'
        127%     #   Modulo by 127
            ç    #   Convert to char
             ?   #   Pop and print without a newline

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!


7

Thạch , 13 byte

ṣ”#Ṗċ€”;%127Ọ

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

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

ṣ”#Ṗċ€”;%127Ọ  Main link. Argument: s (string)

ṣ”#            Split s at hashes.
   Ṗ           Pop; remove the last chunk.
    ċ€”;       Count the semicola in each chunk.
        %127   Take the counts modulo 127.
            Ọ  Unordinal; cast integers to characters.

1
Từ semicolanày không tồn tại semicolons.
Erik the Outgolfer


Hmm, từ lạ.
Erik the Outgolfer

@EriktheOutgolfer Một người nào đó trên Wiktionary có lẽ đã cố gắng làm cho số nhiều tiếng Latin có giá trị bằng tiếng Anh, nhưng nên đánh vần cách viết coladấu chấm phẩy .
Cœur

7

Mã máy x86 trên MS-DOS - 29 byte

00000000  31 d2 b4 01 cd 21 73 01  c3 3c 3b 75 06 42 80 fa  |1....!s..<;u.B..|
00000010  7f 74 ed 3c 23 75 eb b4  02 cd 21 eb e3           |.t.<#u....!..|
0000001d

Nhận xét lắp ráp:

bits 16
org 100h

start:
    xor dx,dx       ; reset dx (used as accumulator)
readch:
    mov ah,1
    int 21h         ; read character
    jnc semicolon
    ret             ; quit if EOF
semicolon:
    cmp al,';'      ; is it a semicolon?
    jne hash        ; if not, skip to next check
    inc dx          ; increment accumulator
    cmp dl,127      ; if we get to 127, reset it; this saves us the
    je start        ; hassle to perform the modulo when handling #
hash:
    cmp al,'#'      ; is it a hash?
    jne readch      ; if not, skip back to character read
    mov ah,2        ; print dl (it was choosen as accumulator exactly
    int 21h         ; because it's the easiest register to print)
    jmp start       ; reset the accumulator and go on reading

6

05AB1E , 25 21 19 byte

-2 byte nhờ Adnan

Îvy';Q+y'#Qi127%ç?0

Giải trình:

Î                       Initialise stack with 0 and then push input
 v                      For each character
  y';Q+                 If equal to ';', then increment top of stack
       y'#Qi            If equal to '#', then
            127%        Modulo top of stack with 127
                ç       Convert to character
                 ?      Print without newline
                  0     Push a 0 to initialise the stack for the next print

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


1
Tôi nghĩ bạn có thể thay thế i>}bằng +.
Ad Nam

6

Võng mạc , 34 byte

T`;#-ÿ`_
\+T`o`-_`[^]|$

Hãy thử trực tuyến! Bao gồm trường hợp thử nghiệm. Chỉnh sửa: Đã lưu 2 byte với một số trợ giúp từ @MartinEnder. Lưu ý: Mã bao gồm không thể in được và sử dụng &#x;mã tạo ra kết quả không chính xác vì trình duyệt sử dụng Windows-1252 thay vì ISO-8859-1. Giải thích: Dòng đầu tiên dọn dẹp đầu vào: ;được thay đổi thành \x80, #để \x7F(do TIO hạn chế) và mọi thứ khác sẽ bị xóa. Sau đó, bất cứ khi nào chúng ta thấy một \x80cái không phải trước một cái khác \x80, chúng ta sẽ xóa nó và tăng dần theo mã của bất kỳ ký tự tiếp theo nào. Điều này được lặp đi lặp lại cho đến khi không còn \x80nhân vật nào nữa . Mã gốc hỗ trợ byte rỗng về cơ bản trừ 1 từ các byte không thể in được, ngoại trừ trong dòng đầu tiên \xFFkhông thay đổi và \x7Ftrở thành\x00. Với các lối thoát cho dễ đọc:

T`;#\x00-\xFF`\x7F\x00_
\+T`\x7Eo`\x00-\x7F_`\x7F[^\x7F]|\x7F$

Bạn có thể lưu một byte bằng cách kết hợp hai giai đoạn cuối với \x80([^\x80]|$)trong giai đoạn cuối.
Martin Ender

@MartinEnder Cảm ơn! Khó chịu, \s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?cũng chỉ tiết kiệm một byte.
Neil

Ah, nhưng tôi [^\x80]|\x80$tiết kiệm được hai byte.
Neil

Ah tốt đẹp, yeah cái cuối cùng hoạt động. Tôi cũng đã thử cái nhìn tiêu cực, nhưng sthật khó chịu.
Martin Ender

6

R, 97 90 86 84 byte

Một chức năng:

function(s)for(i in utf8ToInt(s)){F=F+(i==59);if(i==35){cat(intToUtf8(F%%127));F=0}}

Khi R bắt đầu, Fđược định nghĩa là FALSE(số 0).

Ung dung:

function (s)
    for (i in utf8ToInt(s)) {
        F = F + (i == 59)
        if (i == 35) {
            cat(intToUtf8(F%%127))
            F = 0
        }
    }

Đây có nên là R + pryr không?
L3viathan

@ L3viathan Vì pryrlà gói R, nó vẫn là mã R.
Sven Hohenstein

Đó là mã R, nhưng nó yêu cầu cài đặt thêm một thư viện.
L3viathan

@ L3viathan Bạn có nghĩ câu trả lời của tôi không hợp lệ không? Tôi có nên tránh sử dụng các gói bổ sung?
Sven Hohenstein

2
@BLT Không có sự khác biệt. Theo tôi, không có vấn đề gì khi sử dụng các gói bổ sung đã được tạo trước khi thử thách. Điều này đúng với tất cả các ngôn ngữ. Trong Python bạn phải sử dụng importtrong khi ở R, bạn có thể sử dụng ::để truy cập trực tiếp chức năng trong các gói. Bạn thường có thể thấy việc sử dụng các gói bổ sung tại đây (ví dụ: đối với Python và Java). Tuy nhiên, tôi đã thay đổi bài viết cũ của mình vì tôi không muốn tham gia thảo luận.
Sven Hohenstein

5

Python, 82 byte

lambda t:''.join(chr(len([g for g in x if g==';'])%127)for x in t.split('#')[:-1])

1
@WheatWizard vì bạn đã đăng bài này dưới dạng câu trả lời, tôi tin rằng hành động phù hợp với tôi sẽ là nâng cấp nó chứ không phải cập nhật
Uriel

4

Đồng bằng TeX, 156 byte

\newcount\a\def\;{\advance\a by 1\ifnum\a=127\a=0\fi}\def\#{\message{\the\a}\a=0}\catcode`;=13\catcode35=13\let;=\;\let#=\#\loop\read16 to\>\>\iftrue\repeat

Có thể đọc được

\newcount\a

\def\;{
  \advance\a by 1
  \ifnum \a=127 \a=0 \fi
}
\def\#{
  \message{\the\a}
  \a=0
}

\catcode`;=13
\catcode35=13

\let;=\;
\let#=\#

\loop
  \read16 to \> \>
  \iftrue \repeat

Nó có thể in ký tự một cách tượng trưng?
eush77


4

Perl, 25 byte

$_=chr(y%;%%%127)x/#/

Chạy với perl -043pe(được tính là 4 byte, vì perl -elà tiêu chuẩn).

Giải thích: -043đặt bộ kết thúc dòng thành #(ASCII 043). -plặp đi lặp lại trên các dòng đầu vào của dòng Điên (thực sự là # chuỗi giới hạn, bây giờ). y%;%%đếm số lượng ;trong mỗi dòng trên đường sắt. x/#/đảm bảo rằng chúng tôi không in thêm một ký tự cho các chương trình không kết thúc bằng số # (như bản thử nghiệm thứ ba). %127nên khá rõ ràng $_=là nồi hơi thông thường.


Ấn tượng một cái, mặc dù có trục trặc: vì ;;#;;;nó xuất ra # 5 thay vì # 2.
manatwork

Làm thế nào bạn có được kết quả này? echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxdđầu ra chính xác 00000000: 02trên máy của tôi. Nếu bạn rời khỏi 043hoặc đang sử dụng một bảng mã #không phải là ASCII 043, điều đó sẽ giải thích kết quả của bạn.
Grimmy

1
Úi. Xin lỗi, tôi đã có một lỗi đánh máy trong bài kiểm tra của tôi. Mã của bạn hoạt động hoàn hảo.
manatwork

4

CJam, 27 byte

0q{";#"#") 127%co0 "S/=~}%;

Giải trình:

0                            e# Push 0
 q                           e# Push the input
  {                          e# For each character in the input:
   ";#"#                     e#   Index of character in ";#", -1 if not found
        ") 127%co0 "S/       e#   Push this string, split on spaces
                      =      e#   Array access (-1 is the last element)
                       ~     e#   Execute as CJam code. ")" increments the accumulator,
                             e#     and "127%co0" preforms modulo by 127, converts to character, pops and outputs, and then pushes 0.
                        }%   e# End for
                          ;  e# Delete the accumulator

Giải pháp thay thế, 18 byte

q'#/);{';e=127%c}%

Giải trình:

q                   e# Read the whole input
 '#/                e# Split on '#'
    );              e# Delete the last element
      {             e# For each element:
       ';e=         e#   Count number of ';' in string
           127%     e#   Modulo by 127
               c    e#   Convert to character code
                }%  e# End for

Business Cat Điều đó không bỏ qua các ký tự không hợp lệ.
Trái cây Esolanging

Tại sao bạn cần ;phải xóa bộ tích lũy?
caird coinheringaahing

@RandomUser Vì vậy, cuối cùng chuỗi không được xuất ra ở cuối chuỗi.
Sản phẩm ETH

4

F #, 79 91 93 byte

let rec r a=function|[]->()|';'::t->r(a+1)t|'#'::t->printf"%c"(char(a%127));r 0 t|_::y->r a y

Ung dung

let rec run acc = function
    | [] -> ()
    | ';'::xs ->
        run (acc + 1) xs
    | '#'::xs ->
        printf "%c" (char(acc % 127))
        run 0 xs
    | x::xs -> run acc xs

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

Chỉnh sửa: Đã đối xử với bất kỳ char nào khác ngoài ';' như '#'. Thay đổi nó để nó bỏ qua ký tự không hợp lệ.

Thay thế

F #, 107 104 byte

let r i=
 let a=ref 0
 [for c in i do c|>function|';'->a:=!a+1|'#'->printf"%c"(!a%127|>char);a:=0|_->()]

Sử dụng ô tham chiếu tiết kiệm 3 byte

Ung dung

let run i =
    let a = ref 0;
    [for c in i do
        match c with
        | ';' -> a := !a + 1
        | '#' ->
            printf "%c" (char(!a % 127))
            a := 0
        |_->()
    ]

Dùng thử trực tuyến


4

Xử lý.js (phiên bản Khanacademy), 118 byte

var n="",a=0;for(var i=0;i<n.length;i++){if(n[i]===";"){a++;}if(n[i]==="#"){println(String.fromCharCode(a%127));a=0;}}

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

Vì phiên bản xử lý được sử dụng không có bất kỳ phương thức nhập nào, đầu vào được đặt trong n.


Về mặt kỹ thuật, bạn có thể giả mạo phương thức nhập liệu của riêng mình với keyTyped=function(){ ... }: P
Sản phẩm ETH

@ETHproductions Đây là một cái nhìn ghê tởm.
Christopher

@RandomUser yay! Tôi đã làm xong rồi! Tôi thích trả lời trong phần Xử lý (kiểm tra câu trả lời của tôi)
Christopher

2
@RandomUser Không chỉ 1000 rep .. mà là 2 ^ 10 rep (͡ ° ͜ʖ ͡ °)

@Haynightas Ohhh yeah
Christopher

4

Mê cung , 61 47 byte

_36},)@
;    {
; 42_-
"#-  1
_ ; 72
_ ) %
"""".

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

Giải trình

hình ảnh mã hóa màu của mã giải pháp

Việc thực thi mã bắt đầu ở góc trên cùng bên trái và dấu chấm phẩy đầu tiên loại bỏ số 0 ẩn khỏi ngăn xếp và tiếp tục sang phải.

trái cam

  • _36đẩy 36 lên ngăn xếp. Đây là để so sánh đầu vào với#
  • } di chuyển đỉnh của ngăn xếp sang ngăn xếp thứ cấp
  • , đẩy giá trị nguyên của ký tự trên ngăn xếp
  • )tăng ngăn xếp (nếu kết thúc đầu vào, điều này sẽ làm cho ngăn xếp 0 và luồng chương trình sẽ tiến tới @và thoát)
  • { di chuyển đỉnh ngăn xếp thứ cấp lên đỉnh ngăn xếp chính
  • -pop y, pop x, đẩy x - y. Điều này là để so sánh đầu vào với #(35 in ascii). Nếu đầu vào là #mã sẽ tiếp tục đến phần màu tím (vì đỉnh của ngăn xếp là 0, IP sẽ tiếp tục theo hướng nó đang di chuyển trước đó), nếu không nó sẽ tiếp tục đến phần màu xanh lá cây.

Màu tím

  • 127 đẩy 127 lên ngăn xếp
  • % pop x, pop y, đẩy x% y
  • . bật đỉnh ngăn xếp (bộ tích lũy) và xuất ra dưới dạng ký tự

Từ đây, mã màu xám đưa chúng ta đến góc trên cùng bên trái của chương trình mà không có gì trên ngăn xếp.

màu xanh lá

  • _24 đẩy 24 lên ngăn xếp
  • -pop x, pop y, đẩy xy. 24 là sự khác biệt giữa #;vì vậy điều này kiểm tra nếu đầu vào là ;. Nếu đó là ;mã tiếp tục thẳng về phía ). Nếu không, nó sẽ chuyển sang #chiều cao của ngăn xếp (luôn luôn là số dương, buộc chương trình rẽ phải ở giao lộ tiếp theo và bỏ lỡ mã làm tăng bộ tích lũy)
  • ; loại bỏ đỉnh của ngăn xếp
  • ) tăng đỉnh của ngăn xếp là số 0 ẩn hoặc nó là số 0 tăng trước đó đóng vai trò là bộ tích lũy cho đầu ra

Từ đây, mã màu xám đưa chúng ta đến góc trên cùng bên trái của chương trình với ngăn xếp chỉ có bộ tích lũy trên đó.

Xám

Báo giá là không-op, _đẩy 0 vào ngăn xếp và ;loại bỏ đỉnh của ngăn xếp. Tất cả điều này chỉ là mã để buộc luồng điều khiển theo đúng cách và loại bỏ bất cứ thứ gì thêm từ đầu ngăn xếp.


Vì tò mò, làm thế nào bạn tạo ra hình ảnh giải thích? Bạn đã tự tạo ra nó?
Stefnotch

2
@Stefnotch, tôi đã sử dụng trình soạn thảo văn bản để đặt một tab giữa mỗi ký tự và sau đó dán mã vào Microsoft Excel để đặt từng ký tự vào ô riêng của nó. Tôi đã chọn tất cả các ô để cung cấp cho chúng chiều rộng và chiều cao bằng nhau. Sau đó, tôi điều chỉnh màu sắc và đường viền và chụp ảnh màn hình.
Robert Hickman

3

MATL , 29 byte

';#'&mXz!"@o?T}vn127\c&YD]]vx

Đầu vào là một chuỗi được bao trong các dấu ngoặc đơn.

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

Chương trình FizzBuzz quá dài cho các phiên dịch viên trực tuyến; thấy nó hoạt động ngoại tuyến trong gif này:

nhập mô tả hình ảnh ở đây

Giải trình

Giá trị bộ tích lũy được thực hiện dưới dạng số phần tử trong ngăn xếp. Điều này làm cho chương trình chậm hơn so với nếu giá trị của bộ tích lũy là một số duy nhất trong ngăn xếp, nhưng nó tiết kiệm được một vài byte.

';#'       % Push this string
&m         % Input string (implicit). Pushes row vector array of the same size with 
           % entries 1, 2 or 0 for chars equal to ';', '#' or others, respectively
Xz         % Remove zeros. Gives a column vector
!          % Transpose into a row vector
"          % For each entry
  @        %   Push current entry
  o?       %   If odd
    T      %     Push true. This increases the accumulator (number of stack elements)
  }        %   Else
    v      %     Concatenate stack into a column vector
    n      %     Number of elements
    127\   %     Modulo 127
    c      %     Convert to char
    &YD    %     Display immediately without newline
  ]        %   End
]          % End
vx         % Concatenate stack and delete. This avoids implicit display

3

Alice , 22 byte

I!?';-n+?h$'@u%?'#-n$O

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

Giải trình

Chúng tôi chỉ giữ trên ngăn xếp một bộ đếm duy nhất về số lượng ;chúng tôi đã gặp. Khi ngăn xếp trống (ví dụ khi bắt đầu chương trình), đây hoàn toàn là 0.

I!?';-n+?h$'@u%?'#-n$O
I                      Push codepoint of next char from input
 !?                    store it on the tape and reload it right away
   ';-n+               add 1 to the counter if this char is a semicolon,
                       0 otherwise
        ?h$'           If the input char was -1 (EOF) execute the next command,
                       otherwise push its codepoint
            @          Terminate the program (or push 64)
             u         Set all bits up to the most significant as equal to 1
                       this turns 64 (1000000b) into 127 (1111111b)
              %        Compute modulo
               ?       reload the input char from the tape
                '#-n$O if it is a hash, pop the counter and print
                       the corresponding character
                       wrap back to the start of the line

Một phiên bản ngắn hơn, nhưng không kết thúc của chương trình này có thể được tìm thấy ở đây .



Xin lỗi vì định dạng xấu, tôi đã đăng cái này từ điện thoại của mình, tôi sẽ sửa nó ngay khi tôi chạm tay vào máy tính
Leo

Các chương trình phải chấm dứt trừ khi có quy định khác trong thử thách.
Martin Ender

Bạn có thể lưu một byte bằng cách sử dụng 0x7F bằng chữ thay vì ~h.
Martin Ender

@MartinEnder đã khiến nó chấm dứt. Tôi không thể quản lý để chèn 0x7F vào mã, nhưng tôi nghĩ rằng sửa đổi thay thế này thú vị hơn nữa :)
Leo

3

JS (ES6), 97 92 byte

c=>(a=0,y="",c.split``.map(x=>x=="#"?(a%=127,y+=String.fromCharCode(a),a=0):x==";"?a++:0),y)

Đã thử thực hiện một cách tiếp cận khác với câu trả lời của Shaggy . Ồ tốt


3

; # + , 59 byte, không lọc

Ngôn ngữ đã được thực hiện sau thử thách này.

;;;;;~+++++++>~;~++++:>*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)

Hãy thử trực tuyến! Đầu vào được kết thúc bằng một byte null.

Giải trình

Thế hệ giống như từ câu trả lời Generate; # code của tôi . Sự khác biệt duy nhất ở đây là sự lặp lại.

Lặp lại

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   take input while != 0
  ~                                    swap
   <                                   read value from memory (;)
    :                                  move forward to the accumulator memory spot (AMS)
     -                                 flip Δ
      +                                subtract two accumulators into A
       !                               flip A (0 -> 1, else -> 0)
        (     (;))                     if A is nonzero, or, if A == ';'
         <                             read from AMS
          -;-                          increment
             >                         write to AMS
                  ::                   move to cell 0 (#)
                    <                  read value from memory (#)
                     +                 subtract two accumulators into A
                      -                flip Δ
                       ::              move to AMS
                         !(   )        if A == '#'
                           <           read from AMS
                            #          output mod 127, and clear
                             >         write to AMS
                               -:-     move back to initial cell

3

Bash + coreutils, 46 39 byte

tr -dc \;#|sed 'y/;/1/;s/#/.ZC7%P/g'|dc

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

Giải trình

(Cảm ơn Quack Quack cho -7 byte!)

Các trphần loại bỏ tất cả các nhân vật không liên quan (tôi có thể đặt này trong sedcho chính xác bytecount tương tự, nhưng sau đó nó không xử lý nhân vật linefeed đúng, vì sedchỉ còn sót lại và dcchỉ dậy cho linefeed đầu tiên với ?)

sedphần còn lại và xây dựng một dcchương trình:

Chuỗi ;trở thành chuỗi của 1(một chữ dài)

#trở thành .ZC7%P(nếu điều này tuân theo một chuỗi 1, .là một dấu thập phân cho một số không. Nhưng nếu nó ở đầu chương trình, hoặc theo sau #một chuỗi khác , thì nó là một chữ 0. Sau đó, nó lấy độ dài của số, sửa đổi nó, và In ASCII tương ứng.)


Bạn không cần phải thoát ra ;bên trong '...'và chỉ cần thay đổi dc -ez?thành dc. Bên cạnh đó, thay vì ;thêm 1 vào ngăn xếp, bạn có thể nhóm chúng lại với nhau và lấy chiều dài của chúng bằng cách sử dụng Zđể đạt tới tio.run/##S0oszvj/ này .
Kritixi Lithos

@Cowsquack Điều đó tốt, cảm ơn bạn! (và đó dc -ez?là hậu quả của việc cần thêm 0 để bắt đầu chương trình) Nhưng chương trình của bạn thêm đầu ra bổ sung stderrtrong các trường hợp liên tiếp #hoặc đầu vào không kết thúc #(trong cả hai trường hợp, ý tôi là sau khi xóa các ký tự không liên quan) . Tôi không biết nếu có sự đồng thuận, nhưng tôi cảm thấy như đầu ra thêm làm mất hiệu lực giải pháp. Mặc dù vậy, tôi đã điều chỉnh ý tưởng của bạn và cố gắng chỉ hơn một byte so với đề xuất của bạn mà không đưa dcra lỗi!
Sophia Lechner

Theo stderr này có thể được bỏ qua trừ khi thách thức nêu rõ như vậy, vì vậy rất thuận tiện cho dc. Cũng lưu ý rằng giải pháp hiện tại này không thành công với liên tiếp #bởi vì Zcủa 01, vì vậy nó kết quả đầu ra thay vì 0x01 0x00 (Tôi rơi vào bẫy rằng cùng là tốt, nhưng trình duyệt của tôi hiển thị unprintables như hexcodes của họ vì vậy tôi bắt gặp đó).
Kritixi Lithos

3

C, 65 64 60 byte

(-2 nhờ trần nhà)

c;f(char*s){for(c=0;*s;s++)c+=*s-35?*s==59:-putchar(c%127);}

Bạn sẽ cần phải khởi tạo cvề 0 để làm cho chức năng có thể sử dụng lại .
Conor O'Brien

@ ConorO'Brien Đã sửa. Thật không may, tôi đã không quản lý để đưa ra bất cứ điều gì ngắn hơn là chỉ thêm vào c=0, và tôi sẽ không muốn gian lận bằng cách sao chép từ câu trả lời của Dennis.
hvd

@ceilingcat Cảm ơn một lần nữa, tôi đã có thể lấy thêm ba byte sau đó. Điều này không sử dụng một mẹo trong câu trả lời của Dennis (được kiểm tra sau khi chỉnh sửa), nhưng lần này, đã quá nhiều thời gian trôi qua mà tôi đã quên tất cả về nó và tự mình nghĩ ra nó.
hvd
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.