RLE Brainfuck 방언


14

RLE Brainfuck

( BF-RLE 관련 )

Brainfuck 의 가상 RLE ( Run-Length Encoding ) 방언은 8 개의 명령에 대한 기호를 허용하고 숫자도 허용합니다. 숫자는 명령의 연속 반복 횟수를 나타내는 데 사용되므로 소스 코드의 실행 길이 인코딩이 가능합니다.

8>와 같습니다 >>>>>>>>.

길이는 항상 명령의 왼쪽에 있습니다.

당신의 임무는 입력 문자열 (RLE Brainfuck 프래그먼트)을 일반적인 Brainfuck 프로그램으로 변환하는 가장 짧은 프로그램 / 기능을 작성하는 것입니다.

예를 들면 다음과 같습니다.

입력:

10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.

오 pt 트 :

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

각 언어에서 가장 짧은 바이트 수의 코드가 이깁니다.


10
안녕하세요,이 질문은 하나 또는 두 개의 RLE 기반 정규식 알고리즘에 의해 지배 될 것이라고 생각하기 때문에이 질문을 하향 조정했습니다. 그런 다음 각 언어의 개별 정규식 형식으로 복사됩니다. 여기 골프를 할 공간이 거의 없습니다.
AdmBorkBork

13
이것은 일반적인 실행 길이 디코딩 문제 와 매우 유사합니다 . 여기서 차이점은 여러 자리 숫자가 지원된다는 것입니다. 나는 아직도 속임수라고 생각하지만 망치지는 않을 것입니다.
xnor

4
@xnor 또 다른 차이점은 숫자가 항상 존재하지 않는다는 것입니다.이 형태의 RLE는 훨씬 적은 구조를 보장하며 IMO는 흥미로운 기술을 이끌어 낼 수 있습니다 (여기에서 파이썬 답변을 연결된 도전 과제의 답변과 비교하십시오!)
Lynn

1
@Lynn 이것을 명시 적으로 설명하지는 않았지만 예제에서 볼 수 있듯이 1은 생략되었습니다. 0을 추가해도 문자열이 더 짧아지지 않으므로 대답은 아니요이며 0은 명령 앞에 붙일 수 없습니다.
Galen Ivanov

6
다른 방향은 더 흥미로울 것이라고 생각합니다 (즉, 가장 짧은 동등한 RLE brainfuck 프로그램에서 brainfuck 프로그램을 변환하십시오).
Paŭlo Ebermann

답변:


24

파이썬 2 , 62 61 바이트

lambda s:eval(re.sub('(\d*)(.)',r'+1*\1*1*"\2"',s))
import re

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

정규식 대체 3<2+-는 문자열로 확장 됩니다.

+1*3*1*"<"+1*2*1*"+"+1**1*"-"

그런 다음 eval에드. (때 어떻게 참고 \1비어있는, 우리가 얻을 1**1 = 1.) 첫 번째는 +단항 연산자 첫 번째 숫자에 결합이고, 다른 +s는 문자열 연결입니다. 이것은 더 명백한

lambda s:re.sub('(\d+)(.)',lambda m:int(m.group(1))*m.group(2),s)
import re

14 바이트 일반적으로는 "\2"항상 일을하지,하지만 다행히도 \"브레인 퍽 명령하지 않습니다.


xnor1*\1*1트릭을 제공하여 바이트를 저장했습니다 . 이전에 내가 가진 \1L정규식에, 그리고 정의 L=1도 꽤 멋진 람다 인수로 : 3L긴 INT의 리터럴과 L변수입니다.


1
L빈 문자열을 처리하는 데 사용 합니다. 그래도 더 짧은 방법이 있습니다 r'+1*\1*1*"\2"'.
xnor

3
... 왜 import re람다 아래에 있습니까?
Fund Monica의 소송

1
람다를 먼저 두는 것은 tio.run의 Header / Footer 기능을 사용하여 코드를 호출하는 방법을 보여줄 수 있음을 의미 f=\ 합니다 (헤더에 넣었 습니다. 이제 람다는 이름이 있습니다!)
Lynn

18

Pyth , 2 바이트

r9

여기 사용해보십시오!

작동 원리

r9-STDIN에서 문자열을 수신하는 전체 프로그램.

r-Pyth의 확장 문자열 연산 세트.
 9-해당 세트의 아홉 번째 명령 (런 길이 디코드). 여러 자리 숫자를 지원합니다.

