오레오 레레 레루


60

오레오 레레 레루

단어 "oreo"와 유사한 입력 문자열이 주어지면 쿠키 안정성을 보장하기 위해 입력 문자열만큼 넓은 쿠키의 ASCII 표현을 제공하십시오.

규칙

  • 입력은 소문자이며, 문자열 "o"와 "re"의 조합을 포함하고 공백 만 포함하고 공백이없는 문자열입니다.
  • 문자열 "o"는 솔리드 쿠키를 나타내고 문자열 "re"는 채우기를 나타냅니다.
  • 출력은 입력 문자열만큼 넓은 스택 쿠키 여야합니다.
  • 출력은 문자열 배열이 아닐 수 있습니다
  • 쿠키는 각면에서 한 문자 씩 채우기와 겹쳐 야합니다.
  • 출력에 사용 된 문자는 아래 출력 (█ 및 ░)과 일치하지 않아도되며 쿠키의 두 부분에 대해 공백이 아닌 다른 문자 여야합니다.
  • 채우기 왼쪽에 공백이 필요하며 후행 공백은 선택 사항입니다.

Input: oreo
Output:
████
 ░░ 
████

Input: o
Output:
█

Input: re
Output: (two spaces)


Input: rere
Output:
 ░░ 
 ░░ 

Input: oreoorererereoo
Output:
███████████████
 ░░░░░░░░░░░░░ 
███████████████
███████████████
 ░░░░░░░░░░░░░ 
 ░░░░░░░░░░░░░ 
 ░░░░░░░░░░░░░ 
 ░░░░░░░░░░░░░ 
███████████████
███████████████

이것이 코드 골프이기 때문에 가장 짧은 답변이 승리합니다. :)


3
"충전의 양쪽에 공백이 필요합니다." 이것은 실제로 각 채우기 행 끝에 공백 문자가 있어야 함을 의미합니까? 그렇다면 왜? 시각적으로 작동하는 한이 요구 사항이 과제에 추가되는 것은 무엇입니까?
ElPedro

@ ElPedro 좋은 점, 규칙을 수정하고 @Dennis 규칙을 편집하여 주석을
정리해도

@JonathanAllan "아스키 아트"를 인쇄하고 있기 때문에 그 규칙을 제거했기 때문에 질문을 업데이트하는 것을 잊어 버린 것 같습니다. 지금 업데이트해야합니다.
GammaGames

정말 고마워요!
Jonathan Allan

@GammaGames, 오른쪽의 공백이 더 이상 필요하지 않으면 테스트 케이스의 출력 re이 이제 1 or 2 spaces반드시 2가 아닌으로 수용 가능해야 한다고 가정 합니까?
Kirill L.

답변:


15

젤리 ,  16 14  13 바이트

-1 Outgolfer Erik에게 감사합니다

OḂƇẒṁ€aØ.¦€⁶Y

사용 1크림과 0쿠키를 위해.

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

어떻게?

OḂƇẒṁ€aØ.¦€⁶Y - Main Link: list of characters, V    e.g. 'orereo'
O             - ordinal (vectorises)                     [111,114,101,114,101,111]
  Ƈ           - filter keep those for which:
 Ḃ            -   modulo 2                               [111,    101,    101,111]
   Ẓ          - is prime? (vectorises)                   [  0,      1,      1,  0]
    ṁ€        - mould each like V                        [[0,0,0,0,0,0],[1,1,1,1,1,1],[1,1,1,1,1,1],[0,0,0,0,0,0]]
          €   - for each:
         ¦    -   sparse application...
       Ø.     -   ...to indices: literal [0,1] (0 is the rightmost index, 1 is the leftmost)
      a       -   ...apply: logical AND with:
           ⁶  -               space character           [[0,0,0,0,0,0],[' ',1,1,1,1,' '],[' ',1,1,1,1,' '],[0,0,0,0,0,0]]
            Y - join with newline characters            [0,0,0,0,0,0,'\n',' ',1,1,1,1,' ','\n',' ',1,1,1,1,' ','\n',0,0,0,0,0,0]
              - implicit print                       ...smashes everything together:
              -                                         000000
              -                                          1111 
              -                                          1111 
              -                                         000000

이전 16 개월 :

ḟ”eẋ€Ly@Ø.¦€⁾r Y

사용 r은 C에 대한 rEAM과 o는 C에 대한 ookie.

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


나는 재미있는 언어 인 젤리 항목을 기대하고 있었다!
GammaGames

19

페페 , 364 바이트

불행히도 온라인 인터프리터는 주석 압축을 처리하지 않으므로 모든 o문자가 공백으로 바뀝니다. 공백이나 o가 필요 하지 않으므로 295 바이트가 될 수 있지만 더 좋아합니다.

