Tạo mã


36

Liên quan đến: Tạo trình thông dịch; #

Trong thử thách liên kết ở trên, nhiệm vụ là tạo ra một trình thông dịch cho ngôn ngữ bí truyền ;#.

các ;#ngôn ngữ

Ngôn ngữ có chính xác hai lệnh: ;#(tất cả các ký tự khác bị người phiên dịch bỏ qua):

;: Tăng bộ tích lũy

#: Modulo bộ tích lũy bằng 127, in ký tự ASCII tương ứng và đặt lại bộ tích thành 0.

Thử thách

Bởi vì tôi lười biếng nhưng vẫn muốn thử nghiệm thêm một số testcase, tôi cần một chương trình hoặc chức năng chuyển đổi văn bản đơn giản thành ;#mã.

Đầu vào

Đầu vào là một chuỗi, được lấy làm đối số hoặc thông qua stdin. Nó sẽ chỉ chứa các ký tự ASCII có thể in và các dòng mới.

Đầu ra

Đầu ra là ;#chương trình được tạo bằng cách quay lại hoặc in ra thiết bị xuất chuẩn. Miễn là chương trình hợp lệ, nó có thể chứa các ký tự thừa khác với #;như tất cả các ký tự khác bị bỏ qua.

Ví dụ

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

Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Bảng xếp hạng


9
Rực rỡ! Vui mừng khi thấy; # đang được chú ý!
caird coinheringaahing

1
Bạn có thể kiểm tra đầu ra của mình tại đây , vì; # + là siêu bộ của; #.
Adám

3
Đầu ra có thể chứa ký tự bổ sung? ;#bỏ qua tất cả các ký tự khác, vì vậy chương trình được tạo vẫn sẽ hoạt động.
Dennis

2
@ Benoît: Mô-đun không liên quan khi tạo mã, vì việc tạo mã sử dụng số lượng tối thiểu luôn dễ dàng hơn ;. Thứ hai, 127 là chính xác, như đã nêu trong câu hỏi được liên kết có chứa thông số kỹ thuật của ngôn ngữ; #.
Joey

2
Đây không thực sự là transpiling. "Tạo #; mã" là một tiêu đề tốt hơn. Tôi sẽ thay đổi nó để đó.
Mego

Câu trả lời:



34

; # + , 40 byte

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

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

Mã được chia thành hai phần: tạo và lặp.

Thế hệ

;;;;;~+++++++>~;~++++:>

Điều này đặt các hằng số ;#vào bộ nhớ như vậy:

;;;;;~+++++++>~;~++++:>
;;;;;                     set A to 5
     ~                    swap A and B
      +++++++             add B to A 7 times
                          (A, B) = (5*7, 5) = (35, 5)
             >            write to cell 0
              ~           swap A and B
               ;          increment A
                ~         swap A and B
                          (A, B) = (35, 6)
                 ++++     add B to A 4 times
                          (A, B) = (59, 6)
                     :    increment cell pointer
                      >   write to cell 1

Lặp lại