31
필요한 알림 : 사소한 해결책 (이것과 같은) 을지지하지 마십시오 .
Mr. Xcoder

4
그 명령에 대해 알고 숫자가
빠졌을

1
@ Mr.Xcoder 잠깐만 요? 코드 골프의 전체 지점이 가장 적은 바이트 수를 갖지 않습니까?
집사

4
@Deacon은 그렇습니다.하지만 골프 파이썬 답변은 일반적으로 2 바이트 golflang 답변보다 만들기가 훨씬 어렵고 흥미 롭습니다.
Stephen

8
@Deacon Upvoting은 단순한 솔루션을지지하는 것이 아닙니다. 사용자는 일반적으로 골프 언어의 사소한 짧은 솔루션과 달리 흥미롭고 창의적인 솔루션을지지하는 것이 좋습니다.
LyricLy

17

루아, 65 64 63 바이트

대단해! 한 번만 루아는 파이썬을 이겼습니다!

편집 : @Jarhmander 덕분에 1 바이트를 절약했습니다. 단 하나의 결과를 강요하는 유용한 트릭 덕분에

print(((...):gsub("(%d+)(.)",function(a,b)return b:rep(a)end)))

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

설명

print)((...):gsub(             -- iterate over the argument and replace the strings
            "(%d+)(.)",       -- matching this pattern (at least one digit and a non-digit)
            function(a,b)     -- capture the digit and non-digit parts in separate variables
              return b:rep(a) -- repeat the non-digit a times, a being the digit part
            end)))                    


@Lynn 1 바이트 다운, 3 개 더 이동!
Katenkyo

,""전체 인쇄 인수를 구문 분석 하고 제거하여 바이트를 저장할 수 있습니다 . Parens로 묶인 표현식은 Lua에서 하나의 값으로 조정됩니다 ( lua.org/manual/5.3/manual.html#3.4 참조 ).
Jarhmander



8

vim, 29 25 23 22 16 바이트

:s/\D/a&<C-v><ESC>/g
D@"

<C-V>0x16이고 <ESC>0x1b입니다.

숫자가 아닌 각 문자를 해당 문자를 버퍼에 추가하는 명령으로 바꾸면 작동합니다. 개수는 그대로두고 해당 명령을 수정하십시오. 이 시점에서 버퍼는 원하는 Brainfuck 프로그램을 생성하는 vimscript 프로그램이므로 레지스터로 가져 와서 실행합니다.

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

편집 : 제안 덕분에 크기 축소 : H.PWiz : 5, TheFamilyFroot : 5, DJMcMayhem : 1


TheFamilyFroot 에는 훌륭한 골프 팁이 있습니다. 캡처 그룹을 사용할 필요가 없으며 괄호없이그룹 0 (&또는\0)만 사용할 수 있습니다. 또한, 저에서 팁은하지 TheFamilyFroot은 당신이 사용할 수 있다는 것입니다D대신dd에 대한-1바이트.
James

1
H.PWiz, TheFamilyFroot 및 DJMcMayhem의 모든 제안에 감사드립니다. 그것은 18 바이트 Perl 솔루션 아래에서 2 위를 차지했습니다. 이제 우리는 제거 할 수있는 또 다른 15 바이트를 찾아야하며 Pyth 내장을 이길 것입니다. :-)
Ray

8

RLE Brainfuck, 204 바이트

-3>,[[->+>+<<]>>47-3<10+<->[-<+4>->+<[>-]>[3<+<[-]4>->]5<]3>57+[-]+<<[>>-<<[3>+3<-]]3>[3<+3>-]<[>>+7<+[->11-<+[-<+]->>+[-<[->10+<]>>+]<[-4>.4<]4>[-]-3<-<+7>-7<[8>+8<-]]8>[8<+8>-]<[3<.3<[-]-6>-]7<--5>-]<,]

내가 이해했듯이 brainfuck 환경의 사양은 잘 정의되어 있지 않습니다. 이 프로그램은 테이프의 셀이 오버플로없이 임의로 큰 양의 정수와 음의 정수를 허용한다고 가정합니다. 이 코드는 명령이 아닌 주석도 기록하지만 주석의 실행 길이 인코딩을 확장합니다 (예 : "3b 참조"→ "bbb 참조"). 결과 프로그램은 동일하게 실행되어야하므로 걱정하지 않아도됩니다.

나는 여전히 이것으로부터 몇 바이트를 골프를 칠 수 있다고 확신하지만, 그 작업에 지쳐있다.

