Wygeneruj; # kod


36

Powiązane z: Make a; # interpreter

W powyższym powiązanym wyzwaniu zadaniem było stworzenie tłumacza dla ezoterycznego języka ;#.

;#język

Język ma dokładnie dwie komendy: ;i #(wszystkie inne znaki są ignorowane przez tłumacza):

;: Zwiększ akumulator

#: Zmoduluj akumulator o 127, wydrukuj odpowiedni znak ASCII i zresetuj akumulator do 0.

Wyzwanie

Ponieważ jestem leniwy, ale nadal chcę testować więcej przypadków testowych, potrzebuję programu lub funkcji, która konwertuje zwykły tekst na ;#kod.

Wkład

Dane wejściowe są ciągiem, traktowanym jako argument lub przez stdin. Będzie zawierać tylko drukowalne znaki ASCII i znaki nowej linii.

Wydajność

Dane wyjściowe to wygenerowany ;#program, zwracając lub drukując na standardowe wyjście. Tak długo, jak program jest poprawny, może zawierać nadmiar znaków innych niż #i ;wszystkie inne znaki są ignorowane.

Przykłady

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

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

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

Tabela liderów


9
Znakomity! Cieszę się, że; # przyciąga uwagę!
caird coinheringaahing

1
Można przetestować wyjście tutaj , jak; # + jest rozszerzeniem; #.
Adám

3
Czy wyjście może zawierać dodatkowy znak? ;#ignoruje wszystkie inne znaki, więc wygenerowany program nadal będzie działał.
Dennis

2
@ Benoît: Moduł nie ma znaczenia przy generowaniu kodu, ponieważ zawsze łatwiej jest wygenerować kod, który używa minimalnej liczby ;. Po drugie, 127 jest poprawne, jak stwierdzono w łączonym pytaniu, które zawiera specyfikację języka; #.
Joey

2
To nie jest tak naprawdę transpilacja. „Wygeneruj #; kod” to lepszy tytuł. Zamienię to na to.
Mego

Odpowiedzi:



34

; # + , 40 bajtów

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

Wypróbuj online! Wejście jest zakończone bajtem zerowym.

Wyjaśnienie

Kod podzielony jest na dwie części: generację i iterację.

Generacja

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

To wprowadza stałe ;i #do pamięci jako takiej:

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

Iteracja

*(-(;~<#~):<#-*:)
*                    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
Wszystko to z żartobliwego języka, który zrobiłem, kiedy się nudziłem. Pochlebia mi
caird coinheringaahing

@RandomUser: D to fajna koncepcja do zabawy
Conor O'Brien

hę Co jeśli chcę, aby program wypisał bajt zerowy; #?
tuskiomi


@ ConorO'Brien, jak mam to wprowadzić do twojego programu?
tuskiomi


12

Galaretka , 10 8 7 bajtów

O”;ẋp”#

Wypróbuj 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 bajty dzięki @Emigna
-1 bajtów dzięki @Dennis


Mógłbyś O”;ẋ;€”#zamiast tego zrobić ?
Emigna

@Emigna Ach, tak, dziękuję. Nie bardzo rozumiem, jak to działa, ale rozumiem to. Dzięki!
HyperNeutrino

4
;€może zostać p.
Dennis

@Dennis O, teraz rozumiem, jak to działa. Dzięki! :)
HyperNeutrino

11

GS2 , 6 bajtów

■•;2•#

Wypróbuj online!

Odwracalny zrzut heksadecymalny (xxd)

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

Jak to działa

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

2
= co do cholery?
Erik the Outgolfer

1
2jest to polecenie mnożenia? GS2 jest dziwny: P
ETHprodukcje

1
@EriktheOutgolfer wykonuje kod dla każdego z punktów kodowych znaku wejściowego o_O
Mr. Xcoder

@EriktheOutgolfer To brzmi bardziej pomysłowo niż jest. jest po prostu mapą , a GS2 implementuje ciągi jako listy liczb całkowitych.
Dennis

@ETHproductions GS2 nie jest oparty na znakach; interpretuje kod źródłowy jako nieprzetworzony strumień bajtów i zwykle nie ma połączenia między instrukcją a znakiem CP-437, który koduje bajt. W kodzie bajtowym x86_64 2jest XOR ...
Dennis

10

Taxi, 779 bajtów

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]

