Oreoorererereoo

60

Oreoorererereoo

Diberikan string input yang mirip dengan kata "oreo", berikan representasi ASCII dari cookie yang selebar string input (untuk memastikan stabilitas cookie).

Aturan

  • Inputnya adalah huruf kecil, string yang tidak kosong tanpa spasi kosong yang berisi kombinasi string "o" dan "re", dan hanya berisi string tersebut.
  • String "o" mewakili cookie padat, sedangkan string "re" mewakili pengisian.
  • Keluaran harus berupa cookie bertumpuk yang selebar string input.
  • Outputnya mungkin bukan array string
  • Cookie harus tumpang tindih dengan satu karakter di setiap sisi
  • Karakter yang digunakan untuk output tidak harus cocok dengan output di bawah ini (█ dan ░), mereka hanya harus menjadi karakter non-spasi putih yang berbeda untuk dua bagian cookie
  • Padding spasi putih di sisi kiri pengisian diperlukan, dan spasi spasi tambahan adalah opsional

Contohnya

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

Input: o
Output:
█

Input: re
Output: (two spaces)


Input: rere
Output:
 ░░ 
 ░░ 

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

Karena ini adalah kode golf, jawaban terpendek menang, semoga berhasil :)

GammaGames
sumber
3
"Diperlukan padding spasi pada setiap sisi isian". Apakah ini benar-benar berarti bahwa harus ada karakter spasi di akhir setiap baris pengisian? Jika demikian mengapa? Selama itu berfungsi secara visual, lalu apa persyaratan ini menambah tantangan?
ElPedro
@ ElPedro Poin bagus, saya memodifikasi aturan dan @Dennis Saya mengedit aturan sehingga komentar harus dibersihkan
GammaGames
@JonathanAllan Karena ini mencetak "ascii-art" Saya menghapus aturan itu, sepertinya saya lupa memperbarui pertanyaan. Harus diperbarui sekarang.
GammaGames
Keren terima kasih!
Jonathan Allan
@ GammaGames, jika spasi di sebelah kanan tidak diperlukan lagi, saya menganggap output untuk test case resekarang dapat diterima 1 or 2 spaces, belum tentu 2?
Kirill L.

Jawaban:

15

Jelly ,  16 14  13 byte

-1 Terima kasih kepada Erik the Outgolfer

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

Menggunakan 1krim dan 0kue.

Cobalah online!

Bagaimana?

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

Byter 16 sebelumnya:

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

Menggunakan runtuk c ream dan ountuk c ookie.

Cobalah online!

Jonathan Allan
sumber
Saya berharap untuk entri Jelly, bahasa yang sangat menarik!
GammaGames
19

Pepe , 364 byte

Sayangnya penerjemah online tidak menangani mengompresi komentar, maka semua okarakter akan digantikan oleh spasi .. Baik spasi maupun oyang diperlukan, jadi ini bisa menjadi 295 byte, tapi saya lebih suka seperti ini:

rEeEEeeEeEororEEoreoreeeEeeeeeorEEEEeoREeoreorEeEEeEEEEororEEoreorEEEEEoREeoreorEeEEEeeEeororEEoreoReoREoREEEeoREEEEEoreorEorEEEeorEEEEEoreEoREeoreoREEeoREEEEeEeeoREEEeoREeeEoREEEeoREEEEEEEorEEEeEorEEEeoREoREEEeoREEEEEoREEoReoreorEEEeEoREEEEEEeorEEEeoReEoREoREEEeoREEoReoroReEeoREoREEEeorEEEEeoReeoREEEeoREeeEoREEEeoREEEEEEEoreoReoReoREoREEEeoREEEEEoreeeeeEeEeoRee

Cobalah online!

Tidak disatukan

Mungkin ada beberapa peluang golf dengan bendera yang saya lewatkan, tapi saya sudah selesai sekarang:

# "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
ბიმო
sumber
1
Saya memindahkan percakapan ini ke obrolan untuk Anda.
DJMcMayhem
9

Kanvas , 19 18 17 byte

e ∙╋
:r≠*┤];L×⁸↔⁸

Coba di sini!

Menggunakan kode panjang yang mengganggu :r≠*┤]untuk menghapus rs dari input ..

dzaima
sumber
Itu fitur yang berguna, dan bahasa keren!
GammaGames
7

Japt -R , 16 15 byte

re ¬£çX sX²èrÃû