rEeEEeeEeEororEEoreoreeeEeeeeeorEEEEeoREeoreorEeEEeEEEEororEEoreorEEEEEoREeoreorEeEEEeeEeororEEoreoReoREoREEEeoREEEEEoreorEorEEEeorEEEEEoreEoREeoreoREEeoREEEEeEeeoREEEeoREeeEoREEEeoREEEEEEEorEEEeEorEEEeoREoREEEeoREEEEEoREEoReoreorEEEeEoREEEEEEeorEEEeoReEoREoREEEeoREEoReoroReEeoREoREEEeorEEEEeoReeoREEEeoREeeEoREEEeoREEEEEEEoreoReoReoREoREEEeoREEEEEoreeeeeEeEeoRee

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

언 골프

내가 놓친 플래그가 있는 골프 기회가있을 수 있지만 지금은 끝났습니다.

# "function" for 'e'
rEeEEeeEeE rrEE
  re          # remove duplicated argument
  reeeEeeeee  # print space
  rEEEEe      # decrement counter twice
REe re

# "function" for 'o'
rEeEEeEEEE rrEE
  re      # remove duplicated argument
  rEEEEE  # increment counter
REe re

# "function for 'r'
rEeEEEeeEe rrEE
  re Re              # remove duplicated argument & char
  RE REEEe REEEEE    # push 1
  re rE rEEEe rEEEEE # replace 1
  reE                # goto 1
REe re

# Main

REEe REEEEeEee                # read input & reverse
REEEe REeeE REEEe REEEEEEE    # push length-1 & move to r

rEEEeE rEEEe # dummy loop-var (fucking do-whiles...)
RE REEEe REEEEE REE  # while [label-1]

  # Call the right procedure depending on current character,
  # sets stacks up as follows:
  #   R [ .... *currentChar ]
  #   r [ (N-1) *count ]
  Re re          # pop 1 & loop-counter
  rEEEeE         # duplicate counter
  REEEEEEe rEEEe # copy current char to other stack
  ReE            # jeq to 'o'-label or 'e'-label

  # Output currentChar count times:
  RE REEEe REE # while [label-0]:
    Re         #   pop 0
    rReEe      #   print character
    RE REEEe   #   push 0
    rEEEEe     #   decrement counter
  Ree

  REEEe REeeE REEEe REEEEEEE  # push length-1 & move to r
  re Re Re                    # pop 0, counter and 9((((currentChar
  RE REEEe REEEEE             # push 1
  reeeeeEeEe                  # print new-line

Ree

1
나는 채팅이 대화 이동 당신을 위해입니다.
DJMcMayhem


7

Japt -R , 16 15 바이트

re ¬£çX sX²èrÃû

시도 해봐

                    :Implicit input of string U
re                  :Remove all "e"s
   ¬                :Split to array of characters
    £               :Map each X
     çX             :  Repeat X to the length of U
        s           :  Slice from index
         X²         :   Duplicate X
           èr       :   Count the occurrences of "r"
             Ã      :End map
              û     :Centre pad each element with spaces to the length of the longest
                    :Implicitly join with newlines and output

대안

re ¬ËpUÊaD²èrÃû
re ¬£îX rr²i^Ãû

6

C # (Visual C # 대화식 컴파일러) , 95 바이트

n=>n.Replace("o",new String('-',n.Length)+"\n").Replace("re"," ".PadRight(n.Length-1,'|')+"\n")

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

집계, 108 바이트를 사용한 대안

n=>n.Aggregate("",(d,c)=>d+(c<102?"":c<112?new String('-',n.Length)+"\n":" ".PadRight(n.Length-1,'|')+"\n"))

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


1
이제 후행 공백을 잘라
냅니다

후행 줄 바꿈 규칙을 제거했다는 충분한 피드백이있었습니다. 항목을 자유롭게 업데이트하십시오.
GammaGames

입력이 o인 경우 교체가 작동하지 않습니다 . n.Length-2결과는 -1입니다.
Kevin Cruijssen

n.Length-2되어 입력이있을 때를위한 것이다 re.
무지의 구현

6

R , 106 바이트

function(s,N=nchar(s)){m=rep(el(strsplit(gsub('re',0,s),'')),e=N)
m[m<1&seq(m)%%N<2]=' '
write(m,1,N,,"")}

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

  • @Giuseppe 덕분에 -12 바이트

설명이있는 이전 버전 :

R , 118 바이트

function(s,N=nchar(s)){m=t(replicate(N,el(strsplit(gsub('re',0,s),''))))
m[m<1&row(m)%in%c(1,N)]=' '
write(m,1,N,,'')}

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

  • @Giuseppe 덕분에 -1 바이트

풀린 코드 및 설명 :

function(s){                       # s is the input string, e.g. 'oreo'

  N = nchar(s)                     # store the length of s into N, e.g. 4

  s1 = gsub('re',0,s)              # replace 're' with '0' and store in s1, e.g. 'o0o'

  v = el(strsplit(s1,''))          # split s1 into a vector v of single characters
                                   # e.g. 'o','0','o'

  m = replicate(N,v)               # evaluate N times the vector v and arrange 
                                   # the result into a matrix m (nchar(s1) x N)
                                   # e.g. 
                                   # 'o' 'o' 'o' 'o' 
                                   # '0' '0' '0' '0' 
                                   # 'o' 'o' 'o' 'o' 


  m = t(m)                         # transpose the matrix

  m[m<1 & row(m)%in%c(1,N)] = ' '  # substitute the zeros (i.e. where < 1) 
                                   # on the 1st and last row of the matrix with ' ' (space)
                                   # e.g. 
                                   # 'o' ' ' 'o' 
                                   # 'o' '0' 'o' 
                                   # 'o' '0' 'o' 
                                   # 'o' ' ' 'o'

  write(m,1,N,,'')                 # write the matrix to stdout (write function transposes it)
                                   # e.g.
                                   # oooo
                                   #  00 
                                   # oooo
}