Wypróbuj online!

Nie golfowany:

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]

Wyjaśnienie:

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 Uwielbiam języki takie jak ten i Mornington Crescent, kod jest tak piękny!
Karl-Johan Sjögren

9

05AB1E , 8 bajtów

Ç';×'#«J

Wypróbuj online!

Wyjaśnienie

Ç          # 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 bajty

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

Bajt zerowy kończy program.

Wyjaśnienie

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

To imponująco małe jak na Brainf * ck.
MD XF

prawie konkuruje z odpowiedzią na python. Imponujący.
raddish0


5

> <> , 22 bajty

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

Wypróbuj online lub na placu zabaw dla ryb

Wejście to STDIN, wyjście to STDOUT. W> <> znaki i kody ASCII są tym samym, więc wszystko, co musimy zrobić, to odczytać znak, wydrukować ";"i zmniejszyć znak do zera, a następnie drukować "#"i zapętlać, dopóki nie pozostanie więcej danych wejściowych.


5

F #, 79 bajtów

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

Wypróbuj online!

Rozszerzony

// 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

konwersja pobiera ciąg wejściowy i wyprowadza program; #

Stosowanie

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

4
Potrzebujemy więcej odpowiedzi w języku F #
aloisdg mówi: Przywróć Monikę

@aloisdg Zrobię co w mojej mocy :)
Brunner


5

PowerShell, 29 27 25 bajtów

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

Całkiem proste. Pobiera dane wejściowe jako argument wiersza polecenia. Dane wyjściowe to poprawny program #, który drukuje żądany tekst.


Musi dołączyć ciągi wyników.
mazzy

@mazzy: Z opisu zadania: »Dopóki program jest poprawny, może zawierać nadmiar znaków innych niż #i ;wszystkie inne znaki są ignorowane.«
Joey,

jak sobie życzysz :-)
mazzy

cudzysłowy można usunąć. $argswystarczy.
mazzy

Chyba że argument jest liczbowy.
Joey,

4

pieprzenie mózgu , 47 bajtów

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

Wypróbuj online!

Zobacz także: odpowiedź ovsa , która przyjmuje podobne podejście, ale z inną metodą generowania stałych i innym układem komórek.


Wyjaśnienie:

To wyzwanie całkiem nieźle się zgadza ze specyfiką pieprzenia mózgu, co oznacza, że ​​rozwiązanie jest w zasadzie banalne. Brainfuck pobiera dane wejściowe jako wartości ASCII, co jest dokładnie tym; # trzeba wyprowadzać jako.

Schemat transpilacji jest prosty: wygeneruj wartość ASCII dla ;i #wypisz ;równą wartości ASCII znaku wejściowego, wydrukuj #, powtórz dla każdego wejścia.

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

-2 Bajty Tylko -1, jeśli unikasz ujemnych komórek
Jo King,

4

Mathematica, 49 bajtów

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

Wyjaśnienie

wprowadź opis zdjęcia tutaj

