; # 코드 생성


36

관련 : ; # 인터프리터 만들기

위의 과제에서 난해한 언어에 대한 통역사를 만드는 것이 과제였습니다 ;#.

;#언어

이 언어에는 정확히 두 가지 명령이 있습니다 : ;#(다른 모든 문자는 인터프리터에 의해 무시됩니다) :

;: 누산기 증가

#: 어큐뮬레이터를 127 단위로 모듈화하고 해당 ASCII 문자를 인쇄 한 후 어큐뮬레이터를 0으로 재설정합니다.

도전

게으르지 만 여전히 더 많은 테스트 사례를 테스트하고 싶기 때문에 일반 텍스트를 ;#코드 로 변환하는 프로그램이나 함수가 필요합니다 .

입력

입력은 인수 또는 stdin을 통해 가져온 문자열입니다. 인쇄 가능한 ASCII 문자와 줄 바꿈 만 포함합니다.

산출

출력은 ;#stdout으로 리턴하거나 인쇄 하여 생성 된 프로그램입니다. 한 프로그램이 유효한 경우,이 이외의 여분의 문자를 포함 할 수 있습니다 #;다른 모든 문자는 무시됩니다있다.

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

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

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

리더 보드


9
훌륭한! 만나서 반갑습니다; #는 주목을 받고 있습니다!
caird coinheringaahing

1
; # +는; #의 상위 집합이므로 여기 에서 출력을 테스트 할 수 있습니다 .
Adám

3
출력에 추가 문자가 포함될 수 있습니까? ;#다른 모든 문자를 무시하므로 생성 된 프로그램이 계속 작동합니다.
Dennis

2
@ Benoît : 코드를 생성 할 때 모듈러스는 관련이 없습니다 ;. 최소의 수를 사용하는 코드를 생성하는 것이 항상 쉽기 때문입니다 . 둘째,; # 언어의 사양을 포함하는 링크 된 질문에 명시된 바와 같이 127이 맞습니다.
Joey

2
이것은 실제로 번역하는 것이 아닙니다. "Generate #; code"가 더 나은 제목입니다. 나는 그것을 그것으로 바꿀 것입니다.
Mego

답변:



34

; # + , 40 바이트

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

온라인으로 사용해보십시오! 입력이 널 바이트로 종료됩니다.

설명

코드는 생성과 반복의 두 부분으로 나뉩니다.

세대

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

이것은 상수 ;#메모리를 다음과 같이 넣습니다 .

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

되풀이

*(-(;~<#~):<#-*:)
*                    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
내가 지루했을 때 만든 농담 언어 에서이 모든 것. 나는 기뻐.
caird coinheringaahing

@RandomUser : D 재미있게 놀 수있는 개념
Conor O'Brien

응 프로그램이; #에서 null 바이트를 출력하도록하려면 어떻게해야합니까?
tuskiomi


@ ConorO'Brien 어떻게 프로그램에 입력합니까?
tuskiomi


12

젤리 , 10 8 7 바이트

O”;ẋp”#

온라인으로 사용해보십시오!

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

@Emigna 덕분에 -2 바이트 @Dennis 덕분에
-1 바이트


O”;ẋ;€”#대신 할 수 있습니까?
Emigna

@Emigna 아, 예, 감사합니다. 나는 그것이 어떻게 작동하는지 알지 못하지만 이해합니다. 감사!
HyperNeutrino

4
;€될 수 있습니다 p.
Dennis

@ 데니스 오 지금은 그것이 어떻게 작동하는지 이해합니다. 감사! :)
HyperNeutrino

11

GS2 , 6 바이트

■•;2•#

온라인으로 사용해보십시오!

가역 16 진수 덤프 (xxd)

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

작동 원리

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

2
= 도대체?
Outgolfer Erik

1
2곱셈 명령은 무엇입니까? GS2는 이상합니다 : P
ETHproductions

1
@EriktheOutgolfer는 입력의 각 문자 코드 포인트 o_O에 대한 코드를 실행합니다
Mr. Xcoder

@EriktheOutgolfer 그보다 더 멋진 소리. map 일 뿐이며 GS2는 문자열을 정수 목록으로 구현합니다.
데니스

@ETHproductions GS2는 문자 기반이 아닙니다. 소스 코드를 원시 바이트 스트림으로 해석하며 일반적으로 명령과 바이트가 인코딩하는 CP-437 문자 사이에는 연결이 없습니다. x86_64 바이트 코드에서 2XOR은 ...
Dennis

10

택시, 779 바이트

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]