다음은 테스트에 사용한 사용자 정의 인터프리터 + 테스트입니다. 표준 입력 상자에 입력을 전달하면 테스트를 실행하는 대신 해당 입력에 대해 실행해야합니다.

지저분한 지저분한 골판지 :

->>>,
[
  [->+>+<<]>>  clone 2 into 3 and 4
  if read char is between zero and nine
  (num buffer | max | is_digit | original char | read | temp0 | temp1)
                                                   ^
  47-
  <<<10+  set max
  <->  handle gross 0 case
  [  while max
    -  max minus one
    <+  buffer plus one
    >>>>-  read minus one
    IF STATEMENT : if read is 0
    >+<
    [>-]>[<
      <<+  is_digit = 1
      <[-]>>>  max = 0
    >->]<<  back to read
    <<<     back to max
  ]

  >>>57+[-]  reset `read` (need to add first to avoid infinite negative)

  +<<  check is_digit flag
  ( end marker | 0 | is_digit | original char | temp0 | temp1 | temp2 | temp3)
  x[  IF READ WAS DIGIT
    CODE 1a
    >>temp0 -<<x
    [>>>temp1 +<<<x-]
  ]
  >>>temp1 [<<<x+>>>temp1 -]
  <temp0 [
    START CODE 2a
    >>temp2 +
    7<y+[  IF THERE IS A NUMBER PREFIX
      -
      START CODE 1b
      >11-  end marker is negativeone
      <   on smallest digit
      +[-<+]->  find largest digit
      >+[  sum digits until we hit the end marker negativeone
        -
        <[->10+<]>  h1 = ten * h0; h0 = 0
        >
        +
      ]  leave the negativeone at zero though
      num | 0 | 0 | 0 | original char
            ^
      <num
      [->>>>.<<<<]  print `original char` `num` times
      >>>>[-]-  set `char` to negativeone
      <<<- last ditch guess
      END CODE 1b
      <y+
      7>temp2 -
      7<y[8>temp3 +8<y-]
    ]
    8>temp3 [8<y+8>temp3 -]
    <temp2 [
      CODE 2b
      <<<.  print original char
      <<<[-]-  set num buffer to new left edge
      >>>>>>temp2 -
    ]
    7<y--

    END CODE 2a
    5>temp0 -
  ]
  <
  ,
]

총 0 건은 실제 제로 카운트만을 참조합니까, 아니면 구문 분석시에도 발생 10+합니까? OP는 의견에서 카운트가 항상 0보다 클 것이라고 명시 했으므로 이전 바이트 인 경우 일부 바이트를 줄일 수 있습니다.
Ray

총 0 경우는 0을 구문 분석하기위한 것입니다. while max루프는 항상 한 번 이상 실행되며 해당 루프에 숫자 값을 저장하는 버퍼를 무조건적으로 올리므로 -1에서 해당 버퍼를 시작해야합니다. 버퍼를 논리적으로 남겨두고 바이트를 절약 할 수 있는지 궁금합니다. value+1🤔
Orez


5

TeX, 124 바이트

\newcount\n\def\b{\afterassignment\r\n0}\def\r#1{\ifx;#1\else\p#1\expandafter\b\fi
}\def\p#1{#1\ifnum\n>1\advance\n-1\p#1\fi}

(표시되도록 두 줄로 작성했지만 코드를 한 줄로 작성할 수 있음)

이것은 \b형식으로 입력을 가져 와서 \b<input>;원하는 출력을 문서에 인쇄 하는 매크로 를 정의합니다 .



4

Pyon , 66 바이트