Cobalah

                    :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

Alternatif

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

C # (Visual C # Interactive Compiler) , 95 byte

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

Cobalah online!

Alternatif menggunakan Agregat, 108 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1
sekarang ini memotong spasi tambahan ..
dzaima
Ada umpan balik yang cukup sehingga saya menghapus aturan baris baru. Jangan ragu untuk memperbarui entri Anda.
GammaGames
Penggantian Anda tidak berfungsi saat inputnya o, karena n.Length-2akan menghasilkan -1.
Kevin Cruijssen
The n.Length-2is adalah ketika input memiliki re.
Perwujudan Ketidaktahuan
6

R , 106 byte

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,,"")}

Cobalah online!

  • -12 byte terima kasih kepada @Giuseppe

Versi sebelumnya dengan penjelasan:

R , 118 byte

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,,'')}

Cobalah online!

  • -1 byte terima kasih kepada @Giuseppe

Kode dan penjelasan yang belum dibuka:

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
}
menggali semua
sumber
106 byte
Giuseppe
aaand 104 byte mengembalikan daftar baris, yang tidak dapat diterima di sini, tapi itu ide yang menarik (pada dasarnya pengajuan SNOBOL saya diterjemahkan ke R)
Giuseppe
6

05AB1E , 18 17 16 byte

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

-1 byte terima kasih kepada @Emigna

Penggunaan ountuk cookie dan runtuk mengisi.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

'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"
Kevin Cruijssen
sumber
Solusi kreatif, Tapi itu tidak menyelesaikan masalah sepenuhnya: oro akan memberikan jawaban yang salah
Mark Smit
@MarkSmit orobukan input yang mungkin, karena input hanya akan berisi os dan res. Apapun, orotampaknya masih benar mengikuti spesifikasi, karena itu outputooo\n r\nooo . Apa yang salah tentang itu?
Kevin Cruijssen
Ini tidak valid: "Ruang putih di setiap sisi isian diperlukan"
NieDzejkob
2*dapat ·dan spasi kosong yang hilang dapat diperbaiki dengan mengubah ».cke.c.B»
Emigna
@Emigna Ah, tidak percaya aku belum memikirkannya ·, terima kasih! :) Dan selalu menyenangkan memiliki spesifikasi yang berubah selama tantangan, desah ..
Kevin Cruijssen
5

Retina , 74 73 byte

Saya merasa sudah lama tidak mengirimkan jawaban. Nah, inilah saya. Juga, Retina telah banyak berubah, dan saya merasa seperti saya payah sekarang.

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

o|r
$&¶
_$

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

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

m`^r
 

Cobalah online!

mbomb007
sumber
1
Wah, bahasa yang terlihat gila. Saya suka itu!
GammaGames
tidak termasuk
jejak
2
Saya suka bagaimana [or]artinya oatau rbukannya [atau ]. Membuat kepalaku sakit.
nedla2004
@dzaima Pertanyaan tidak menentukan bahwa spasi spasi tambahan diperlukan. Sebuah komentar bertanya, tetapi tidak ada jawaban yang diberikan.
mbomb007
@ nedla2004 Itu benar-benar membantu saya memperhatikan cara untuk menyimpan byte. Terima kasih.
mbomb007
5

Retina , 21 byte

r

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

Cobalah online! Penjelasan:

r

Hapus rs.

L$`.
$.+*$&

Tuliskan setiap huruf pada barisnya sendiri yang diulang sampai panjang input aslinya.

\bee
 

Ganti dua ees pertama pada setiap baris dengan spasi.

Neil
sumber
Ini melanggar aturan: "Ruang putih di setiap sisi isian diperlukan"
NieDzejkob
@NieDzejkob Maaf karena mengabaikan itu, harus diperbaiki sekarang.
Neil
Persyaratan spasi tambahan FYI terangkat.
Jacktose
@Neil Anda harus memperbaikinya &amp;: P
ASCII-satunya
5

C (gcc) , 135 113 109 104 byte

  • Disimpan dua puluh dua dua puluh tujuh byte berkat NieDzejkob .
  • Disimpan empat byte berkat ceilingcat .
#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));}

Cobalah online!

Jonathan Frech
sumber
Shave off bytes dengan-D$=putchar
131 byte jika Anda menambahkan baris tambahan sesuai yang diizinkan oleh aturan.
NieDzejkob
127 byte jika Anda memindahkan e=oke kondisi pertama untuk loop dan kemudian menghapus yang lain.
NieDzejkob
118 byte jika Anda memilih cookie dan mengisi karakter dengan hati-hati.
NieDzejkob
113 bytes
NieDzejkob
4

