Hasilkan; kode #


36

Terkait dengan: Buat juru bahasa; #

Dalam tantangan terkait di atas, tugasnya adalah menciptakan penerjemah untuk bahasa esoterik ;#.

The ;#bahasa

Bahasa ini memiliki dua perintah: ;dan #(semua karakter lain diabaikan oleh penerjemah):

;: Menambah akumulator

#: Modulo akumulator dengan 127, cetak karakter ASCII yang sesuai dan reset akumulator ke 0.

Tantangan

Karena saya malas tetapi masih ingin menguji beberapa testcases lagi, saya memerlukan program atau fungsi yang mengubah teks biasa menjadi ;#kode.

Memasukkan

Masukan adalah string, diambil sebagai argumen atau melalui stdin. Ini hanya akan berisi karakter dan baris ASCII yang dapat dicetak.

Keluaran

Outputnya adalah ;#program yang dihasilkan dengan mengembalikan, atau mencetak ke stdout. Selama program ini valid, mungkin berisi kelebihan karakter selain #dan ;karena semua karakter lain diabaikan.

Contohnya

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

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

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

Papan peringkat


9
Cemerlang! Senang melihat; # mendapat perhatian!
caird coinheringaahing

1
Anda dapat menguji output Anda di sini , karena; # + adalah superset dari; #.
Adám

3
Bisakah output mengandung karakter tambahan? ;#mengabaikan semua karakter lain, sehingga program yang dihasilkan masih berfungsi.
Dennis

2
@ Benoît: Modulus tidak relevan ketika membuat kode, karena selalu lebih mudah untuk menghasilkan kode yang menggunakan jumlah minimum ;. Kedua, 127 benar, sebagaimana dinyatakan dalam pertanyaan terkait yang berisi spesifikasi bahasa;
Joey

2
Ini tidak benar-benar berubah. "Hasilkan #; kode" adalah judul yang lebih baik. Saya akan mengubahnya untuk itu.
Mego

Jawaban:



34

; # + , 40 byte

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

Cobalah online! Input diakhiri dengan byte nol.

Penjelasan

Kode ini dibagi menjadi dua bagian: generasi dan iterasi.

Generasi

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

Ini menempatkan konstanta ;dan #ke dalam memori sebagai berikut:

;;;;;~+++++++>~;~++++:>
;;;;;                     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

Perulangan

*(-(;~<#~):<#-*:)
*                    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
Semua ini dari bahasa lelucon yang saya buat ketika saya bosan. Aku tersanjung.
caird coinheringaahing

@RandomUser: D itu konsep yang menyenangkan untuk dimainkan
Conor O'Brien

Hah. Bagaimana jika saya ingin program mencetak byte nol dalam; #?
tuskiomi


@ ConorO'Brien bagaimana saya akan memasukkannya ke dalam program Anda?
tuskiomi


12

Jelly , 10 8 7 byte

O”;ẋp”#

Cobalah online!

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 terima kasih kepada @Emigna
-1 byte berkat @Dennis


Bisakah Anda melakukannya O”;ẋ;€”#?
Emigna

@Emigna Ah, ya, terima kasih. Saya tidak mengerti bagaimana cara kerjanya tetapi saya agak memahaminya. Terima kasih!
HyperNeutrino

4
;€bisa menjadi p.
Dennis

@ Dennis Oh sekarang saya mengerti cara kerjanya. Terima kasih! :)
HyperNeutrino

11

GS2 , 6 byte

■•;2•#

Cobalah online!

Hexdump yang dapat dibalik (xxd)

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

Bagaimana itu bekerja

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

2
= apa-apaan ini?
Erik the Outgolfer

1
2Apakah perintah multiplikasi? GS2 aneh: P
ETHproduksi

1
@EriktheOutgolfer mengeksekusi kode untuk masing-masing titik kode karakter input o_O
Mr. Xcoder

@EriktheOutgolfer Kedengarannya lebih bagus dari itu. hanya memetakan , dan GS2 mengimplementasikan string sebagai daftar bilangan bulat.
Dennis

@ETHproduksi GS2 tidak berbasis karakter; itu mengartikan kode sumber sebagai aliran byte mentah, dan biasanya tidak ada koneksi antara instruksi dan karakter CP-437 yang dikodekan byte. Dalam kode byte x86_64, 2adalah XOR ...
Dennis

10

Taksi, 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]