print(re.sub("\d+.",lambda k:(int(k.group()[:-1])*k.group()[-1]),a

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

Pyon은 Python과 거의 비슷하지만 re사용하면 자동으로 가져 오기 때문에 짧아지고a 인수 또는 입력으로 자동 설정

Mr. Xcoder 덕분에 -4 바이트


로 변경해야 g[0]합니다 g[:-1](주어진 테스트 케이스 또는 9보다 큰 숫자의 경우 실패).
Mr. Xcoder

Anyway why would you even need a lambda which actually wastes bytes? Golfed and corrected for 66 bytes
Mr. Xcoder

@Mr.Xcoder whoops, not sure what I was thinking... thanks
HyperNeutrino

@Mr.Xcoder oh yeah I try to golf things a lot that end up being ungolfs xD
HyperNeutrino



3

R, 121 106 90 bytes

function(s,a=strsplit)cat(rep(el(a(gsub("\\d","",s),"")),pmax(el(a(s,"\\D")),"1")),sep="")

Try it online!

Saved 15 bytes by realising that rep() will coerce to numeric. Saved another 16 thanks to Giuseppe, mainly from the use of pmax to replace empty strings with 1

function(s) {
  x <- el(strsplit(s,"\\D")) # Split the string on anything that is not a digit...
  x <- pmax(x, "1")          # ... and replace any empty strings with 1. This gets us the numbers of repeats
  y <- gsub("\\d","",s)      # Remove all digits from the original string...
  y <- el(strsplit(y))       # ... and split into individual units. This gets us the symbols to repeat
  z <- rep(y, x)             # Implement the repeats. x is coerced to numeric
  cat(z, sep = "")           # Print without separators
}

very nice! I believe ifelse(x>"",x,1) is a byte shorter, and \\D is equivalent to [^\\d] and best of all, you don't need perl=T, so this is a sweet 99 bytes. I really didn't think this could be fewer than 100 bytes!
Giuseppe


@Giuseppe Very clever use of pmax giving a nice big improvement - thanks!
user2390246

replace "1" with 1 as pmax will coerce to character for the comparison.
Giuseppe

85 bytes by changing the aliases
Giuseppe

2

PowerShell, 66 62 bytes

-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})

Try it online!

Breakdown

What a mess!

Starting from $args, which is a single element array containing the RLE string, I'm forcing into an actual string by wrapping it quotes.

Then split it by word boundary (\b in regex). That will give me an array of strings, where each element is either a number or the BF token(s) that come after the number. So in the example, the first 4 elements of this split array are 10,+]>+>,3,+> (all are string).

Next, I pipe that into ForEach-Object (%) to deal with each element.

The middle is a well-known PowerShell golfism, with a twist; it's essentially a DIY ternary operator, in which you create a 2 element array then index into it using the boolean expression you want to test, whereby a false result gives you element 0 and a true result gives you element 1.

In this case, I actually create a single element array with the unary comma , operator, because I don't want output in the true case.

First let's look at the indexer, even though it gets executed later.

The idea of this is that $_ (the current element) could either be a valid number, or some other string. If it's a number, I want $n to be the value of that number minus 1 (as a number, not a string). If it's not, I want $n to be false-y.

PowerShell usually tries to coerce the right-hand value to the type of the left side, but it can depend on the operation. For addition, "10"+5 would give you a new string, "105", whereas 10+"5" will give you an integer (15).

But strings can't be subtracted so instead PowerShell can infer the numeric value automatically with a string on the left side of subtraction, therefore "10"-5 gives 5.

SO, I start with $_-1, which will give me the number I want when $_ is actually a number, but when it's not I get nothing. On the surface, "nothing" is falsey, but the problem is that is stops execution of that assignment, so $n will retain its previous value; not what I want!

If I wrap it in a subexpression, then when it fails, I get my falsey value: $($_-1).

That all gets assigned to $n and since that assignment is itself wrapped in parentheses, the value that was assigned to $n also gets passed through to the pipeline.

Since I'm using it in the indexer, and I want 1 if the conversion succeeded, I use two boolean-not expressions !! to convert this value to boolean. A successful number conversion ends up as true, while the falsey nothingness gives us that sweet, sweet 0 that allows for returning the only element in that fake ternary array.

Getting back to that array, the element is this: $("$($_[0])"*$n*$_) $(,$_[0]*$n+$_)