aaand 104 바이트 는 라인 목록을 반환하지만 여기에서는 허용되지 않지만 흥미로운 아이디어입니다 (실제로 SNOBOL 제출은 R로 번역 됨)
Giuseppe

6

05AB1E , 18 17 16 바이트

'eKεD'rQ2*Igα×}.c

@Emigna 덕분에 -1 바이트

사용 o쿠키과 r충만.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

'eK                 '# Remove all "e" from the (implicit) input
                     #  i.e. "orereo" → "orro"
   ε         }       # Map all characters to:
    D                #  Duplicate the current character
     'rQ            '#  Check if it's an "r" (1 if truthy; 0 if falsey)
                     #   i.e. "r" → 1
                     #   i.e. "o" → 0
        ·            #  Double that
                     #   i.e. 1 → 2
                     #   i.e. 0 → 0
         Ig          #  Take the length of the input
                     #   i.e. "orereo" → 6
           α         #  Take the absolute difference between the two
                     #   i.e. 2 and 6 → 4
                     #   i.e. 0 and 6 → 6
            ×        #  Repeat the duplicated character that many times
                     #   i.e. "r" and 4 → "rrrr"
                     #   i.e. "o" and 6 → "oooooo"
              .c     # Then centralize it, which also imlicitly joins by newlines
                     # (and the result is output implicitly)
                     #  i.e. ["oooooo","rrrr","rrrr","oooooo"]
                     #   → "oooooo\n rrrr\n rrrr\noooooo"

독창적 인 솔루션이지만 문제를 완전히 해결하지는 못합니다. oro는 오답을
Mark Smit

oro입력은 os와 res 만 포함하므로 @MarkSmit 은 가능한 입력이 아닙니다 . 그럼에도 불구하고, oro여전히 있기 때문에 올바르게 사양을 다음과 같은 출력을 보인다 는 출력ooo\n r\nooo . 무엇이 잘못 되었나요?
Kevin Cruijssen

이것은 유효하지 않습니다 : "충전의 양쪽에 공백이 필요합니다"
NieDzejkob

2*할 수 있습니다 ·및 누락 공백을 변경하여 해결할 수 있습니다 ».c.c.B»
Emigna

@Emigna Ah, 내가 생각하지 못 했어 ·, 고마워! :) 그리고 항상 도전하는 동안 사양을 변경하는 것이 좋습니다, 한숨 ..
Kevin Cruijssen

5

망막 , 74 73 바이트

답변을 오랫동안 게시하지 않은 것 같습니다. 글쎄요, 여기 있습니다. 또한, 레티 나는 많이 바뀌었고, 나는 지금 그것을 빨아 먹는 것처럼 느낍니다.

.+
$0$.0
(\d+)
*
e

o|r
$&¶
_$