*(-(;~<#~):<#-*:)
*                    read a character into A
 (            * )    while input is not a null byte:
  -                  flip Δ
   (     )           while A != 0
    ;                decrement
     ~               swap A and B
      <              read ";" into A
       #             output it
        ~            swap A and B
           :         decrement cell pointer
            <        read "#" into A
             #       output it
              -      flip Δ
               *     take another character from input
                :    increment cell pointer

1
Tất cả điều này từ một ngôn ngữ đùa tôi đã làm khi tôi buồn chán. Ta tự hào.
caird coinheringaahing

@RandomUser: D đó là một khái niệm thú vị để chơi xung quanh
Conor O'Brien

Huh. Điều gì xảy ra nếu tôi muốn chương trình in ra một byte null trong; #?
tuskiomi


@ ConorO'Brien tôi sẽ nhập nó vào chương trình của bạn như thế nào?
tuskiomi


12

Thạch , 10 8 7 byte

O”;ẋp”#

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

O”;ẋp”#  Main Link
O        Map over `ord` which gets the codepoint of every character
 ”;ẋ     Repeat ';' the required number of times
     ”#  '#'
    p    Cartesian Product; this puts a '#' at the end of each element in the array

Implicit Output shows as a single string

-2 byte nhờ @Emigna
-1 byte nhờ @Dennis


Bạn có thể làm O”;ẋ;€”#thay thế?
Emigna

@Emigna À, vâng, cảm ơn. Tôi không hiểu làm thế nào nó hoạt động nhưng tôi hiểu nó. Cảm ơn!
HyperNeutrino

4
;€có thể trở thành p.
Dennis

@Dennis Oh bây giờ tôi hiểu làm thế nào mà hoạt động. Cảm ơn! :)
HyperNeutrino

11

GS2 , 6 byte

■•;2•#

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

Hexdump có thể đảo ngược (xxd)

0000000: ff 07 3b 32 07 23                                ■•;2•#

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

■       Map the rest of the program over  all code points C of the input.
 •;         Push ';'.
   2        Multiply; repeat ';' C times.
    •#      Push '#'.

2
= cái quái gì vậy?
Erik the Outgolfer

1
2là lệnh nhân? GS2 thật kỳ lạ: P
Sản phẩm điện tử

1
@EriktheOutgolfer thực thi mã cho từng điểm mã của ký tự đầu vào o_O
Ông Xcoder

@EriktheOutgolfer Nghe có vẻ lạ hơn nó. chỉ là bản đồ và GS2 thực hiện các chuỗi dưới dạng danh sách các số nguyên.
Dennis

@ETHproductions GS2 không dựa trên ký tự; nó diễn giải mã nguồn dưới dạng luồng byte thô và thường không có kết nối giữa lệnh và ký tự CP-437 mà byte mã hóa. Trong mã byte x86_64, 2là XOR ...
Dennis

10

Taxi, 779 byte

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[c]Switch to plan "e" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:n 1 l 3 l 3 l.Pickup a passenger going to The Underground.Go to Writer's Depot:w 1 r.[p]; is waiting at Writer's Depot.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to The Underground:n 1 r 1 l.Switch to plan "n" if no one is waiting.Pickup a passenger going to The Underground.Go to Zoom Zoom:n 3 l 2 r.Go to Writer's Depot:w.Switch to plan "p".[n]# is waiting at Writer's Depot.Go to Writer's Depot:n 3 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Switch to plan "c".[e]

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

Ung dung:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[c]
Switch to plan "e" if no one is waiting.
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill: north 1st left 3rd left 3rd left.
Pickup a passenger going to The Underground.
Go to Writer's Depot: west 1st right.
[p]
; is waiting at Writer's Depot.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to The Underground: north 1st right 1st left.
Switch to plan "n" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Zoom Zoom: north 3rd left 2nd right.
Go to Writer's Depot: west.
Switch to plan "p".
[n]
# is waiting at Writer's Depot.
Go to Writer's Depot: north 3rd left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Switch to plan "c".
[e]

Giải trình:

Pick up stdin and split it into characters.
Covert each character to ASCII.
Print ";" as you count down from that ASCII to zero.
Print "#".
Pickup the next character and repeat until done.

+1 Tôi chỉ thích các ngôn ngữ như thế này và Mornington Crescent, mã này rất đẹp!
Karl-Johan Sjögren


9

Brainfuck, 43 byte

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

Null byte chấm dứt chương trình.

Giải trình

+[+[<]>->++]          59 (semicolon) location 5
--[>--<+++++++]>-       35 (hash) location 7
<,[                     input location 6
    [   while input byte not 0
        <.>     print semicolon
        -       decrement input byte
    ]
    >.< print hash
,]  loop while input not null

Đó là ấn tượng nhỏ cho Brainf * ck.
MD XF

gần như cạnh tranh với câu trả lời trăn. Ấn tượng.
raddish0


5

> <> , 22 byte

i:0(?;\"#"o
o1-:?!\";"

Dùng thử trực tuyến hoặc tại sân chơi cá

Đầu vào là STDIN, đầu ra là STDOUT. Trong> <>, các ký tự và mã ASCII là như nhau, vì vậy tất cả những gì chúng ta cần làm là đọc một ký tự, in ";"và giảm ký tự cho đến khi 0, sau đó in "#"và lặp cho đến khi không còn đầu vào nữa.


5

F #, 79 byte

let c i=System.String.Join("#",Seq.map(fun c->String.replicate(int c)";")i)+"#"

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

Mở rộng

// string -> string
let convert input =
    System.String.Join(
        "#",      // join the following char seq with "#"
        input     // replicate ";" n times where n = ASCII value of char c
        |> Seq.map (fun c-> String.replicate (int c) ";") 
    ) + "#" // and add the last "#" to the output

convert lấy chuỗi đầu vào và xuất ra một chương trình; #

Sử dụng

convert "Hello, World!" |> printfn "%s"
convert "ABC" |> printfn "%s"
convert ";#" |> printfn "%s"

4
Chúng tôi cần thêm câu trả lời F #
aloisdg nói Phục hồi lại

@aloitorg Tôi sẽ làm hết sức mình :)
Brunner


5

PowerShell, 29 27 25 byte

$args|% t*y|%{';'*$_+'#'}

Khá đơn giản. Lấy đầu vào làm đối số dòng lệnh. Đầu ra là một chương trình hợp lệ; # in văn bản được yêu cầu.


Nó cần phải tham gia chuỗi kết quả.
mê mẩn

@mazzy: Từ mô tả nhiệm vụ: »Miễn là chương trình hợp lệ, nó có thể chứa các ký tự thừa khác với #;như tất cả các ký tự khác bị bỏ qua.«
Joey

như bạn muốn :-)
mazzy