"$($_[0])" - this is an annoyingly long way of getting the first character of the current element (let's say, getting + from +[>+), but as a string and not as a [char] object. I need it to be a string because I can multiply a string by a number to duplicate it, but I can't do that with a character.

Actually I managed to save 4 characters by using a [char] array instead of a string (by using another unary comma ,), so I was able to remove the quotes and extra sub-expression. I can multiply an array to duplicate its elements. And since the entire result of this iteration ends up being an array anyway and needs to be -joined, using an array here incurs no additional cost.

Then, I multiply that string array by $n, to duplicate it $n times. Recall that $n could be $null or it could be the value of the preceding digits minus one.

Then +$_ adds the current element onto the end of the duplicated first character of that element. That's why $n is minus one.

This way, 10+[>+ ends up with $n equal to 9, then we make 9 +'s and add that back to the +[>+ string to get the requisite 10, plus the other single elements along for the ride.

The element is wrapped in a subexpression $() because when $n is $null, the entire expression fails, so creating the array fails, so the indexer never runs, so $n never gets assigned.

The reason I used this ternary trick is because of one of its peculiarities: unlike a real ternary operator, the expressions that define the elements do get evaluated whether or not they are "selected", and first for that matter.

Since I need to assign and then use $n on separate iterations, this is helpful. The ternary array element value gets evaluated with the previous iteration's $n value, then the indexer re-assigns $n for the current iteration.

So the ForEach-Object loops ends up outputting everything its supposed to (a bunch of errors we ignore), but as an array of new strings.

So that whole thing is wrapped in parentheses and then preceded by unary -join to give the output string.


1
Great explanation, that alone warrants an upvote already.
Mast

1
Thanks @Mast, and because of your comment I looked over my answer again and realized how I could save 4 bytes.
briantist

2

QuadR, 17 bytes

\d+.
¯1((⍎↓)⍴↑)⍵M

Try it online!

Thanks to Adám for providing the correct version of the code.

How it works:

\d+.           Regex to match any sequence of digits followed by a character.
¯1((⍎↓)⍴↑)⍵M   Transformation line
¯1(      )⍵M   Arguments: -1 and the matching expression
   ( ↓)        'Drop' the last item (-1) from the match (⍵M), yielding a string which is a sequence of digits.
              Execute. In this case, it transforms a string into a number.
              'Take' the last item (-1) from the match (⍵M), yielding a character.
              Reshape it. That will take the character resulting from the 'Take' operation and repeat it n times,
               where n is the result from the 'Drop' and 'Execute' operations.

Equivalent to the APL function '\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
Adám


1

Java 8, 148 bytes

s->{for(s=s.format(s.replaceAll("(\\d+)","%1\\$0$1d"),0);!s.matches("\\D+");s=s.replaceAll("0(\\D)","$1$1"));return s.replaceAll("((.)+)\\2","$1");}

Gdamn Java regexes are so useless sometimes.. Last time it was lack of using the capture group "$1" for anything, now this.. I want to replace 3c with ccc or 000c with ccc as a one-liner, but unfortunately Java has no way of doing this without a loop. Ah well.

Explanation:

Try it here.

s->{                          // Method with String as both parameter and return-type
  for(s=s.format(s.replaceAll("(\\d+)","%1\\$0$1d"),0);
                              //  Replace every numbers of that many zeroes
                              //  (i.e. "3>2+" -> "000>00+")
      !s.matches("\\D+");     //  Loop as long as the String contains zeroes
    s=s.replaceAll("0(\\D)",  //   Replace every 0 followed by a non-0 character,
                   "$1$1")    //   with two times this captured non-0 character
  );                          //  End of loop
  return s.replaceAll("((.)+)\\2","$1");
                              //  Reduce every repeated character amount by 1,
                              //  and return this as result
}                             // End of method

1
Hi Kevin, good to see you here, dealing with puzzles other than twisty :)
Galen Ivanov

@GalenIvanov Oh, hi! I had no idea you were active on PPCG as well.
Kevin Cruijssen

I wasn't until recently :) I'm learning J and decided that this is a good opportunity to test my skills.
Galen Ivanov

1

Haskell, 84 bytes

f s@(x:r)|(n:m,x:r)<-span(`elem`['0'..'9'])s=(x<$[1..read$n:m])++f r|1<3=x:f r
f e=e

Try it online!

Explanation:

span(`elem`['0'..'9'])s splits the given string s into a prefix of digits and the remainder. Matching on the result on the pattern (n:m,x:r) ensures that the digit prefix is non-empty and binds the character after the digits to x and the remainder to r. x<$[1..read$n:m] reads the string of digits n:m as number and repeats x that many times. The result is concatenated to the recursive treatment of the remaining string r.


1

R, 151 bytes

Outgolfed by user2390246! This is now basically a garbage approach compared to that one, but I'll continue to improve it.

function(s,G=substr)for(i in el(strsplit(gsub("(\\d+.)","!\\1!",s),"!")))cat("if"(is.na(g<-as.double(G(i,1,(n=nchar(i))-1))),i,rep(G(i,n,n),g)),sep='')

Try it online!

Also outputs a bunch of warnings.

function(s){
s <- gsub("(\\d+.)","!\\1!",s)               # surround groups with !
X <- el(strsplit(s,"!"))                   # split to groups
for( i in X ){                             # iterate over groups
 n <- nchar(i)                             # length of group
 r <- substr(i,1,n-1)                      # potential number (first n-1 chars)
 d <- substr(i,n,n)                        # last character
 if( is.na(as.double(r)) ){                # if it's not a number
   cat(i)                                  # print out the whole string
  } else {
   cat(rep(d,as.double(r)),sep="")         # repeat d r times, and print with no separator
  }
 }
}

Next up, seeing if using a grep is more efficient than substr



1

JavaScript (ES6), 46 bytes

a=>a.replace(/(\d+)(.)/g,(_,n,b)=>b.repeat(n))

Pretty straightforward explanation:

a=>a.replace(/(\d+)(.)/g,                      // Match globally the following: a number N followed by a character
                         (_,n,b)=>b.repeat(n)) // Replace each occurrence by the matched character repeated N times


1

Untyped Lambda Calculus, 452 bytes

(λp.λq.(λb.λg.(λi.(λp.λq.λb.p q b)(q(λq.λj.λl.j((λq.λj.qλq.λl.(λu.g i j(λp.u)(g j(λq.λg.q(b(p(λp.λq.p q))(p(λp.λq.p(p q)))q g))(λp.u)(λu.u qλq.λu.g j i q(b l(p(λp.λq.p(p(p(p q)))))q u))))λp.p(λp.λb.q p((λp.λq.l(λp.l)(λp.λq.p q)(λq.p j q)q)p b))λp.λp.p)l q))(λp.p)(λp.p(λp.λp.p)λp.λp.p)(λp.λq.p)))(b(p(λp.λp.p))(p(λp.λq.p(p q)))))(λp.λq.λb.p(q b))λp.λq.q(λp.λq.λb.p(λp.λb.b(p q))(λp.b)λp.p)p)λp.λq.λb.q(q(q(q(q(q(p q b))))))

Input and output comprise of right-fold lists of church encoded character codes, for example the character code of a newline is 10 so the church encoding would be λf.λx.f(f(f(f(f(f(f(f(f(f x))))))))). Converting "ABCD" to a list looks like λf.λx.f 65 (f 66 (f 67 (f 68 x))) but with the numbers church-encoded.

Applying an encoded string to the program and reducing it all the way should give you an encoded output string with the RLE applied.


1
Hello and welcome to the site! This looks like an interesting solution but we do expect languages to have a valid interpreter, do you have one of Untyped Lambda Calculus?
Post Rock Garf Hunter

Also, what does the qλq notation mean? I've never seen that before.
Zacharý


1

C++, 239 235 bytes

-4 bytes thanks to Zacharý

#include<regex>
using s=std::string;std::regex m("[0-9]*[<>+.,\\[\\]-]");s t(s r){s d,h;std::sregex_iterator i(r.begin(),r.end(),m),e;while(i!=e){h=(*i)[0];int g=std::strtol(h.data(),NULL,10);g+=!g;d+=s(g,h[h.size()-1]);++i;}return d;}

1
Can you change g=(g?g:1) to g+=!g? If that doesn't work, can't you remove the parentheses around g?g:1
Zacharý

0

Dart, 78 bytes (with regex), 102 bytes (without regex)

With Regex:

(i)=>i.splitMapJoin(new RegExp(r"(\d+)(.)"),onMatch:(m)=>m[2]*int.parse(m[1]))

Without Regex:

(i,[n=0,d=0])=>i.codeUnits.map((c)=>i[d++]*((c-=48)>=0&&c<10?0*(n=n*10+c):n<1?1:(n=0*(c=n))+c)).join()

Both must be invoked like (<code here>)("input string").

Regex one is quite standard, but the regex-less one is quite special.

Regex-less abuses optional parameters to allocate local variables in "single return" function, otherwise you'd need to make a block and have the return keyword. For each code unit, if the code unit is between 0 and 9 it is accumulated to n and an empty string is returned. Otherwise, the the character is multiplied by the value of n (special cased if n == 0, in that case it will always emit 1 character) and n is set to 0. (n=0*(c=n))+c sets the char code argument to the value of n, multiplies n/c with 0, stores 0 to n, then adds c. This resets our n without being in a statement context.


0

Python3, 96 bytes

s,r=input(),""
while s:
 d=0
 while"/"<s[d]<":":d+=1
 r+=int(s[:d] or 1)*s[d];s=s[d+1:]
print(r)

I tried another implementation in Python, but i don't beat /codegolf//a/146923/56846 :(

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