+(/_/&`o¶
oo¶
_$

)/_/&`r¶
rr¶
¶$

m`^r
 

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


1
우와, 정말 미친 듯이 보이는 언어. 나는 그것을 좋아한다!
GammaGames

후행 공백은 포함되지 않습니다 ..
dzaima

2
내가 얼마나 좋아 [or]의미 or대신 []. 머리가 아프다
nedla2004

@dzaima이 질문은 후행 공백이 필요하다는 것을 지정하지 않습니다. 의견이 있지만 응답이 없습니다.
mbomb007

@ nedla2004 실제로 바이트를 저장하는 방법을 알 수있었습니다. 감사.
mbomb007

5

망막 , 21 바이트

r

L$`.
$.+*$&
\bee
 

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

r

rs를 삭제하십시오 .

L$`.
$.+*$&

원래 문자의 길이만큼 반복하여 각 문자를 한 줄에 나열하십시오.

\bee
 

ee각 줄 의 처음 두 개를 공백으로 바꿉니다 .


"충전의 양쪽에 공백이 필요합니다"
NieDzejkob

@NieDzejkob 그것을 간과해서 죄송합니다. 지금 고쳐야합니다.

참고로 공백 요구 사항이 해제되었습니다.
Jacktose

@Neil 다음을 수정해야합니다 &amp;. : P
ASCII 전용

5

C (GCC) , 135 (113) 109 104 바이트

#define $ putchar(33
O(char*r){for(char*e,*o=r,x;*r;$-23))for(x=*r++>111,e=x?$-1),r++,o+2:o;*e++;$+x));}

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


-D$=putchar

규칙에서 허용하는대로 후행 줄 바꿈을 추가하면 131 바이트 입니다.
NieDzejkob

e=o 첫 번째 for 루프의 조건으로 이동 한 다음 else를 제거하면 127 바이트 입니다.
NieDzejkob

쿠키를 선택하고 문자를 신중하게 입력하면 118 바이트 입니다.
NieDzejkob


4

자바 스크립트 ES6, 103 바이트

103 바이트 대체 사용 :

x=>x.replace(/o/g,"-".repeat(s=x.length)+`
`).replace(/re/g," "+"|".repeat(s>1?s-2:0)+` 
`).slice(0,-1)

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

split 및 map 116 바이트 사용 :

x=>x.split("re").map(y=>("-"[h='repeat'](r=x.length)+`
`)[h](y.length)).join(" "+"|"[h](r>1?r-2:0)+` 
`).slice(0,-1)

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


1
JS, 좋아! 출력 끝에 줄 바꿈이 없다는 규칙을 추가 할 것이라고 상기시켜주었습니다. 미안합니다!
GammaGames

3
마지막 줄 바꿈 만 제거하면 12 바이트입니다.
fəˈnɛtɪk

후행 줄 바꿈 규칙을 제거했다는 충분한 피드백이있었습니다. 항목을 자유롭게 업데이트하십시오.
GammaGames

3
을 사용하는 ${"|".repeat(s>1?s-2:0)}대신 템플릿 문자열과 공백 을 사용하여 바이트를 저장할 수 있습니다 " "+"|".repeat(s>1?s-2:0).
이스마엘 미겔

첫 번째 분할에서 문자열에 백틱을 사용하면 괄호를 제거 할 수 있습니다.
skiilaa


4

파이썬 3 , 77 바이트

lambda x:x.replace("o","-"*len(x)+"\n").replace("re"," "+'.'*(len(x)-2)+"\n")

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


영리한! 나는 출력물이 채우기를 위해 공백을 인쇄하지 않도록 의도 했으므로 (오레오 ASCII) 거의 규칙을 편집했습니다. 미안합니다! 그리고 나는 항상 파이썬 답변을 좋아합니다 :)
GammaGames

@JonathanFrech migth는 의견을 삭제하고 해당 접근 방식이 무효화되었습니다. 나는 내일 더 골프를 할 것입니다.
Rɪᴋᴇʀ

+" \n"바이트를 저장하기 위해 공간을 제거 할 수 있습니다 .
Kevin Cruijssen

@KevinCruijssen 수 있습니까? 입력 프로그램에 따르면 전체 쿠키는 입력만큼 넓어야합니다.
Rɪᴋᴇʀ

2
나는 후행 공간이 공간이없는 것과 (시각적으로) 동일하다는 것을 의미한다고 해석했습니다. 이것이 아스키 아트 과제에 대한 답변의 아름다움입니다. 그들이 옳다면 그들은 옳습니다 :-)
ElPedro

4

수학, 111 91 바이트

#~StringReplace~{"o"->"O"~Table~(n=StringLength@#)<>"\n","re"->" "<>Table["R",n-2]<>" \n"}&

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

이것은 Misha편집 덕분에 크게 단축되었습니다 .


내 원래 코드 :

(z=StringRepeat;n=StringLength@#;#~StringReplace~{"o"->"O"~z~n<>"\n","re"->" "<>If[n>2,z["R",n-2],""]<>" \n"})&

이 코드는 그리 훌륭하지는 않지만 문자열에서 변환 한 다음 되돌아 가거나 영리한 것을하기에는 너무 비싸 보입니다.

특히 이름이 String 인 3-4 개의 명령 만 있으면 원래의 접근 방식으로 추상화하지 않아 바이트를 절약 할 수 없었습니다. 예를 들어, 다음은 129 바이트입니다.

(w=Symbol["String"<>#]&;z=w@"Repeat";n=w["Length"]@#;#~w@"Replace"~{"o"->"O"~z~n<>"\n","re"->" "<>If[n>2,z["R",n-2],""]<>" \n"})&

1
몇 가지 개선 사항 : 이후 목록을 문자열로 변환 StringRepeat할 수 있습니다 . 는 우리가 가지고 있기 때문에 불필요한 지점에만 적어도 2; 우리는 그것을 사용할 때만 정의함으로써 괄호를 절약 할 수 있습니다 . 온라인으로 사용해보십시오! Table<>Ifrenn
Misha Lavrov

@MishaLavrov "re"의 경우 오류가 발생 If하기 때문에 추가되었습니다 StringRepeat. 문자열을 0 번 반복 할 수 없습니다. Table그런 제한이 없으므로 큰 절약입니다!
Mark S.

4

펄 6 , 37 바이트

{m:g/o|r/>>.&({S/rr/ /.say}o*x.comb)}

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

o쿠키를 사용 하여 문자열을 가져와 오레오를 인쇄하는 익명 코드 블록r 크림으로 .

설명:

{                                   }   # Anonymous code block
 m:g/o|r/                               # Select all o s and r s
         >>.&(                     )    # Map each letter to
                            *x.comb     # The letter padded to the width
               S/rr/ /                  # Substitute a leading rr with a space
                      .say              # And print with a newline

o대신 사용할 수 있다는 것을 몰랐 습니다 . 아주 멋지게 골프를 쳤다.
primo

4

자바 11, 110 바이트

s->{int l=s.length();return s.replace("re"," "+"~".repeat(l-(l<2?1:2))+"\n").replace("o","=".repeat(l)+"\n");}

사용 =쿠키과 ~충만.

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

설명:

s->{                       // Method with String as both parameter and return-type
  int l=s.length();        //  Get the length of the input
  return s                 //  Return the input
          .replace("re",   //  After we've replaced all "re" with:
            " "            //   A space
            +"~".repeat(l-(l<2?1:2))
                           //   Appended with length-2 amount of "~"
                           //   (or length-1 if the input-length was 1)
            +"\n")         //   Appended with a newline
          .replace("o",    //  And we've also replaced all "o" with:
            "=".repeat(l)  //   Length amount of "="
            +"\n");}       //   Appended with a newline

위의 솔루션은 교체를 사용합니다. 다음은 대신 입력 문자를 매핑합니다.

자바 11, 113112 바이트

s->s.chars().forEach(c->{if(c>101)System.out.println((c>111?" ":"")+(""+(char)c).repeat(s.length()-2*(~c&1)));})

@Neil 덕분에 -1 바이트 .

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

설명:

s->                           // Method with String parameter and no return-type
  s.chars().forEach(c->{      //  Loop over the characters as codepoint-integers
    if(c>101)                 //   If it's not an 'e':
      System.out.println(     //    Print with trailing newline:
       (c>111?                //     If it's an 'r'
         " "                  //      Start with a space
        :                     //     Else (it's an 'o' instead)
         "")                  //      Start with an empty string
       +(""+(char)c).repeat(  //     And append the character itself
          .repeat(            //     Repeated the following amount of times:
           s.length()         //      The input-length
           -2*(~c&1)));})     //      Minus 2 if it's an "r", or 0 if it's an "o"

1
사용할 수 있습니까 ~c&1?

@ 닐 정말 감사합니다.
Kevin Cruijssen

"충전의 양쪽에 공백이 필요합니다"
NieDzejkob

@NieDzejkob 고정 .. 도전하는 동안 항상 사양을 변경하는 것이 좋습니다, 한숨 ..
Kevin Cruijssen

@KevinCruijssen 더 이상 : P
ASCII 전용

4

PHP ,100 99 93 바이트

$l=strlen($i=$argv[1]);$r=str_repeat;echo strtr($i,[o=>$r(X,$l)."
",re=>' '.$r(o,$l-2)."
"]);

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

아야. PHP의 waaaay_too_long 함수 이름이 다시 나타납니다!

산출:

$php oreo.php oreo
XXXX
 oo
XXXX

$php oreo.php o
X

$php oreo.php rere
 oo
 oo

$ php oreo.php oreoorererereoo
XXXXXXXXXXXXXXX
 ooooooooooooo
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
 ooooooooooooo
 ooooooooooooo
 ooooooooooooo
 ooooooooooooo
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX

유효하지 않은 크림 라인에는 후행 공백이 필요합니다
ASCII 전용

후행 공간을 수정했습니다. 감사!
640KB

1
오, PHP! 또한 후행 공백은 선택 사항이며, ASCII를 인쇄하므로 실제로 필요하지 않아야한다고 지적한 사람들이 충분했습니다.
GammaGames

4

PHP , 96 87 85 바이트

@gwaugh 덕분에 -9 바이트 @manatwork
덕분에 -2 바이트

<?=strtr($i=$argv[1],[o=>($r=str_repeat)(X,$l=strlen($i))."
",re=>" {$r(o,$l-2)}
"]);

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

온라인으로 사용해보십시오! (87 바이트)

온라인으로 사용해보십시오 (원본 97 바이트 제출)!


그리고 재귀 함수

PHP , 135 바이트

function f($w,$x=0){$f=str_repeat;echo($x<($l=strlen($w)))?($w[$x]=='o')?$f(█,$l)."
".f($w,$x+1):" ".$f(░,$l-2)."
".f($w,$x+2):"";}

온라인으로 사용해보십시오! (재귀)


1
우리의 두 제출물 중 최고를 결합하여 87 바이트 TIO 로 줄일 수있었습니다 . 공동 작업 제출로이 게임에 참여 하시겠습니까? :)
640KB

1
short_tag_open 명령을 사용하여 1 바이트를 더 제거 할 수 있다고 생각하고 대신 대신 <?=사용할 수 <?있습니까?
Francisco Hahn

1
문자열 보간을 사용하여 2 자 더 짧음 : ' '.$r(o,$l-2)."␤"" {$r(o,$l-2)}␤".
manatwork

감사합니다 @manatwork 가끔은 전체 문자열이 ""istead로 선언되면 php vars가 문자열로 평가되는 것을 잊었습니다''
Francisco Hahn

1
사용하여 3 바이트 더 짧을 수 있습니다 $argn: 온라인 사용해보십시오!


4

Powershell, 71 69 66 바이트

-2 바이트 덕분에 @Veskah

-3 바이트 덕분에 @AdmBorkBork

$l=$args|% le*
switch($args|% t*y){'o'{'#'*$l}'r'{" "+'%'*($l-2)}}

덜 골프 테스트 스크립트 :

$f = {

$l=$args|% length
switch($args|% t*y){
    'o'{'#'*$l}
    'r'{" "+'%'*($l-2)}
}

}

@(

,(
'oreo',
'####',
' %%',
'####'
)
,(
'o',
'#'
)
,(
're',
' '
)
,(
'rere',
' %%',
' %%'
)
,(
'oreoorererereoo',
'###############',
' %%%%%%%%%%%%%',
'###############',
'###############',
' %%%%%%%%%%%%%',
' %%%%%%%%%%%%%',
' %%%%%%%%%%%%%',
' %%%%%%%%%%%%%',
'###############',
'###############'
)

) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    # $result # uncomment this line to display a result
}

산출:

True
True
True
True
True


1
의 길이는 [string[]]이다 [int[]]... (가) [int[]][int]어레이는 하나 개의 요소가있는 경우. 큰! 감사!
mazzy

1
OP는 도전 과제를 업데이트하여 더 이상 후행 공백이 필요하지 않습니다. 이것은 대신 -3 바이트 r가 될 수 있음을 의미합니다 " "+'%'*($l-2).
AdmBorkBork

3

, 19 바이트

Fθ≡ιo⟦⭆θ#⟧e«→P⁻Lθ²↙

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Fθ

입력 문자열의 문자를 반복합니다.

≡ι

각 문자를 켭니다.

o⟦⭆θ#⟧

그렇다면 o입력 #줄을 자신의 줄에 s 로 바꾸십시오 .

e«→P⁻Lθ²↙

그것이이 있다면 e다음 오른쪽으로 이동, 라인 인쇄 -한 후, 입력 문자열의 길이보다 두 이하의의를 아래로 이동하고 떠났다.


3

배쉬, 87 바이트

없이 sed:

f(){ printf %$1s|tr \  $2;}
c=${1//o/`f ${#1} B`
}
echo "${c//re/ `f $[${#1}-2] F` 
}"