dấu ngoặc kép có thể được gỡ bỏ. $argsLà đủ.
mazzy

Trừ khi đối số là số.
Joey

4

Brainfuck , 47 byte

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

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

Xem thêm: câu trả lời của ovs , có cách tiếp cận tương tự, nhưng với một phương pháp tạo hằng số khác nhau và bố trí ô khác nhau.


Giải trình:

Thử thách này phù hợp với thông số brainfuck khá tốt, điều đó có nghĩa là giải pháp về cơ bản là tầm thường. Brainfuck lấy đầu vào là giá trị ASCII, chính xác là gì; # cần xuất ra dưới dạng.

Sơ đồ để dịch mã rất đơn giản: Tạo giá trị ASCII cho ;#, in ;bằng giá trị ASCII của ký tự đầu vào, in #, lặp lại cho mỗi đầu vào.

+++++++[-             7
         >++++++++       * 8 = 56
         >+++++<<        * 5 = 35 (#)
       ]>+++<                  56 + 3 = 59 (;)
,[                    Input into first cell
  [>.<-]              Print ;'s equal to ASCII input
  >>.<<,              Print one #
 ]                    End on EOF

-2 byte chỉ -1 nếu bạn đang tránh các ô tiêu cực
Jo King

4

Toán học, 49 byte

StringRepeat[";",#]<>"#"&/@ToCharacterCode@#<>""&

Giải trình

enter image description here

Chuyển đổi chuỗi đầu vào thành một danh sách mã ký tự, sau đó Maplà hàm StringRepeat[";",#]<>"#"&trên danh sách, sau đó StringJoinlà kết quả với chuỗi trống.


Tại sao bạn cần <>""?
Máy

@CalculatorFeline Nếu không có nó, tôi sẽ để lại một danh sách các chuỗi cho mỗi ký tự. StringJoining ( <>) chuỗi rỗng nối từng chuỗi.
ngenisis

Quên về điều đó: P
CalculatorFeline

3

Aceto , 19 byte

Vì có một thông dịch viên trong Aceto , tôi nghĩ rằng cũng có một câu trả lời Aceto cho thách thức này. Nó nằm gọn trong một đường cong Hilbert thứ 2:

\n;*
'o'p
`!#'
,dpO

Trước hết, chúng tôi đọc một ký tự đơn ( ,) và sao chép và phủ định nó để kiểm tra xem đó có phải là một dòng mới không (d! khi đọc một dòng mới, một ký tự trống thường được đẩy trên ngăn xếp). Sau đó, tôi sử dụng những gì tôi nghĩ là một mẹo khá thông minh để xử lý gọn nhẹ trường hợp dòng mới:

`'\n

Nếu giá trị trên ngăn xếp là True(chúng ta đọc một dòng mới), mã đó có nghĩa là: do ( `) đặt một ký tự bằng chữ trên ngăn xếp (' ), đó là một dòng mới : \n.

Nếu giá trị trên ngăn xếp là False(chúng tôi đã không đọc một dòng mới), mã đó có nghĩa là: không ( `) đọc một ký tự bằng chữ ( '). Điều đó có nghĩa là nhân vật tiếp theo được thực thi như một lệnh. May mắn thay, một dấu gạch chéo ngược thoát khỏi lệnh tiếp theo (nó làm cho nó không được thực thi), vì vậyn đó không in một dòng mới (đó là những gìn thường làm).

Phần còn lại của mã là đơn giản; chúng tôi chuyển đổi ký tự trên ngăn xếp thành số nguyên của mã số unicode ( o), chúng tôi đẩy một dấu chấm phẩy bằng chữ ( ';), nhân số với chuỗi ( *như trong Python), print kết quả, đẩy một chữ ( ') #, print nó cũng vậy, và quay trở lạiO rigin.

Chạy với -Fnếu bạn muốn xem kết quả ngay lập tức (vì bộ đệm), nhưng nó cũng hoạt động mà không có.


3

Perl, 24 byte

s/./";"x(ord$&)."#"/ges

Chạy với perl -pe.

Giải pháp thay thế:

say";"x ord,"#"for/./gs

Chạy với perl -nE.


3

Giải quyết , 11 byte

Yay, ngôn ngữ mới.

';@jx{'#}Ep

Giải trình

';           Push the code point of ';' (59).
  @j         Push the entire input as a list of code points.
    x        For each code point in the input, repeat 59 that many times.
     {  }E   For each resulting list of 59s:
      '#      Push the code point of '#' (35).
          p  Flatten and print as unicode characters.

3

Fourier , 19 byte

$(I(`;`&j)`#`0~j&i)

Hãy thử nó trên FourIDE!

Để chạy, bạn phải đặt chuỗi đầu vào trong dấu ngoặc kép.

Mã giả giải thích

While i != Input length
    temp = pop first char of Input
    While j != Char code of temp
        Print ";"
        Increment j
    End While
    Print "#"
    j = 0
    Increment i
End While


3

JavaScript, 55 54 51 50 48 byte

s=>1+[...s].map(c=>";".repeat(Buffer(c)[0])+"#")

Dùng thử trực tuyến

  • Lưu 1 byte nhờ Neil .

Lựa chọn thay thế

Nếu chúng ta có thể lấy đầu vào là một mảng các ký tự riêng lẻ thì 5 byte có thể được lưu.

a=>1+a.map(c=>";".repeat(Buffer(c)[0])+"#")

Nếu chúng ta cũng có thể xuất ra dưới dạng một mảng thì có thể lưu thêm 2 byte.

a=>a.map(c=>";".repeat(Buffer(c)[0])+"#")

\nnên trở thành ;;;;;;;;;;#.
Neil

Hmm ... thật lạ. Đoán tôi sẽ phải quay trở lại giải pháp lâu hơn, vì vậy. Cảm ơn, @Neil.
Xù xì

2
Tôi nghĩ rằng bạn có thể thay đổi .thành [^], mà vẫn để nó ngắn hơn một byte map/join?
Neil

Phải, đó là công việc, @Neil :)
Shaggy

Chỉ cần ngẩng cao đầu, join()câu trả lời trước đó của bạn là không cần thiết với đặc điểm kỹ thuật ;#và bạn cũng có thể tuyên bố rằng đầu vào cho chức năng của bạn là một mảng các ký tự, mặc dù gợi ý thứ hai hơi khó hiểu. Dù bằng cách nào, điều đó mang lại cho bạn tối đa 48 byte.
Patrick Roberts


2

APL (Dyalog) , 18 byte

'#',¨⍨';'⍴¨⍨⎕UCS

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

⎕UCS Convert to Unicode code points

';'⍴¨⍨ use each code point to reshape ( = RhoR; Reshape) a semicolon

#',¨⍨ append a hash to each string


2

Ruby, 28 25 bytes

24 bytes, plus the -n command line switch to repeatedly operate on stdin.

$_.bytes{|b|$><<?;*b+?#}

3 bytes saved (and output corrected on newlines!) thanks to manatwork.


You could avoid the use of .ord by working directly with character codes: $_.bytes{|b|$><<?;*b+?#}. There is difference: this one also encodes the newline in the input. Not sure what the question owner intends to say by “It will only contain printable ASCII characters and newlines.”, but to me sounds like newlines should be encoded too.
manatwork

Your Ruby-fu exceeds mine, @manatwork - I'd forgotten about bytes. I've asked OP about newlines up top and will edit this afterwards.
Chowlett


2

Alice, 12 bytes

'#I.h%&';d&O

Try it online!

Explanation

'#    Push 35, the code point of '#'.
I     Read a code point C from STDIN. Pushes -1 at EOF.
.h%   Compute C%(C+1). For C == -1, this terminates the program due to division
      by zero. For C > -1, this just gives back C, so it does nothing.
&';   Pop C and push that many 59s (the code point of ';').
d     Push the stack depth, which is C+1.
&O    Print that many code points from the top of the stack.
      The IP wraps around to the beginning and another iteration of this
      loop processes the next character.


2

jq, 30 characters

(26 characters code + 4 characters command line options)

explode|map(";"*.+"#")|add

Sample run:

bash-4.4$ jq -Rr 'explode|map(";"*.+"#")|add' <<< 'Hello, World!' | jq -Rrj '[scan(".*?#")|gsub("[^;]";"")|length%127]|implode'
Hello, World!

On-line test



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.