Cobalah online!

Tidak Disatukan:

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]

Penjelasan:

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 Saya suka bahasa seperti ini dan Mornington Crescent, kodenya sangat indah!
Karl-Johan Sjögren

9

05AB1E , 8 byte

Ç';×'#«J

Cobalah online!

Penjelasan

Ç          # convert each input char to its ascii value
 ';×       # repeat ";" those many times
    '#«    # append a "#" to each run of semi-colons
       J   # join to string

9

Brainfuck, 43 byte

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

Null byte mengakhiri program.

Penjelasan

+[+[<]>->++]          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

Itu sangat kecil untuk Brainf * ck.
MD XF

hampir bersaing dengan jawaban python. Impresif.
raddish0


5

> <> , 22 byte

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

Cobalah secara online , atau di taman bermain ikan

Input adalah STDIN, output adalah STDOUT. Dalam> <>, karakter dan kode ASCII adalah hal yang sama, jadi yang perlu kita lakukan adalah membaca karakter, mencetak ";"dan mengurangi karakter sampai 0, lalu cetak "#"dan putar hingga tidak ada lagi input yang tersisa.


5

F #, 79 byte

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

Cobalah online!

Diperluas

// 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 mengambil string input dan menghasilkan program; #

Pemakaian

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

4
Kami membutuhkan lebih banyak jawaban F
aloisdg mengatakan Reinstate Monica

@aloisdg Saya akan melakukan yang terbaik :)
Brunner


5

PowerShell, 29 27 25 byte

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

Cukup mudah. Mengambil input sebagai argumen baris perintah. Output adalah program yang valid; # yang mencetak teks yang diminta.


Perlu untuk menggabungkan string hasil.
mazzy

@mazzy: Dari uraian tugas: »Selama program ini valid, mungkin berisi kelebihan karakter selain #dan ;karena semua karakter lainnya diabaikan.«
Joey

seperti yang Anda inginkan :-)
mazzy

tanda kutip dapat dihapus. $argscukup.
mazzy

Kecuali jika argumennya numerik.
Joey

4

brainfuck , 47 byte

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

Cobalah online!

Lihat juga: jawaban Ovs , yang mengambil pendekatan yang serupa, tetapi dengan metode berbeda untuk menghasilkan konstanta dan tata letak sel yang berbeda.


Penjelasan:

Tantangan ini sejalan dengan spec brainfuck dengan cukup baik, yang berarti solusinya pada dasarnya sepele. Brainfuck mengambil input sebagai nilai ASCII, yang persis seperti apa; # perlu di-output.

Skema untuk pengubahan sederhana: Menghasilkan nilai ASCII untuk ;dan #, mencetak ;sama dengan nilai ASCII dari karakter input, mencetak #, ulangi untuk setiap input.

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

-2 Bytes Only -1 jika Anda menghindari sel
Jo King

4

Mathematica, 49 byte

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

Penjelasan

masukkan deskripsi gambar di sini