@manatwork에게 감사합니다.

sed(90 바이트) :

f(){ printf %$1s|tr \  $2;}
echo $1|sed "s/o/`f ${#1} B`\n/g;s/re/ `f $[${#1}-2] F` \n/g"

샘플 사용법을 알려 주시겠습니까? 2 개의 매개 변수를 기대하는 함수에 약간 혼란 스럽습니다.
manatwork

라는 스크립트에 작성합니다 test.sh. 그런 다음 명령 행에서 다음과 같이 test.sh를 호출하십시오 bash test.sh oreoorererereoo. f문자 $2 $1수 를 반복하는 데 필요
녹색

죄송합니다. 나는 기능을 완전히 이해하지 못했다 f. 몇 가지 사소한 변경이있을 수 있습니다. 온라인으로 사용해보십시오!
manatwork



3

C # (Visual C # 대화식 컴파일러) , 71 바이트

s=>s.Aggregate("",(a,c)=>a+(c>111?" ":"\n".PadLeft(s.Length+c/5-21,c)))

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

무지의 구체화에 대한 아이디어로부터 확실한 아이디어를 얻었습니다 .

@ASCIIOnly 덕분에 -6 바이트!

전반적인 개념은 다음 규칙에 따라 입력 문자에 대한 문자열 집계를 계산하는 것입니다.

  • 가 있으면 들여 쓰기를위한 r공백 문자 하나를 추가하십시오 . 우리는 다음 캐릭터가 될 것임을 알고 있습니다 e.
  • 경우 o또는이 e발생, 현재의 문자를 특정 횟수를 반복하고 줄 바꿈 또는 일부 패딩과 줄 바꿈에 붙이는하여 문자열을 생성합니다.
  • 반복 횟수는 입력 문자열의 길이와 현재 행의 들여 쓰기 여부에 따라 결정됩니다.
  • 그만큼 PadLeft 함수는 반복되는 문자열을 생성하는 데 사용됩니다.