JavaScript ES6, 103 byte

Menggunakan ganti 103 byte:

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

Cobalah online!

Menggunakan split dan memetakan 116 byte:

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

Cobalah online!

fəˈnɛtɪk
sumber
1
JS bagus! Anda mengingatkan saya bahwa saya akan menambahkan aturan tentang tidak memiliki pengembalian baris pada akhir output, saya telah menambahkannya. Maaf soal itu!
GammaGames
3
menghapus baris baru terakhir adalah 12 byte
fəˈnɛtɪk
Ada umpan balik yang cukup sehingga saya menghapus aturan baris baru. Jangan ragu untuk memperbarui entri Anda.
GammaGames
3
Anda dapat menyimpan byte dengan menggunakan string template dengan ${"|".repeat(s>1?s-2:0)}dan spasi putihnya, daripada menggunakan " "+"|".repeat(s>1?s-2:0).
Ismael Miguel
Jika Anda menggunakan backticks untuk string di split pertama, Anda bisa menghapus tanda kurung di sekitarnya.
skiilaa
4

Perl 5 -p , 47 byte

s|o|X x($i=y///c).$/|ge;s|re|$".O x($i-2).$/|ge

Cobalah online!

Xcali
sumber
Ini melanggar aturan: "Ruang putih di setiap sisi isian diperlukan"
NieDzejkob
dengan beberapa variasi tio.run/##K0gtyjH9/…
Nahuel Fouilleul
4

Python 3 , 77 byte

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

Cobalah online!

Rɪᴋᴇʀ
sumber
Pintar! Saya memang bermaksud output untuk tidak mencetak spasi untuk mengisi (itu cukup banyak oreo ascii), jadi saya telah mengedit aturan sesuai. Maaf soal itu! Dan saya selalu suka jawaban python :)
GammaGames
@JonathanFrech juga menghapus komentar, bahwa pendekatan itu tidak valid. Saya akan bekerja pada golf lebih banyak besok.
Rɪᴋᴇʀ
Anda dapat menghapus spasi di +" \n"untuk menghemat satu byte.
Kevin Cruijssen
@KevinCruijssen bisakah saya? Program input mengatakan seluruh cookie harus selebar input.
R
2
Saya menafsirkan bahwa sebagai makna bahwa ruang tambahan sama (secara visual) dengan tidak ada ruang. Itulah keindahan jawaban untuk tantangan seni ascii. Jika mereka terlihat benar, mereka benar :-)
ElPedro
4

Mathematica, 111 91 byte

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

Cobalah secara Online!

Hal ini majorly disingkat berkat Misha 's suntingan .


Kode asli saya:

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

Kode ini tidak terlalu mewah tetapi tampaknya terlalu mahal untuk mengkonversi dari string dan kemudian kembali atau melakukan hal lain yang pintar.

Secara khusus, dengan hanya 3-4 perintah yang memiliki nama String, pendekatan awal saya tidak dapat menyimpan byte sama sekali dengan mencoba abstrak itu. Misalnya, berikut ini adalah 129 byte:

(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"})&
Tanda.
sumber
1
Beberapa perbaikan: StringRepeatdapat Tablekarena <>akan mengubah daftar menjadi string nanti; yang Iftidak perlu karena kita mengambil recabang hanya ketika nsetidaknya 2; kita dapat menghemat tanda kurung dengan mendefinisikan nhanya saat kita menggunakannya. Cobalah online!
Misha Lavrov
@MishaLavrov Iftelah ditambahkan karena StringRepeatakan menimbulkan kesalahan pada kasus "re"; itu tidak memungkinkan Anda untuk mengulang string 0 kali. Tabletidak memiliki batasan seperti itu, jadi itu menghemat besar!
Mark S.
4

Perl 6 , 37 byte

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

Cobalah online!

Blok kode anonim yang mengambil string dan mencetak oreo, dengan osebagai cookie dan rsebagai krim.

Penjelasan:

{                                   }   # 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
Jo King
sumber
Saya tidak sadar obisa digunakan sebagai pengganti . Golf yang sangat bagus.
Primo
4

Java 11, 110 byte

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

Penggunaan =untuk cookie dan ~untuk mengisi.

Cobalah online.

Penjelasan:

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

Solusi di atas menggunakan pengganti. Alih-alih, berikut ini memetakan karakter input:

Java 11, 113 112 byte

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

-1 byte terima kasih kepada @Neil .

Cobalah online.

Penjelasan:

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"
Kevin Cruijssen
sumber
1
Dapatkah Anda menggunakan ~c&1?
Neil
@Neil aku memang bisa, terima kasih.
Kevin Cruijssen
Ini tidak valid: "Ruang putih di setiap sisi isian diperlukan"
NieDzejkob
@NieDzejkob Tetap .. Selalu senang memiliki spesifikasi yang berubah selama tantangan, desah ..
Kevin Cruijssen
@KevinCruijssen tidak lagi: P
ASCII-satunya
4

PHP ,100 99 93 byte

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

Cobalah online!

ADUH. Waaaay_too_long nama fungsi PHP menyerang lagi!

Keluaran:

$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
640KB
sumber
Tidak valid, garis krim memerlukan ruang tambahan
hanya ASCII
Memperbaiki ruang trailing. Terima kasih!
640KB
1
Astaga, PHP! Juga setiap spasi kosong sekarang opsional, ada cukup banyak orang yang menunjukkan bahwa sejak mencetak ascii itu tidak harus benar-benar diperlukan.
GammaGames
4

PHP , 96 87 85 byte

Terima kasih kepada @gwaugh -9 Bytes
Berkat @manatwork -2 Bytes

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

Cobalah online!

Cobalah online! (87 Bytes)

Cobalah secara online (pengiriman asli 97 byte)!


Dan fungsi rekursif

PHP , 135 byte

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):"";}

Cobalah online! (rekursif)

Francisco Hahn
sumber
1
dengan menggabungkan yang terbaik dari dua kiriman kami, saya bisa mendapatkannya hingga 87 byte TIO . Apakah Anda bersedia mengikuti ini sebagai kiriman kolaboratif? :)
640KB
1
Saya pikir kita dapat menghapus 1 byte lagi dengan menggunakan perintah short_tag_open, dan alih-alih <?=kita dapat menggunakan <?, atau apakah saya salah?
Francisco Hahn
1
2 karakter lebih pendek dengan interpolasi string: ' '.$r(o,$l-2)."␤"" {$r(o,$l-2)}␤".
manatwork
Terima kasih @manatwork kadang-kadang saya lupa php vars dievaluasi dalam sebuah string jika seluruh string dideklarasikan dengan ""istead dari''
Francisco Hahn
1
Ini bisa lebih pendek 3 byte menggunakan $argn: Coba online!
Night2
4

JavaScript, 72 65 64 byte

s=>s.replace(/.e?/g,([x,y])=>(y?`
 `:`
`).padEnd(s.length+!y,x))

Cobalah online

Shaggy
sumber
4

Powershell, 71 69 66 byte

-2 byte terima kasih @Veskah

-3 byte terima kasih @AdmBorkBork

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

Skrip uji yang kurang golf:

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

Keluaran:

True
True
True
True
True
mazzy
sumber
1
Sepertinya Anda tidak memerlukan parens di sekitar $args 69 byte
Veskah
1
Panjangnya [string[]]adalah [int[]]... [int[]]Adalah [int]jika array hanya berisi satu elemen. Bagus! Terima kasih!
mazzy
1
OP memperbarui tantangannya sehingga Anda tidak perlu spasi tambahan lagi. Ini berarti Anda rbisa " "+'%'*($l-2)menggunakan -3 byte.
AdmBorkBork
3

Arang , 19 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Fθ

Ulangi karakter string input.

≡ι

Aktifkan setiap karakter.

o⟦⭆θ#⟧

Jika ini adalah omaka cetak string input diganti dengan #s pada barisnya sendiri.

e«→P⁻Lθ²↙

Jika ini ekemudian bergerak ke kanan, cetak satu baris -s yang kurang dari dua panjang string input, kemudian pindah ke bawah dan ke kiri.

Neil
sumber
3

Bash, 87 byte

Tanpa sed:

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

Terima kasih kepada @manatwork.

Dengan sed(90 byte):

