; # 인터프리터 만들기


62

최근에 ;#두 가지 명령 만 있는 새로운 언어 ( "세미콜론 해시"로 발음)를 만들었습니다 .

; 누산기에 하나 추가

#누산기를 127 단위로 모듈화하면 ASCII 문자로 변환하여 줄 바꿈 없이 출력 합니다. 그런 다음 누산기를 0으로 다시 설정하십시오. 예, 127이 맞습니다.

다른 문자는 무시됩니다. 누산기에 영향을 미치지 않으며 아무 것도하지 않아야합니다.

당신의 임무는이 강력한 언어를위한 통역사를 만드는 것입니다!

전체 프로그램이거나 ;#프로그램을 입력으로 사용하고 올바른 출력을 생성 하는 기능이어야합니다 .

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: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

피즈 버즈 최대 100


1
인터프리터가 입력 끝에서 실행을 종료하지 않고 추가 출력을 생성하지 않고 무한 루프를 유지하는 것이 허용됩니까?
Leo

5
두 번째 예는 출력을 생성하기 위해 프로그램을 인코딩하는 프로그램이 궁금합니다. 재귀 컴파일!
frarugi87

@ 레오 예 괜찮습니다
caird coinheringaahing

1
@iamnotmaynard 세미콜론 해시
caird coinheringaahing

2
아마도 Wink Hash가 말하기 쉬울 것입니다.
James Waldby-jwpat7

답변:



17

자바 스크립트 (ES6), 76 82 80 바이트

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

데모

재귀 버전, 82 77 바이트

Neil 덕분에 5 바이트 절약

이것은 Fizz Buzz 예제와 같은 큰 입력에서 충돌이 발생할 수 있습니다.

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

f(s,a+(c==';'))재귀 버전에서 3 바이트를 떨어 뜨릴 수 있다고 생각 합니다.
Neil

@Neil 실제로 5 바이트를 절약합니다. :-)
Arnauld

나는 지금 정말 바보 같은 느낌이 든다. 나는 원래 버기 버전을 가지고 있었고 2 바이트를 빼서 버그를 고쳤다. 그러나 나는 잘못 계산하고 버기 버전은 실제로 7 바이트를 저장했습니다 ...
Neil

12

망막 , 336 63 67 65 66 62 59 바이트

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

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

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

가상 이스케이프 구문을 사용하는 읽기 가능한 버전 :

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

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

TIO가 소스 코드에서 허용하지 않기 때문에 NUL 바이트를 인쇄하지 않습니다. 또한 끝에 줄 바꿈을 추가로 인쇄하지만 그렇지 않으면 할 수 없다고 생각합니다. @Leo 덕분에 후행 줄 바꿈이 억제 되었습니다 .

-273이 (!) 덕분에 바이트 @ETHproductions을 .

@ovs 덕분에 -2 바이트 .

@Neil 덕분에 -3 바이트 . 멋진 34 바이트 솔루션을 확인하십시오 .


1
어머나 그러나 천 바이트를 절약 할 수는 +T`\x01-~`_\x03-\x7f`[^\x01¯]\x01없습니까? (물론 인쇄 할 수없는 문자를 단일 문자로 포함)
ETH 프로덕션

@ETHproductions 물론 가능합니다. 감사합니다! :)
eush77

1
#입력에 후행이없는 경우에도 현재 마지막 문자는 항상 출력에 있습니다. 두 번째 단계를(;{127}|;+$)
ovs

1
세 번째 줄에 +`가 필요합니까? 전체 일치 항목을 제거 할 때 두 번째 반복에서 대체 할 항목이 없어야합니다.
ovs