Konwertuje ciąg wejściowy na listę kodów znaków, następnie Maps funkcja StringRepeat[";",#]<>"#"&nad listą, a następnie StringJoinwynik z pustym ciągiem.


Dlaczego potrzebne <>""?
CalculatorFeline,

@CalculatorFeline Bez niego zostałbym z listą ciągów znaków dla każdego znaku. StringJoining ( <>) pusty ciąg łączy każdy ciąg.
ngenisis

Zapomniałem o tym: P
CalculatorFeline

3

Aceto , 19 bajtów

Ponieważ w Aceto jest tłumacz , pomyślałem, że odpowiedź Aceto na to wyzwanie również będzie możliwa. Pasuje idealnie do krzywej Hilberta drugiego rzędu:

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

Przede wszystkim odczytujemy pojedynczy znak ( ,), duplikujemy go i negujemy, aby sprawdzić, czy jest to nowa linia ( d!podczas czytania nowej linii zwykle pusty znak jest umieszczany na stosie). Następnie używam czegoś, co moim zdaniem jest dość sprytną sztuczką, aby poradzić sobie z nowym przypadkiem kompaktowo:

`'\n

Jeżeli wartość na stosie jest True(czytamy nowej linii), co oznacza, że kod: nie ( `) umieścić znak literalny na stosie ( '), która jest znak nowej linii: \n.

Jeśli wartość na stosie to False(nie czytaliśmy nowego wiersza), ten kod oznacza: nie ( `) czytaj literału znaku ( '). Oznacza to, że następny znak jest wykonywany jako polecenie. Na szczęście ukośnik odwraca się od następnego polecenia (powoduje, że nie można go wykonać), więc nnie drukuje nowego wiersza (co nzwykle robi).

Reszta kodu jest prosta; konwertujemy znak na stosie na liczbę całkowitą jego kodu Unicode ( o), wciskamy literał średnik ( ';), mnożymy liczbę przez ciąg znaków ( *podobnie jak w Pythonie), printujemy wynik, push literal ( ') #, printujemy i wróć do Orutyny.

Uruchom, -Fjeśli chcesz zobaczyć natychmiastowe wyniki (ponieważ buforowanie), ale działa również bez.


3

Perl, 24 bajty

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

Uruchom z perl -pe.

Alternatywne rozwiązanie:

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

Uruchom z perl -nE.


3

Pociecha , 11 bajtów

Tak, nowe języki.

';@jx{'#}Ep

Wyjaśnienie

';           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 bajtów

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

Wypróbuj na FourIDE!

Aby uruchomić, musisz ująć ciąg wejściowy w cudzysłów.

Objaśnienie pseudokod

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 bajtów

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

Wypróbuj online

  • 1 bajt zapisany dzięki Neilowi .

Alternatywy

Jeśli możemy przyjąć dane wejściowe jako tablicę pojedynczych znaków, można zapisać 5 bajtów.

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

Jeśli możemy również wyprowadzać dane jako tablicę, można zapisać jeszcze 2 bajty.

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

\npowinno stać się ;;;;;;;;;;#.
Neil

Hmm ... to dziwne. Chyba będę musiał cofnąć się do dłuższego rozwiązania, więc. Dziękuję, @Neil.
Kudłaty

2
Myślę, że mógłbyś zmienić .na [^], co wciąż pozostawiałoby bajt krótszy niż map/join?
Neil

Tak, to zadziałało, @Neil :)
Kudłaty

Tylko jedna głowa, join()poprzednia odpowiedź była niepotrzebna, biorąc pod uwagę specyfikację ;#, i możesz również zadeklarować, że dane wejściowe dla twojej funkcji to tablica znaków, chociaż druga sugestia jest nieco rozciągnięta. Tak czy inaczej, obniża to maksymalnie 48 bajtów.
Patrick Roberts,

2

Właściwie 11 bajtów

O⌠';*'#o⌡MΣ

Wypróbuj online!

Wyjaśnienie:

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 bajtów

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

Wypróbuj online!

⎕UCS Konwertuj na punkty kodowe Unicode

';'⍴¨⍨ użyj każdego punktu kodowego, aby zmienić kształt ( = RhoR ; R eshape) średnikiem

#',¨⍨ dodaj skrót do każdego łańcucha


2

Rubinowy, 28 25 bajtów

24 bajty plus -nprzełącznik wiersza poleceń do wielokrotnego działania stdin.

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

3 bajty zapisane (i dane wyjściowe poprawione na nowych liniach!) Dzięki manatwork.


Można uniknąć stosowania .ordprzez pracę bezpośrednio z kodów znakowych $_.bytes{|b|$><<?;*b+?#}. Jest różnica: ta również koduje nowy wiersz na wejściu. Nie jestem pewien, co właściciel pytania chce powiedzieć przez „Będzie zawierać tylko drukowalne znaki ASCII i znaki nowej linii”, ale dla mnie brzmi to tak, jakby znaki nowej linii również powinny zostać zakodowane.
manatwork

Twój Ruby-fu przewyższa mój, @manatwork - o czym zapomniałem bytes. Zapytałem OP o nowe linie na górze i będę to później edytować.
Chowlett


2

Alice , 12 bajtów

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

Wypróbuj online!

Wyjaśnienie

'#    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 znaków

(26-znakowy kod + 4-znakowe opcje wiersza poleceń)

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

Przykładowy przebieg:

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

Test online



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.