Mengonversi string input ke daftar kode karakter, lalu Maps fungsinya di StringRepeat[";",#]<>"#"&atas daftar, lalu StringJoinhasilnya dengan string kosong.


Mengapa Anda membutuhkannya <>""?
CalculatorFeline

@ CalculatorFeline Tanpanya saya akan dibiarkan dengan daftar string untuk setiap karakter. StringJoining ( <>) string kosong merangkai setiap string.
ngenisis

Lupa tentang itu: P
CalculatorFeline

3

Aceto , 19 byte

Karena ada penerjemah di Aceto , saya pikir tidak akan ada jawaban Aceto untuk tantangan ini juga. Ini cocok dengan rapi dalam kurva Hilbert urutan 2:

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

Pertama-tama, kita membaca satu karakter ( ,) dan menggandakan dan meniadakannya untuk menguji apakah itu adalah baris baru ( d!, ketika membaca baris baru, karakter kosong biasanya didorong pada tumpukan). Saya kemudian menggunakan apa yang saya pikir adalah trik yang cukup pintar untuk menangani kasus baris baru dengan kompak:

`'\n

Jika nilai pada stack adalah True(kita membaca baris baru), kode itu berarti: do ( `) meletakkan karakter literal pada stack ( '), yang merupakan baris baru:\n .

Jika nilai pada stack adalah False(kami tidak membaca baris baru), kode itu berarti: jangan ( `) membaca karakter literal ( '). Itu berarti karakter selanjutnya dieksekusi sebagai perintah. Untungnya, backslash lolos dari perintah berikutnya (itu membuatnya agar tidak dieksekusi), jadi ntidak mencetak baris baru (yang adalah apan biasanya dilakukan).

Sisa kode mudah; kita mengonversi karakter pada stack ke integer dari unicode codepoint ( o), kita mendorong titik koma literal ( ';), mengalikan angka dengan string ( *, seperti dalam Python), pmematahkan hasilnya, mendorong literal ( ') #, pmematahkannya juga, dan kembali ke menuO rigin.

Jalankan dengan -Fjika Anda ingin melihat hasil langsung (karena buffering), tetapi berfungsi juga.


3

Perl, 24 byte

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

Jalankan dengan perl -pe.

Solusi alternatif:

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

Jalankan dengan perl -nE.


3

Penghiburan , 11 byte

Yay, bahasa baru.

';@jx{'#}Ep

Penjelasan

';           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)

Cobalah di FourIDE!

Untuk menjalankan, Anda harus melampirkan string input dalam tanda kutip.

Pseudocode penjelasan

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])+"#")

Cobalah online

  • 1 byte disimpan berkat Neil .

Alternatif

Jika kita dapat mengambil input sebagai array karakter individu maka 5 byte dapat disimpan.

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

Jika kita juga bisa menampilkan sebagai array maka 2 byte lagi dapat disimpan.

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

\nharus menjadi ;;;;;;;;;;#.
Neil

Hmm ... itu aneh. Kira saya harus memutar kembali ke solusi yang lebih lama, jadi. Terima kasih, @Neil.
Shaggy

2
Saya pikir Anda bisa mengubah .ke [^], yang masih akan meninggalkan sebuah byte lebih pendek dari map/join?
Neil

Yup, itu berhasil, @Neil :)
Shaggy

Hanya kepala, join()jawaban Anda sebelumnya tidak perlu diberikan spesifikasi untuk ;#, dan Anda juga dapat menyatakan bahwa input untuk fungsi Anda adalah array karakter, meskipun saran kedua adalah sedikit peregangan. Either way, itu membawa Anda hingga paling banyak 48 byte.
Patrick Roberts

2

Sebenarnya , 11 byte

O⌠';*'#o⌡MΣ

Cobalah online!

Penjelasan:

O⌠';*'#o⌡MΣ
O            convert string to list of ASCII ordinals
 ⌠';*'#o⌡M   for each ordinal:
  ';*          repeat ";" that many times
     '#o       append "#"
          Σ  concatenate

2

APL (Dyalog) , 18 byte

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

Cobalah online!

⎕UCS Konversikan ke titik kode Unicode

';'⍴¨⍨ gunakan setiap titik kode untuk membentuk kembali ( = RhoR ; R eshape) titik koma

#',¨⍨ menambahkan hash ke setiap string


2

Ruby, 28 25 byte

24 byte, ditambah -nsaklar baris perintah untuk beroperasi berulang kali stdin.

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

3 byte disimpan (dan hasil koreksi pada baris baru!) Berkat manatwork.


Anda bisa menghindari penggunaan .orddengan bekerja secara langsung dengan kode karakter: $_.bytes{|b|$><<?;*b+?#}. Ada perbedaan: yang ini juga mengkodekan baris baru dalam input. Tidak yakin apa yang ingin dikatakan oleh pemilik pertanyaan dengan “Itu hanya akan berisi karakter ASCII yang dapat dicetak dan baris baru.”, Tetapi bagi saya terdengar seperti baris baru harus dikodekan juga.
manatwork

Ruby-fu Anda melebihi milik saya, @manatwork - Saya sudah lupa bytes. Saya telah bertanya OP tentang baris baru di bagian atas dan akan mengedit ini setelahnya.
Chowlett


2

Alice , 12 byte

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

Cobalah online!

Penjelasan

'#    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 karakter

(26 karakter kode + 4 opsi opsi baris perintah)

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

Contoh dijalankan:

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

Tes online



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.