f(){ printf %$1s|tr \  $2;}
echo $1|sed "s/o/`f ${#1} B`\n/g;s/re/ `f $[${#1}-2] F` \n/g"
hijau
sumber
Bisakah Anda menunjukkan kepada kami beberapa penggunaan sampel? Saya agak bingung dengan fungsi Anda mengharapkan 2 parameter.
manatwork
Anda menulis itu ke dalam skrip yang disebut test.sh. Kemudian, Anda menelepon test.sh dari baris perintah sebagai berikut: bash test.sh oreoorererereoo. fdiperlukan untuk mengulang karakter $2 $1beberapa kali
Green
Ups. Saya sepenuhnya salah paham fungsi f. Beberapa perubahan kecil lebih lanjut dapat dilakukan di sana: Coba online!
manatwork
1
75 byte
Dennis
1
60 byte
Nahuel Fouilleul
3

C # (Visual C # Interactive Compiler) , 71 byte

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

Cobalah online!

Meminjam beberapa ide dari jawaban Perwujudan Ketidaktahuan pasti.

-6 byte terima kasih kepada @ASCIIOnly!

Konsep keseluruhannya adalah untuk menghitung agregat string di atas karakter input dengan mengikuti aturan-aturan ini:

  • Jika rditemui, tambahkan karakter spasi tunggal untuk indentasi. Kita tahu karakter selanjutnya adalah e.
  • Jika suatu oatau suatu editemui, menghasilkan string dengan mengulangi karakter saat ini beberapa kali dan menambahkannya ke baris baru atau padding dan baris baru.
  • Jumlah pengulangan ditentukan oleh panjang string input dan apakah jalur saat ini di indentasi.
  • The PadLeftFungsi ini digunakan untuk menghasilkan string karakter berulang.

Hasilnya adalah gabungan dari semua string ini.

dana
sumber
1
71
ASCII
@ASCIIHanya - Terima kasih :)
dana
> Padding spasi putih di setiap sisi isian diperlukan
ASCII
1
85?
ASCII
Saya tidak menyadarinya :) Meskipun, dalam meninjau jawaban yang diposting tentang 1/2 telah melakukan hal yang salah juga. Tangkapan yang bagus!
dana
3

Pyth , 28 byte

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

Coba di sini! Yang ini menggunakan loop.

Pyth, 30 byte

(Saat string diganti)

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

Coba di sini! Yang ini menggunakan penggantian string.

Saya sangat suka python (itulah yang saya tulis dalam skrip tes asli saya), jadi saya pikir saya akan melakukan entri pyth untuk bersenang-senang :)

GammaGames
sumber
1
Bukankah ini 37 byte? Saya pikir Pyth menggunakan ASCII default sebagai codepage-nya seperti Python, jika saya ingat dengan benar. Jadi meskipun kode Anda adalah 33 karakter, keduanya dan masing-masing tiga byte. Atau saya kehilangan sesuatu di sini?
Kevin Cruijssen
Panggilan bagus, saya tidak menyadari itu (saya tidak bisa mendapatkan pyth untuk bekerja pada tio.run, jadi saya menggunakan penghitung panjang di halaman herokuapp). Dalam for loop saya hanya bisa mengganti karakter dengan N, bahkan menghemat beberapa byte!
GammaGames
Kupikir sesuatu seperti itu terjadi. :) Saya pernah mengalami masalah yang sama dengan jawaban saya di 05AB1E yang menggunakan karakter di luar halaman kode. Sayangnya TIO menampilkan karakter dan byte yang sama untuk sebagian besar bahasa golf. Untuk Java atau Python TIO akan menyatakan dengan benar 33 chars, 37 bytes, tetapi tidak dalam bahasa golf di TIO. Tetapi dalam solusi Anda hanya mengubah karakter-karakter itu memang memperbaiki masalah, jadi ini bukan masalah besar di sini.
Kevin Cruijssen
@KevinCruijssen Tunggu, 05AB1E tidak menggunakan SBCS yang sebenarnya?
ASCII
1
Jika Anda tertarik, sepertinya bekerja dengan mudah di TIO untuk saya.
NieDzejkob
3

Ruby , 62 60 byte

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

Cobalah online!

Penggunaan Ountuk kue, *untuk isian.

-1 berkat @manatwork menunjukkan kesalahan konyol dan -1 lainnya karena relaksasi aturan tentang ruang putih.

Kirill L.
sumber
Tidak perlu tanda kurung di sekitar .gsubparameter.
manatwork
2

C # (.NET Core) , 143 byte

Tanpa LINQ.