온라인으로 사용해보십시오!

언 골프 드 :

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]

설명:

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 나는 이것과 Mornington Crescent와 같은 언어를 좋아합니다. 코드는 정말 아름답습니다!
Karl-Johan Sjögren


9

Brainfuck, 43 바이트

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

널 바이트는 프로그램을 종료합니다.

설명

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

Brainf * ck에게는 매우 작습니다.
MD XF

거의 파이썬 답변과 경쟁합니다. 감동적인.
raddish0


5

> <> , 22 바이트

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

온라인 또는 물고기 놀이터 에서 사용해보십시오

입력은 STDIN이고 출력은 STDOUT입니다. > <>에서 문자와 ASCII 코드는 동일하므로 문자를 읽고 ";"0이 될 때까지 문자를 인쇄 하고 감소시킨 다음 "#"더 이상 입력이 없을 때까지 인쇄 하고 반복하기 만하면됩니다.


5

F #, 79 바이트

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

온라인으로 사용해보십시오!

넓히는

// 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는 입력 문자열을 받아서; # 프로그램을 출력합니다

용법

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

4
우리는 더 F 번호의 대답을 필요
aloisdg는 분석 재개 모니카 말한다

@aloisdg 최선을 다하겠습니다 :)
Brunner


5

PowerShell, 29 27 25 바이트

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

꽤 직설적 인. 명령 행 인수로 입력을받습니다. 출력은 요청 된 텍스트를 인쇄하는 유효한; # 프로그램입니다.


결과 문자열을 결합해야합니다.
mazzy

@mazzy : 작업 설명에서 : »만큼 프로그램이 유효한 경우,이 이외의 여분의 문자를 포함 할 수 있습니다 #;다른 모든 문자는 무시됩니다 등을«.
조이

당신이 원하는대로 :-)
mazzy

따옴표를 제거 할 수 있습니다. $args충분하다.
mazzy

인수가 숫자가 아닌 한.
Joey

4

brainfuck , 47 바이트

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

온라인으로 사용해보십시오!

참조 : ovs 's answer . 비슷한 접근 방식을 취하지 만 상수를 생성하는 다른 방법과 다른 셀 레이아웃을 사용합니다.


설명:

이 도전은 brainfuck 사양과 잘 어울립니다. 이는 솔루션이 본질적으로 사소하다는 것을 의미합니다. Brainfuck은 입력을 ASCII 값으로 가져옵니다. 정확히 #으로 출력해야합니다.

트랜스 파일링에 대한 회로도는 간단합니다. ;#에 대한 ASCII 값을 생성 ;하고 입력 문자의 ASCII 값과 동일하게 인쇄 #하고 인쇄 하고 모든 입력에 대해 반복합니다.

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

-2 바이트 만 -1 당신이 부정적인 세포를 피하고 있다면
Jo King

4

매스 매 티카, 49 바이트

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

설명

여기에 이미지 설명을 입력하십시오