결과적으로 이러한 모든 문자열이 연결됩니다.



@ASCIIOnly-감사합니다 :)
dana

> 충전물의 양쪽에 공백이 필요합니다
ASCII 전용


나는 :) 알지 못했지만, 1/2에 대해 게시 된 답변을 검토하면이 작업도 잘못 수행되었습니다. 그래도 잘 잡아!
dana

3

Pyth , 28 바이트

FNzIqN"o"*lzN)IqN"r"+d*-lz2N
FNz                              For each value, N, in input
   IqN"o"                        if the character is "o"
         *lzN                    return the character times the length of the input
             )                   end if
              IqN"r"             if the character is "r"
FNzIqN"o"*lzN)IqN"r"+d*-lz2N
                        *-lz2N   return the character times length - 2
                    +d           padded on the left with " "

여기 사용해보십시오! 이것은 루프를 사용합니다.

Pyth, 30 바이트

(문자열 교체시)

::z"o"+*lz"="b"re"++d*-lz2"~"b
 :z"o"                           With the input, replace "o" with
       *lz"="                    "=" times the length of the input
      +      b                   and a newline added to the end
:             "re"               With the input, replace "re" with
                     *    "~"    "~" times
                      -lz2       the length of the input minus 2
                   +d            padded on the left with " "
                  +          b   and a newline added to the end