p=>{var q="";foreach(char c in p){if(c!='e'){for(var j=0;j<p.Length;j++)q+=(j<1|j>p.Length-2)&c>'q'?" ":c<'p'?"█":"░";q+="\n";}}return q;};

Cobalah online!

Destroigo
sumber
2

Clojure , 137 byte

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

Saya tidak menggunakan karakter yang bagus dalam cetakan di versi golf karena itu mahal. Mengembalikan string yang akan dicetak.

Cobalah online!

Lihat penjelasan di bawah ini.

Pra-golf:

; 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
Carcigenicate
sumber
2

Dart , 120 106 107 byte

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

Cobalah online!

  • +1 byte: Menambahkan spasi spasi tambahan
Elcan
sumber
Ini tidak valid: "Ruang putih di setiap sisi isian diperlukan"
NieDzejkob
Oh, sudahlah, aku akan memperbaikinya segera. Terima kasih atas informasinya, saya melewatkannya
Elcan
2

Python 2 , 77 76 72 byte

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

Cobalah online!

Bagian luar cookie adalah 'o' dan isiannya adalah 'r'.

ElPedro
sumber
68 byte . Meskipun saya ragu apakah Anda benar-benar dapat menghilangkan spasi tambahan, spek itu mengatakan "Ruang putih pada setiap sisi isian diperlukan" ...
Erik the Outgolfer
Terima kasih @EriktheOutgolfer. Kupikir lambda akan lebih pendek! Kira dalam hal ini tidak. Telah melewatkan persyaratan tentang ruang trailing wajib pada pengisian. Benar-benar tidak bisa melihat intinya dengan tantangan seni ascii tetapi jika itu yang OP butuhkan maka saya kira jawaban saya tidak valid.
ElPedro
Sekarang dikoreksi ...
ElPedro
Mengapa membawanya kembali ke 76? Hanya +' 'setelah (l-2). Anda juga salah ketik, *' 'pasti +' '.
Erik the Outgolfer
Itulah yang saya lakukan dengan solusi saya saat ini. Akan melihat petunjuk Anda lebih dekat besok (hari ini nanti). Sudah terlambat di sini dan saya telah menyekop salju sepanjang hari sehingga terlalu lelah untuk bermain golf. Terima kasih atas tipsnya :)
ElPedro
2

kode mesin x86-64 (Linux), 97 byte

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

Fungsi x86-64 ini membawa pointer ke string input di rsi dan membangun output mulai dari pointer di rdi (ini adalah register yang digunakan untuk melewati dua argumen pertama dari fungsi C di Linux). Untuk kenyamanan, saya telah menulis bungkus C ++ untuk ini yang juga melakukan sanitasi input yang bagus dan mencetak hasilnya. Kode itu dapat ditemukan di sini . Ini juga menunjukkan rakitan sintaks nasm asli yang saya tulis untuk fungsi ini (dan juga versi non-golf yang pertama kali saya gunakan).

Beberapa hal yang perlu diperhatikan adalah bahwa kode ini tidak menghormati register tersimpan callee apa pun, yang berarti bahwa kode C ++ kemungkinan akan macet jika dijalankan beberapa saat setelah memanggil fungsi ini. Di komputer saya tidak, tapi itu agak mengejutkan. Saya juga tidak menambahkan byte nol untuk membatasi string output, dan sebagai gantinya ruang yang dialokasikan untuk string output diisi dengan byte. (Jika ini tidak diizinkan, saya dapat menambahkan terminator nol dengan biaya 3 byte).

Logika untuk kode ini pada dasarnya menghitung panjang string, kemudian membangun garis panjang ini untuk setiap karakter 'o' dan 'r' yang terlihat dalam string input, dan kemudian untuk setiap karakter 'e' yang terlihat, menggantikan yang pertama dan karakter terakhir pada baris sebelumnya dengan karakter spasi.

Saya tidak dapat menemukan tempat online untuk mengkompilasi dan menjalankan campuran kode sumber C ++ dan nasm, jadi saya mungkin menulis beberapa kode wrapper kecil untuk membuktikannya berfungsi. Kalau tidak, Anda harus dapat mengkompilasi dan menjalankan ini dengan makefile di tautan yang saya berikan dengan perintah:

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

Saya dapat memformat perakitan menjadi sesuatu yang dapat diterima oleh gcc, jadi cobalah secara online!

davey
sumber
1
Ya ampun, sekarang ini sebuah entri!
GammaGames