입력 문자열을 문자 코드 목록으로 변환 한 다음 Map함수 StringRepeat[";",#]<>"#"&를 목록에 표시 한 다음 StringJoin결과를 빈 문자열로 변환합니다.


왜 필요한 <>""가요?
CalculatorFeline

@CalculatorFeline 그것 없이는 각 문자에 대한 문자열 목록이 남을 것입니다. StringJoinING는 ( <>) 빈 문자열은 각각의 문자열을 연결합니다.
ngenisis 2016 년

그것에 대해 잊었다 : P
CalculatorFeline

3

아세토 , 19 바이트

Aceto 에는 통역사가 있기 때문에이 과제에 대한 Aceto 답변도 있다고 생각했습니다. 2 차 힐버트 곡선에 깔끔하게 맞습니다.

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

우선, 우리는 단일 문자 ( ,)를 읽고 그것을 개행하고 그것이 개행인지 테스트하기 위해 그것을 무효화합니다 ( d!개행을 읽을 때 빈 문자는 일반적으로 스택에 푸시됩니다). 그런 다음 줄 바꿈을 컴팩트하게 처리하는 꽤 영리한 트릭이라고 생각하는 것을 사용합니다.

`'\n

스택의 값이 True(개행을 읽는 경우) 해당 코드는 다음을 의미합니다. do ( `)는 스택에 문자 리터럴을 넣습니다 ( '), 개행 : \n.

스택의 값 False이 개행을 읽지 않은 경우 해당 코드 는 문자 리터럴 ( )을 읽지 않음 ( `)을 의미 '합니다. 이는 다음 문자가 명령으로 실행됨을 의미합니다. 다행히도 백 슬래시는 다음 명령을 이스케이프 (실행되지 않도록)하므로 n줄 바꿈을 인쇄하지 않습니다 ( n보통 수행하는 방식).

나머지 코드는 간단합니다. 우리는 유니 코드 코드 포인트 (의 정수로 스택에 문자 변환 o), 우리가 밀어 리터럴 세미콜론 ( ';), (문자열과 곱셈 수 *, 파이썬 등) p(리터럴을 눌러 결과를 RINT ') #, p그것을 RINT 또한, 다시 O이익 으로 돌아갑니다 .

로 실행 -F하면 (버퍼링 때문에) 즉각적인 결과를보고 싶다면,하지만 너무없이 작동합니다.


3

펄, 24 바이트

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

로 실행하십시오 perl -pe.

대체 솔루션 :

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

로 실행하십시오 perl -nE.


3

Solace , 11 바이트

예, 새로운 언어입니다.

';@jx{'#}Ep

설명

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

푸리에 , 19 바이트

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

FourIDE에서 사용해보십시오!

실행하려면 입력 문자열을 따옴표로 묶어야합니다.

의사 코드 설명

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

자바 스크립트, 55 54 51 50 48 바이트

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

온라인으로 사용해보십시오

  • Neil 덕분에 1 바이트가 절약되었습니다 .

대안

개별 문자 배열로 입력 할 수 있으면 5 바이트를 저장할 수 있습니다.

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

배열로 출력 할 수 있으면 2 바이트를 더 절약 할 수 있습니다.

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

\n이어야합니다 ;;;;;;;;;;#.
Neil

흠 ... 이상하다. 더 긴 솔루션으로 롤백해야 할 것 같아요. 감사합니다, @ 닐.
얽히고 설킨 Shaggy

2
난 당신이 바꿀 수 있다고 생각 .하는 [^], 어떤 여전히보다 바이트 짧은 떠날 것 map/join?
Neil

네, 그 일을 했어요, @ 닐 :)
Shaggy

join()대한 사양을 감안할 때 이전 답변 의 in은 불필요 ;#하며 함수의 입력은 문자 배열이지만 두 번째 제안은 약간의 확장이라고 선언 할 수도 있습니다. 어느 쪽이든, 그것은 최대 48 바이트로 당신을 가져옵니다.
Patrick Roberts



2

루비, 28 25 바이트

24 바이트와 -n명령 행 스위치가 반복적으로 작동합니다 stdin.

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

manatwork 덕분에 3 바이트가 절약되고 줄 바꿈으로 출력이 수정되었습니다!


.ord문자 코드로 직접 작업 하여 사용을 피할 수 있습니다 $_.bytes{|b|$><<?;*b+?#}. 차이점이 있습니다.이 또한 입력에서 줄 바꿈을 인코딩합니다. 질문 소유자가 "인쇄 가능한 ASCII 문자와 줄 바꿈 만 포함합니다."라는 말로 확실하지 않지만 줄 바꿈과 같은 소리도 인코딩해야합니다.
manatwork

귀하의 Ruby-fu가 내 @manatwork를 능가합니다-잊어 버렸습니다 bytes. OP에 줄 바꿈에 대해 물었고 나중에 편집 할 것입니다.
Chowlett


2

Alice , 12 바이트

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

온라인으로 사용해보십시오!

설명

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

PHP, 48 바이트

for(;$c?:~$c=~ord($argn[$i++]);)echo";#"[!++$c];

2

jq, 30 자

(26 자 코드 + 4 자 명령 행 옵션)

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

샘플 실행 :

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

온라인 테스트



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.