여기 사용해보십시오! 이것은 문자열 교체를 사용합니다.

나는 파이썬을 정말로 좋아합니다 (원래 테스트 스크립트를 작성했습니다). 나는 재미를 위해 pyth 항목을 할 것이라고 생각했습니다. :)


1
이 37 바이트 아닌가요? Pyth가 올바르게 기억한다면 Python과 마찬가지로 기본 ASCII를 코드 페이지로 사용한다고 생각했습니다. 코드는 33 자이며, 그래서 비록 모두 와는 3 바이트 각각이다. 아니면 여기에 뭔가 빠졌습니까?
Kevin Cruijssen

좋은 전화, 나는 그것을 몰랐다 (파이오가 tio.run에서 작동하도록 할 수 없었기 때문에 herokuapp 페이지에서 길이 카운터를 사용했다). for 루프에서 문자를로 바꾸고 N몇 바이트를 절약 할 수 있습니다!
GammaGames

그런 생각이 들었습니다. :) 한 번은 코드 페이지 외부의 문자를 사용하는 내 05AB1E 답변과 동일한 문제가있었습니다. 불행히도 TIO는 대부분의 골프 언어에서 문자와 바이트를 동일하게 표시합니다. Java 또는 Python의 경우 TIO는 올바르게 표시 33 chars, 37 bytes되지만 TIO의 골프 언어는 아닙니다. 그러나 솔루션에서 해당 문자를 변경하면 실제로 문제가 해결되므로 여기서 큰 문제는 아닙니다.
Kevin Cruijssen

@KevinCruijssen Wait, 05AB1E는 실제 SBCS를 사용하지 않습니까?
ASCII 전용

1
당신이 관심이 있다면, 그것은 나를 위해 TIO에서 쉽게 일하는 것 같습니다 .
NieDzejkob

3

루비 , 62 60 바이트