1
나는 34 바이트 : T`;#\x01-ÿ`\x80\x7F_ \x80+$(빈 줄) \+T`\x7Fo`\x01-\x80_`\x80[^\x80](16 진수 이스케이프를 사용하여 인쇄 할 수없는 문자를 표시)로 이것을 할 수 있다고 생각 합니다. null 대신 \ x7F를 출력합니다.
Neil

12

자바 8, 100 바이트

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

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


3
사이트에 오신 것을 환영합니다! :)
DJMcMayhem

나는 당신을 위해 FizzBuzz 예제와 함께 온라인 통역사에 대한 링크를 추가했습니다 (링크 텍스트가 너무 길어서 주석에 맞지 않았습니다)
Jonathan Allan

Java는 프로그램에 UTF-16을 사용합니다 . 따라서 이들은 100 바이트가 아니라 100 자 입니다.
Gerold Broser

5
@GeroldBroser Unicode는 문자 세트입니다. UTF-8 및 UTF-16은 해당 문자 세트의 두 가지 인코딩 입니다. ASCII 소스는 Java 프로그램으로 완벽하게 유효하며 ASCII로 인코딩 된 많은 Java 소스 파일이 있습니다 (이는 UTF-8이기도하므로 유니 코드 인코딩이기도합니다).

1
전체로서 81 바이트의 골프 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

apt , 18 바이트

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

뒤에 인쇄 할 수없는 \ x7f 문자가 %#있습니다. 온라인으로 테스트하십시오!

작동 원리

®   è'; %#   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, 답변을 확인해야합니다! 펀치에 나를 때리기 위해 이것에 약간의 시간을 보냈습니다. q'# ®è'; u# dì¯J같은 점수에 대해서도 작동합니다.
Shaggy

11

파이썬 , 65 바이트

이것은 초기 답변 의 골프입니다 .

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

온라인으로 사용해보십시오! 파이썬 2

온라인으로 사용해보십시오! 파이썬 3

설명

이것은 ;각각에 몇 개의 s가 있는지 결정 #하고 chrmod 127을 인쇄 하는 매우 간단한 대답 [:-1]입니다. 조금 이상 할 수있는 유일한 것은입니다 . 마지막 그룹은 삭제하지 않기 때문에 삭제해야 #합니다.

예를 들어

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

로 분할됩니다

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

그러나 우리는 값을 인쇄 ;;;#후 가 없기 때문에 마지막을 원하지 않습니다 .


1
하나의 TIO 링크에서 모든 테스트를 받으려고 바빴습니다. 를 제외 t하고 chr에 대한 chr x입니다.
Jonathan Allan

9

> <> , 35 바이트

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

온라인으로 사용해보십시오! 교체 0x7F의와 함께, ^?또는 "삭제".

메인 루프

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

입력 문자 ( i)를 취하고 0보다 작은 지 확인합니다. 즉 EOF ( :0(), 프로그램이 ( ?;) 이면 프로그램을 종료합니다 . 그렇지 않으면 입력이 #( :'#'=)와 같은지 확인하십시오 . 그렇다면 아래로 분기하고 루프 ( ?v... ^ ... <)를 다시 시작하십시오 .

카운터 로직

              ';'=?0
              

입력이 ;( ';'=)와 같은지 확인하십시오 . 그렇다면을 누르십시오 0. 그렇지 않으면 아무것도하지 마십시오. 메인 루프가 다시 시작됩니다.

인쇄 로직

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

입력 문자가 #인 경우 스택에서 입력을 꺼내고 ( ~) 스택 의 멤버 수를 가져오고 l( '␡') 127 ( )을 누른 다음 모듈러스 ( %)를 가져옵니다 . 그런 다음 문자 ( o) 로 출력 하고 새 스택 ( [0)을 시작하십시오 . 이것은 카운터를 "제로"합니다. 그런 다음 루프가 다시 시작됩니다.


3
나쁨> <>. 슬프다 :0(:(
caird coinheringaahing

9

파이썬 3, 69 바이트

@Wheat Wizard, @Uriel 덕분에 개선되었습니다.

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

3
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 여기서의 목표는 코드를 가능한 한 짧게 (바이트 단위) 만드는 것이므로 헤더에 바이트 수를 포함시켜야합니다. :)
Adnan

설명해 주셔서 감사합니다. 그 다음에 작업하겠습니다.
MrGeek

2
:s 뒤에 공백을 제거 할 수 있습니다 .
Pavel

1
74 바이트를 셉니다. tio.run/nexus/…
Dennis

2
또한 ';'==c공간을 절약하지만 if명령문을 전혀 사용하지 않으면 훨씬 짧아집니다.
데니스


8

루비, 41 35 34 자

( 40 34 33 문자 코드 + 1 문자 명령 행 옵션)

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

덕분에 :

  • (6 자)로 putc명시 적으로 변환 할 필요가 없음 을 제안하는 Jordan.chr
  • 불필요한 괄호를 찾는 Kirill L. (1 자)

샘플 실행 :

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

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


도 어린 시절에 C를했지만 완전히 잊었습니다 putc(). 감사합니다, @Jordan
manatwork

1
내 자신의 놀랍게도, 당신은 실제로 할 수 뒤에 괄호를 삭제할 수 있습니다 바이트 저장
키릴 L.

@KirillL., 좋은 캐치 감사합니다.
manatwork

7

05AB1E , 16 15 14 바이트

암호:

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

설명:

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

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


7

젤리 , 13 바이트

ṣ”#Ṗċ€”;%127Ọ

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

작동 원리

ṣ”#Ṗċ€”;%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
semicola존재하지 않는 단어 는 semicolons입니다.
아웃 골퍼 Erik


흠, 이상한 단어.
아웃 골퍼 Erik

@EriktheOutgolfer 위키 낱말 사전 누군가 누군가 가 영어로 라틴어 복수를 유효 하게 만들려고 했지만, 콜라세미 콜라 철자가 제공되어야합니다.
Cœur

7

MS-DOS의 x86 기계 코드-29 바이트

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

주석이 달린 어셈블리 :

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 바이트

Adnan 덕분에 -2 바이트

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

설명:

Î                       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

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


1
나는 당신이 바꿀 수 있다고 생각 i>}하여 +.
Adnan

6

망막 , 34 바이트

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

온라인으로 사용해보십시오! 테스트 케이스를 포함합니다. 편집 : @MartinEnder의 도움으로 2 바이트를 저장했습니다. 참고 : 코드에 인쇄 할 수없는 코드가 포함 &#x;되어 있으며 브라우저에서 ISO-8859-1 대신 Windows-1252를 사용하므로 코드를 사용 하면 잘못된 결과가 생성됩니다. 설명 : 첫 번째 줄 입력을 정리는 : ;로 변경 \x80, #\x7F(때문에 TIO로 제한) 및 다른 모든이 삭제됩니다. 그런 다음 \x80다른 앞에 있지 않은 것을 볼 때마다 \x80삭제하고 다음 문자의 코드를 주기적으로 증가시킵니다. 이것은 더 이상 없을 때까지 반복 됩니다. 가독성을위한 탈출구 :\x80 문자가 남지 됩니다. 널 바이트를 지원하는 원래 코드는 기본적으로 \xFF변경되지 않는 첫 번째 행과를 제외하고 인쇄 할 수없는 바이트에서 1을 뺍니다\x7F 해진다\x00

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

마지막 두 단계와 마지막 단계를 결합하여 바이트를 절약 할 수 있습니다 \x80([^\x80]|$).
마틴 엔더

@MartinEnder 감사합니다! 귀찮게 \s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?도 1 바이트 만 절약합니다.
Neil

아,하지만 [^\x80]|\x80$2 바이트를 절약한다고 생각합니다.
Neil

아 좋아요, 마지막은 작동합니다. 나는 또한 부정적인 예측을 시도했지만 s성가신 것입니다.
마틴 엔더

6

R, 97 90 86 84 바이트

기능 :

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

R이 시작되면 (숫자 ) F로 정의됩니다 .FALSE0

언 골프 드 :

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

이것이 R + pryr이어야합니까?
L3via5

@ L3viathan pryrR 패키지이므로 여전히 R 코드입니다.
Sven Hohenstein

R 코드이지만 추가 라이브러리를 설치해야합니다.
L3viathan

내 대답이 잘못되었다고 생각하십니까? 추가 패키지를 사용하지 않아야합니까?
Sven Hohenstein

2
@BLT 차이는 없습니다. 제 생각 에는 도전 전에 만들어진 추가 패키지를 사용하는 것은 문제가되지 않습니다 . 이것은 모든 언어에 해당됩니다. 파이썬에서는 importR에있는 동안 사용해야 하며 ::패키지의 함수에 직접 액세스 하는 데 사용할 수 있습니다 . 여기에서 추가 패키지가 사용되는 것을 종종 볼 수 있습니다 (예 : Python 및 Java). 그러나 토론에 참여하고 싶지 않기 때문에 이전 게시물을 변경했습니다.
Sven Hohenstein

5

파이썬, 82 바이트

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

1
@WheatWizard 당신이 이미 답변으로 이것을 게시 한 이후, 나는 올바른 행동이 업데이트보다는 그것을 공표하는 것이라고 믿는다
Uriel

4

일반 TeX, 156 바이트

\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

읽을 수있는

\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

문자를 상징적으로 인쇄 할 수 있습니까?
eush77


4

펄, 25 바이트

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

다음으로 실행 perl -043pe(4 바이트로 계산)perl -e 표준 ).

설명 : -043라인 종결자를 #(ASCII 043)으로 설정합니다. -p입력“줄”(실제로 # 구분 문자열)을 반복합니다. 각 "라인" y%;%%의 수를 계산합니다 ;. x/#/#로 끝나지 않는 프로그램 (예 : 세 번째 테스트 케이스)에 대해 추가 문자를 인쇄하지 않도록합니다. %127상당히 분명해야합니다. $_=일반적인 상용구입니다.


결함이 있지만 하나를 감동 ;;#;;;시킵니다 : # 2 대신 # 5를 출력합니다.
manatwork

이 결과를 어떻게 얻었습니까? 내 컴퓨터에서 echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxd올바르게 출력 00000000: 02됩니다. 를 생략 043했거나 #ASCII 043이 아닌 코드 페이지를 사용하는 경우 결과가 설명됩니다.
Grimy

1
죄송합니다. 죄송합니다. 테스트에 오타가있었습니다. 코드가 완벽하게 작동합니다.
manatwork

4

CJam, 27 바이트

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

설명:

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

대체 솔루션, 18 바이트

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

설명:

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

비즈니스 고양이 유효하지 않은 문자를 무시하지 않습니다.
Esolanging 과일

;어큐뮬레이터를 왜 삭제 해야 합니까?
caird coinheringaahing

@RandomUser 따라서 결국 문자열로 출력되지 않습니다.
ETHproductions

4

F #, 79 91 93 바이트

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

언 골프

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

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

편집 : ';'이외의 다른 문자를 처리하고있었습니다. 같이 '#'. 유효하지 않은 문자를 무시하도록 변경했습니다.

대안

F #, 107104 바이트

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

참조 셀 사용으로 3 바이트 절약

언 골프

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
        |_->()
    ]

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


4

Processing.js (Khanacademy 버전), 118 바이트

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

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

사용 된 처리 버전에 입력 방법이 없으므로 입력이 n에 배치됩니다.


당신은 기술적으로 자신의 입력 방법을 위조 할 수 있습니다 keyTyped=function(){ ... }: P
ETHproductions

@ETHproductions 역겨운 표정입니다.
Christopher

@RandomUser yay! 내가 해냈어! 처리 중 답변을 확인하고 싶습니다 (내 답변 확인)
Christopher

2
@RandomUser 1000 회 응답뿐만 아니라 2 ^ 10 회 (͡ ° ͜ʖ ͡ °)

@ Midnightas Ohhh 예
크리스토퍼

4

미로 , 61 47 바이트

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

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

설명

color coded image of the solution code

코드 실행은 왼쪽 상단에서 시작하고 첫 번째 세미콜론은 스택에서 암시 적 0을 버리고 오른쪽으로 계속합니다.

주황색

  • _3636을 스택에 밀어 넣습니다. 이것은 입력과#
  • } 스택의 상단을 보조 스택으로 이동
  • , 스택에서 문자의 정수 값을 푸시합니다
  • )스택을 증가시킵니다 (입력의 끝이면 스택을 0으로 만들고 프로그램의 흐름이 진행 @되고 종료됩니다)
  • { 보조 스택의 상단을 기본 스택의 상단으로 이동
  • -팝 y, 팝 x, x-y를 누릅니다. 이것은 입력을 #(ascii에서 35) 와 비교하기위한 것 입니다. 입력이 #코드 인 경우 자주색 섹션으로 계속 진행합니다 (스택의 상단이 0이기 때문에 IP가 이전 방향으로 계속 진행됨). 그렇지 않으면 녹색 섹션으로 계속 진행됩니다.

보라색

  • 127 스택에 127을 밉니다
  • % 팝 x, 팝 y, 푸시 x % y
  • . 스택의 상단 (누적 기)을 팝하고 문자로 출력

여기에서 회색 코드는 스택의 아무것도없이 프로그램의 왼쪽 상단으로 이동합니다.

초록

  • _24 스택에 24를 밀어 넣습니다
  • -팝 x, 팝 y, xy를 누릅니다. (24) 간의 차이 #;상기 입력 였다면 그래서 수표 ;. 그것이 ;코드 라면을 향해 계속 직진합니다 ). 그렇지 않으면 #스택의 높이를 밀어 올리는 방향으로 바뀝니다 (항상 양수, 프로그램은 다음 교차로에서 우회전하여 누산기를 증가시키는 코드를 놓치게됩니다)
  • ; 스택의 상단을 버린다
  • ) 묵시적 0이거나 출력 누적 기 역할을하는 이전에 증가 된 0 인 스택의 맨 위를 증가시킵니다.

여기에서 회색 코드는 누적 장치가있는 스택이있는 프로그램의 왼쪽 상단으로 이동합니다.

회색

따옴표는 _0 이 아니며 스택에 0을 넣고 스택 ;의 상단을 버립니다. 이 모든 것은 제어 흐름을 올바른 방식으로 강제하고 스택 맨 위에서 여분의 것을 버리는 코드입니다.


호기심으로 설명 이미지를 어떻게 생성 했습니까? 직접 만들었습니까?
Stefnotch

2
@ Stefnotch, 텍스트 편집기를 사용하여 각 문자 사이에 탭을 넣은 다음 각 문자를 자체 셀에 넣는 Microsoft Excel에 코드를 붙여 넣었습니다. 모든 셀을 선택하여 동일한 너비와 높이를 지정했습니다. 그런 다음 색상과 테두리를 조정하고 스크린 샷을 찍었습니다.
Robert Hickman

3

MATL , 29 바이트

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

입력은 작은 따옴표로 묶인 문자열입니다.

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

FizzBuzz 프로그램은 온라인 통역사에게 너무 깁니다. 이 GIF에서 오프라인으로 작동하는 것을 참조하십시오 :

enter image description here

설명

누산기 값은 스택의 요소 수로 구현됩니다. 이렇게하면 누적 기 값이 스택의 단일 숫자 인 경우보다 프로그램이 느려지지만 몇 바이트는 절약됩니다.

';#'       % 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 바이트

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

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

설명

우리는 ;우리가 만난 수의 단일 카운터 만 스택에 유지합니다 . 스택이 비어있는 경우 (예 : 프로그램 시작시) 이것은 내재적으로 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

이 프로그램의 더 짧지 만 종료되지 않은 버전은 여기 에서 찾을 수 있습니다 .



형식이 잘못되어 죄송합니다. 휴대 전화에서이 정보를 게시했습니다. PC에 손이
Leo

챌린지에 달리 명시되지 않는 한 프로그램은 종료 해야합니다.
마틴 엔더

대신 리터럴 0x7F를 사용하여 바이트를 저장할 수 있습니다 ~h.
마틴 엔더

@MartinEnder가 종료했습니다. 코드에 0x7F를 삽입 할 수 없었지만이 대체 수정이 더 흥미 롭다고 생각합니다. :)
Leo

3

JS (ES6), 97 92 바이트

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

Shaggy의 답변 과 다른 접근법을 시도했습니다 . 오 잘


3

; # + , 59 바이트, 비경쟁

이 도전 후에 언어가 만들어졌습니다.

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

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

설명

세대는 내 Generate; # code answer 와 동일 합니다. 여기서 유일한 차이점은 반복입니다.

되풀이

*(~<:-+!(<-;->(;))::<+-::!(<#>)-:-*)
*(                                *)   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 바이트

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

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

설명

(7 바이트 동안 Cows Quack에게 감사합니다!)

tr(필자는이를 넣어 수있는 부분은없는 문자가 제거 sed하기 때문에, 정확히 같은 bytecount가 들어 있지만, 그것은 제대로 줄 바꿈 문자를 처리하지 않습니다 sed그들을 떠나 dc만을 가진 첫번째 라인 피드에 일어나서 ?)

sed나머지는 dc프로그램을 빌드합니다 .

(긴 리터럴) ;의 문자열이 되는 문자열1

#되고 .ZC7%P이 문자열은 다음과 경우 ( 1의가 .. 무 조작에 대한 소수점입니다하지만 프로그램의 시작 부분에 있는지, 또는 다른 다음 #, 그것은 리터럴 있어요 0. 그 다음은 숫자의 길이를 소요 개조 그것은, 해당 ASCII를 인쇄합니다.)


;내부 를 벗어날 필요가 없으며 '...'간단히로 변경할 dc -ez?dc있습니다. 그 외에도 ;스택에 1을 추가하는 대신 그룹을 묶고 길이를 가져 와서 tio.run/##S0oszvj/…Z 에 도달 할 수 있습니다 .
Kritixi Lithos

@Cowsquack 감사합니다. 감사합니다! (그리고 dc -ez?프로그램을 시작하기 위해 여분의 0이 필요 했기 stderr때문에) 프로그램 은 연속적 #이거나 끝나지 않는 입력 의 경우에 추가 출력을 추가합니다 #(두 경우 모두 외부 문자가 제거 된 후에 의미합니다) . 나는 합의가 있는지 모르겠지만 여분의 출력이 솔루션을 무효화하는 것처럼 느낍니다. 그래도 나는 당신의 아이디어를 수정했으며 dc오류 를 던지지 않고 제안보다 1 바이트 더 많이 감았습니다 !
Sophia Lechner

stderr 에 따르면 도전이 명시 적으로 명시하지 않는 한 무시할 수 있으므로 dc에 매우 편리합니다. 또한이 현재 솔루션 은 is #때문에 연속 s로 실패 하므로 0x00 대신 0x01을 출력합니다 (동일한 트랩에도 떨어지지 만 브라우저는 16 진수 코드로 인쇄 할 수없는 파일을 표시하므로 잡았습니다). Z01
Kritixi Lithos

3

씨, 65 64 60 바이트

(천장 고개 덕분에 -2)

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

c함수를 재사용 가능 하게하려면 0 으로 초기화해야합니다 .
코너 오브라이언

@ ConorO'Brien 고정. 불행히도 나는 단순히을 추가하는 것보다 짧은 것을 찾지 못했습니다 c=0. 데니스의 대답에서 복사하여 속임수를 쓰고 싶지 않습니다.
hvd

@ceilingcat 다시 한번 감사드립니다, 그 후 3 바이트를 더 가져올 수있었습니다. 이것은 Dennis의 답변에 트릭을 사용하지만 (편집 후 확인) 이번에는 너무 많은 시간이 지났으므로 잊어 버렸고 스스로 해결했습니다.
hvd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.