->s{s.gsub /./,?r=>" #{(?**z=s.size)[0..-3]}
",?o=>?O*z+?\n}

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

사용 O, 쿠키에 대한 *충만.

공백에 대한 규칙이 완화되어 @manatwork가 바보 같은 실수를 지적하고 -1에 감사드립니다.


.gsub의 매개 변수 주위에 괄호가 필요하지 않습니다 .
manatwork


2

클로저 , 137 바이트

(fn[f](let[w(count f)r #(apply str(repeat % %2))](clojure.string/join"\n"(replace{\o(r w \#)\e(str \ (r(- w 2)\-) \ )}(remove #{\r}f)))))

나는 골프 버전의 인쇄물에 멋진 문자를 사용하지 않고 있기 때문에 비용이 많이 듭니다. 인쇄 할 문자열을 반환합니다.

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

설명은 아래를 참조하십시오.

사전 골프 :

; Backslashes indicate a character literal
(defn oreo [format-str]
  (let [width (count format-str)

        ; A helper function since Clojure doesn't have built-in string multiplication
        str-repeat #(apply str (repeat % %2))

        ; Define the layers
        cookie (str-repeat width \█)
        cream (str \ (str-repeat (- width 2) \░) \ )]

    (->> format-str ; Take the input string,
         (remove #{\r}) ; remove r for simplcity,
         (replace {\o cookie, \e cream}) ; replace the remaining letters with the layers,
         (clojure.string/join "\n")))) ; and join the layers together with newlines

2

다트 , 120 (106) 107 바이트

f(s)=>s.replaceAll('o',''.padRight(s.length,'#')+'\n').replaceAll('re',' '.padRight(s.length-1,'-')+' \n');

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

  • +1 바이트 : 후행 공백 추가

"충전의 양쪽에 공백이 필요합니다"
NieDzejkob

오, 신경 쓰지 마, 곧 고쳐 줄게 정보 주셔서 감사합니다, 나는 그것을 놓쳤다
Elcan

2

파이썬 2 , 77 76 72 바이트

lambda i:'\n'.join((x*len(i),' '+x*(len(i)-2))[x>'o']for x in i if'e'<x)

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

쿠키의 바깥 부분은 'o'이고 채우기는 'r'입니다.


68 바이트 . 후행 공백을 실제로 생략 할 수 있을지 의심 스럽지만 사양에 " 충전 양쪽 에 공백 이 필요합니다"라고 표시되어 있습니다.
Erik the Outgolfer

감사합니다 @EriktheOutgolfer. 람다는 더 짧을 것이라고 생각했습니다! 이 경우에는 추측하지 않습니다. 필링의 필수 후행 공간에 대한 요구 사항을 놓쳤습니다. 아스키 아트 챌린지로 요점을 실제로 볼 수는 없지만 OP가 요구하는 것이라면 내 대답은 어쨌든 유효하지 않은 것 같습니다.
ElPedro

이제 수정되었습니다.
ElPedro

왜 다시 76로 가져 오나요? 그냥 넣어 +' '(l-2). 또한 오타가 *' '있어야합니다 +' '.
아웃 골퍼 Erik

이것이 현재 솔루션으로 수행 한 작업입니다. 내일 (나중에 오늘) 힌트를 자세히 살펴볼 것입니다. 여기가 늦었고, 하루 종일 눈이 삽질되어 너무 피곤했습니다. 그래도 팁 주셔서 감사합니다 :)
ElPedro

2

x86-64 머신 코드 (Linux), 97 바이트

0000000000000000 <oreo_asm>:
   0:   56                      push   %rsi
   1:   57                      push   %rdi

0000000000000002 <len>:
   2:   48 ff c7                inc    %rdi
   5:   80 3f 00                cmpb   $0x0,(%rdi)
   8:   75 f8                   jne    2 <len>
   a:   49 89 fc                mov    %rdi,%r12
   d:   5f                      pop    %rdi
   e:   49 29 fc                sub    %rdi,%r12
  11:   4d 31 f6                xor    %r14,%r14
  14:   eb 18                   jmp    2e <outer_loop.skip>

0000000000000016 <extra>:
  16:   41 c6 01 20             movb   $0x20,(%r9)
  1a:   c6 03 20                movb   $0x20,(%rbx)
  1d:   49 ff ce                dec    %r14
  20:   eb 06                   jmp    28 <outer_loop>

0000000000000022 <newline>:
  22:   c6 06 0a                movb   $0xa,(%rsi)
  25:   48 ff c6                inc    %rsi

0000000000000028 <outer_loop>:
  28:   49 ff c6                inc    %r14
  2b:   48 ff c7                inc    %rdi

000000000000002e <outer_loop.skip>:
  2e:   44 8a 07                mov    (%rdi),%r8b
  31:   41 80 f8 65             cmp    $0x65,%r8b
  35:   74 df                   je     16 <extra>
  37:   45 84 c0                test   %r8b,%r8b
  3a:   74 23                   je     5f <done>
  3c:   48 89 f3                mov    %rsi,%rbx

000000000000003f <inner_loop>:
  3f:   44 88 06                mov    %r8b,(%rsi)
  42:   49 89 f1                mov    %rsi,%r9
  45:   48 ff c6                inc    %rsi
  48:   48 31 d2                xor    %rdx,%rdx
  4b:   48 89 f0                mov    %rsi,%rax
  4e:   48 2b 04 24             sub    (%rsp),%rax
  52:   4c 29 f0                sub    %r14,%rax
  55:   49 f7 f4                div    %r12
  58:   48 85 d2                test   %rdx,%rdx
  5b:   74 c5                   je     22 <newline>
  5d:   eb e0                   jmp    3f <inner_loop>

000000000000005f <done>:
  5f:   5e                      pop    %rsi
  60:   c3                      retq

이 x86-64 함수는 rsi의 입력 문자열에 대한 포인터를 가져와 rdi의 포인터에서 시작하여 출력을 빌드합니다 (Linux의 C 함수에서 처음 두 인수를 전달하는 데 사용되는 레지스터입니다). 편의상, 좋은 입력 삭제를 수행하고 출력을 인쇄하는 C ++ 래퍼를 작성했습니다. 그 코드는 여기있습니다 . 이것은 또한이 함수를 위해 작성한 원래 nasm 구문 어셈블리와 내가 처음 작업 한 골프 이외의 버전을 보여줍니다.

이 코드는 수신자가 저장 한 레지스터를 존중하지 않으므로이 함수를 호출 한 후 잠시 동안 C ++ 코드를 실행하면 충돌이 발생할 수 있습니다. 내 컴퓨터에서는 그렇지 않지만 다소 놀랍습니다. 또한 출력 문자열을 구분하기 위해 null 바이트를 추가하지 않고 출력 문자열에 할당 된 공간이 바이트로 미리 채워져 있습니다. (이것이 허용되지 않으면 3 바이트의 비용으로 null 종결자를 추가 할 수 있습니다).

이 코드의 논리는 본질적으로 문자열의 길이를 계산 한 다음 입력 문자열에 표시되는 각 'o'및 'r'문자에 대해이 길이의 행을 작성하고 표시된 'e'문자에 대해 첫 번째 문자를 대체합니다. 공백 문자가있는 이전 행의 마지막 문자

C ++과 nasm 소스 코드를 혼합하여 컴파일하고 실행하기 위해 온라인 어디에서도 찾을 수 없으므로 작동하는 것으로 입증하기 위해 작은 래퍼 코드를 작성할 수 있습니다. 그렇지 않으면 명령으로 제공 한 링크의 makefile로 이것을 컴파일하고 실행할 수 있어야합니다.

$ make oreo ASM_FILE=oreo_golf.nasm
$ ./oreo oreoorererereoo --use_asm

gcc가 허용하는 형식으로 어셈블리를 포맷 할 수 있었으므로 온라인으로 시도하십시오!


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