Di sana, saya memperbaikinya (dengan kaset)

41

Tantangan:

Diberi string yang hanya berisi huruf besar dan / atau kecil (mana saja yang Anda suka), letakkan tapesecara horizontal untuk memperbaikinya. Kami melakukan ini dengan memeriksa perbedaan dua huruf yang berdekatan dalam alfabet (mengabaikan lilitan dan hanya maju), dan mengisi ruang dengan sebanyak TAPE/ yang tapekita butuhkan.


Contoh:

Input: abcmnnnopstzra
Keluaran:abcTAPETAPETmnnnopTAstTAPETzra

Mengapa?

  • Antara cdan mharus defghijkl(panjang 9), jadi kami isi ini dengan TAPETAPET;
  • Antara pdan sharus qr(panjang 2), jadi kami isi ini dengan TA;
  • Antara tdan zharus uvwxy(panjang 5), jadi kami isi dengan ini TAPET.

Aturan tantangan:

  • Perbedaannya hanya berlaku ke depan, jadi tidak ada rekaman di antara keduanya zra.
  • Dimungkinkan untuk memiliki lebih dari satu huruf berdekatan yang sama seperti nnn.
  • Anda diizinkan mengambil input dalam format apa pun yang masuk akal. Dapat berupa string tunggal, string-array / daftar, karakter-array / daftar, dll. Output memiliki fleksibilitas yang sama.
  • Anda diizinkan menggunakan huruf kecil dan / atau huruf besar dengan cara apa pun yang Anda inginkan. Ini berlaku untuk input, output, dan TAPE.
  • Mungkin tidak TAPEdiperlukan, dalam hal ini input tetap tidak berubah.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, tambahkan tautan ke tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

Input:  "abcmnnnopstzra"
Output: "abcTAPETAPETmnnnopTAstTAPETzra"

Input:  "aza"
Output: "aTAPETAPETAPETAPETAPETAPEza"

Input:  "ghijk"
Output: "ghijk"

Input:  "aabbddeeffiiacek"
Output: "aabbTddeeffTAiiaTcTeTAPETk"

Input:  "zyxxccba"
Output: "zyxxccba"

Input:  "abccxxyz"
Output: "abccTAPETAPETAPETAPETAPExxyz"

Input:  "abtapegh"
Output: "abTAPETAPETAPETAPETtaTAPETAPETAPETApeTgh"

Input:  "tape"
Output: "taTAPETAPETAPETApe"
Kevin Cruijssen
sumber
10
Tidak yakin mengapa kami akan membuang beberapa di antara perbaikan-perbaikan (misalnya, kami membuang APE setelah memperbaiki dengan TAPETAPET dan sebelum memperbaiki dengan TA) sepertinya membuang-buang TAPE yang baik bagi saya, tapi mungkin itu yang saya lakukan (maaf).
Jonathan Allan
@ Jonathan Allan Hehe, Anda memang benar bahwa itu agak buang-buang 'rekaman'. Hmm, bisa jadi sesuatu yang bisa saya gunakan di bagian 2 dari tantangan . ;)
Kevin Cruijssen
Bagaimana jika senar datang dengan pita - misalnya, abTAPEgh?
manassehkatz-Reinstate Monica
@manassehkatz Ini akan diartikan sebagai setiap karakter lain, jadi ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh(menambahkan []untuk membuatnya lebih mudah dibaca).
Kevin Cruijssen
1
@KevinCruijssen Yang konsisten, meskipun (seperti dengan pertanyaan "wasting tape") tidak 100% logis. Jadi mungkin satu lagi test case: Input TAPE, output TATAPETAPETAPETAPE (saya pikir saya benar ...)
manassehkatz-Reinstate Monica

Jawaban:

8

05AB1E , 14 12 byte

'¡ÉIÇ¥<∍‚ζJJ

Cobalah online!

Penjelasan

'¡É            # push the string "tape"
   I           # push input
    Ç          # convert to a list of character codes
     ¥         # calculate deltas
      <        # decrement
       ∍       # extend the string "tape" to each of these sizes
               # results in an empty string for sizes smaller than zero
        ‚ζ     # zip with input (results in a list of pairs)
          JJ   # join to a list of strings and then to a string
Emigna
sumber
4
Maukah Anda menambahkan penjelasan? Saya pikir ini cukup mirip dengan jawaban Jelly, tapi saya ingin tahu karakter mana yang digunakan untuk operasi mana yang mendapatkan hasilnya. Salah satu aturan umum dalam tantangan saya: " Juga, tolong tambahkan penjelasan jika perlu. ", Dengan bahasa seperti Jelly, 05AB1E, Charcoal, APL, dll. Anda dapat mengasumsikan bahwa kebanyakan orang tidak dapat membacanya dan penjelasan wajib dilakukan . :)
Kevin Cruijssen
@KevinCruijssen: Tentu saja. Saya biasanya menambahkan penjelasan pada jawaban 05AB1E saya, tetapi saya tidak selalu punya waktu ketika saya mempostingnya.
Emigna
1
@KevinCruijssen dalam argumen dari tautan TIO 05AB1E apa pun yang dapat Anda tambahkan -duntuk mendapatkan dump operasi mentah dengan operasi apa yang terjadi sebagai pengganti penjelasan, tapi saya mencoba mempostingnya juga tidak langsung terutama pada beberapa LOL milikku.
Magic Octopus Urn
10

Jelly , 13 byte

OI’“¡ʂƁ»ṁ$€ż@

Cobalah online!

Penjelasan

OI '“¡ʂƁ» ṁ $ € ż @ - Program lengkap. Ambil string sebagai argumen baris perintah.
O - Ordinal. Dapatkan nilai ASCII dari setiap karakter.
 I '- Dapatkan peningkatan (delta), dan kurangi 1 dari masing-masing.
          € - Untuk setiap perbedaan ...
   “¡ꟅƁ» ṁ $ - Cetakan string yang dikompresi "tape" sesuai dengan nilai-nilai ini.
                Pada dasarnya memperpanjang / memperpendek "pita" dengan panjang yang diperlukan.
           ż @ - Interleave dengan input.
Tuan Xcoder
sumber
Berikut ini trik untuk menurunkan Anda ke angka 12
Jonathan Allan
@ JonathanAllan Itu sepertinya tidak valid untuk saya. Ini menghasilkan abctapetapetmnnnopapstetapezrabukan abctapetapetmnnnoptasttapetzra.
Tn. Xcoder
7
Oh, ya itu tidak valid - Saya tidak menyadari kami harus membuang kaset dari gulungan!
Jonathan Allan
7

Haskell , 58 byte

f(x:y:r)=x:take(length[x..y]-2)(cycle"TAPE")++f(y:r)
f s=s

Cobalah online! Fungsi fberulang pada string dan melihat karakter berturut-turut xdan y. cycle"TAPE"menghasilkan string tanpa batas "TAPETAPETAPE...". [x..y]mendapatkan rentang karakter dari xhingga yinklusif, jadi kita perlu mengurangi dua dari panjangnya. Jika xterjadi kemudian dalam alfabet maka yatau keduanya adalah karakter yang sama, kita mendapatkan angka negatif setelah dikurangi, tetapi untungnya takemenerima itu juga dan tidak mengambil apa-apa.

Laikoni
sumber
6

Perl 5 , -F46 byte

#/usr/bin/perl -F
use 5.10.0;
say map{((P,E,T,A)x7)[2..-$^H+($^H=ord)],$_}@F

Cobalah online!

Ton Hospel
sumber
2
Akan bertanya mengapa P,E,T,Abukan T,A,P,E, tapi sekarang saya perhatikan Anda telah menggunakan ((P,E,T,A)x7)[2..-$^H+($^H=ord)alih-alih ((T,A,P,E)x7)[0..-$^H+($^H=ord)-2menyimpan dua byte. Jawaban bagus!
Kevin Cruijssen
Memang sangat bagus! Jauh lebih baik daripada pendekatan naif saya! Anda dapat menyimpan 2 byte menggunakan literal ^H( \x08)!
Dom Hastings
@DomHastings Variabel karakter kontrol literal telah dinonaktifkan untuk cukup banyak versi perl. Saya bisa mengklaim skor pada versi perl yang lebih lama (Seperti yang saya lakukan baru-baru ini do$0) tetapi hanya 2 byte di sini, jadi saya tidak repot
Ton Hospel
Ah, tentu saja! Itu karena macOS memiliki 5.18.2 secara default, jadi ini adalah versi yang paling saya kenal!
Dom Hastings
5

Haskell , 64 byte

t="TAPE"++t
e=fromEnum
f(x:y:z)=x:take(e y-e x-1)t++f(y:z)
f x=x

Menangani string huruf besar atau kecil, tetapi tidak keduanya.

Cobalah online!

Cristian Lupascu
sumber
4

C, 84 byte

i,l;f(char*s){for(;*s;)for(putchar(l=*s++),l=s[i=0]+~l;i<l;)putchar("TAPE"[i++%4]);}

Cobalah online!

C (dijalankan pada Windows Command Prompt), 81 byte

i,l;f(char*s){for(;putchar(l=*s++);)for(l=s[i=0]+~l;i<l;)putchar("TAPE"[i++%4]);}

Keluaran:

Steadybox
sumber
4

Python 3 , 98 byte

lambda a:"".join(sum(zip(a,[("TAPE"*9)[:y>x and~ord(x)+ord(y)]for x,y in zip(a,a[1:])]),()))+a[-1]

Cobalah online!

-1 byte terima kasih kepada Asone Tuhid

HyperNeutrino
sumber
@ AsoneTuhid Terima kasih. Saya akan merekomendasikan memposting jawaban Anda sendiri karena Anda telah bermain golf cukup sedikit dan Anda juga memutarkan jawaban TFeld untuk hal yang sama sehingga pengeditan akan menyebabkan dupes (yang tidak dianulir)
HyperNeutrino
Baiklah, minta -1 byte
Asone Tuhid
@AsoneTuhid oh oke, terima kasih
HyperNeutrino
4

Scala , 66 byte

(s:String)=>s./:("z"){(o,c)=>o+("TAPE"*6).take(c-o.last-1)+c}.tail

Cobalah online!

Penjelasan

/: foldLeft over the string
("z") starting with a non-empty string to we don't have to handle the first iteration in a special way
"TAPE"*6 generate a long enough string of TAPETAPETA...
.take(c-o.last-1) take the difference between this character and the previous (now the last char in the output so far) characters from the TAPETAPETA... string. o.last will always be safe because we start with a non-empty string.
o+...+c append it to the output so far ... and add this character to the end
.tail get rid of the leading z we added
Jonny Graham
sumber
Selamat datang di PPCG, dan jawaban pertama yang bagus! +1 dari saya.
Kevin Cruijssen
4

PHP , 85 byte

$s=str_split($argv[1]);foreach($s as$l)echo str_pad($l,ord(next($s))-ord($l),'TAPE');

Cobalah online!

Penjelasan

$s = str_split($argv[1]);   // convert the parameter string to an array
foreach($s as $l)           // loop the array
echo str_pad(               // print
  $l,                       // the letter
  ord(next($s)) - ord($l),  // calculate the distance to the next letter using ASCII values
  'TAPE'                    // padding string
);                          // profit!
M4tini
sumber
2
Selamat datang di situs ini! :)
DJMcMayhem
3

Javascript, 131 127 Bytes

4 Bytes disimpan berkat Rick Hitchcock.

z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))

Belum dibuka

z = a => [... a] .reduce (
  (x, y) =>
    x + [... Array (
      (f = y.charCodeAt () - (x.slice (-1) .charCodeAt ()))> 1? (f-1): 0
    )].mengurangi(
      (e, r, t) => 
        e + "TAPE" [t% 4], "") + y
);

Masalah saya di sini adalah bahwa Javascript tidak memiliki cara bersih untuk mendapatkan jarak antara karakter a dan b.

<script>
  z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
</script>

<main>
  <input id="input-box" type="text">
  <pre id=output>output</pre>
</main>

<script>
  inputBox = document.getElementById("input-box");
  inputBox.addEventListener("keyup", function(e){
    output.innerText = z(inputBox.value);
  });
</script>

Jhal
sumber
1
Bagus. Anda dapat menyimpan byte dengan menghapus semi-kolon yang tertinggal, dan menyimpan beberapa byte lagi dengan menetapkan charCodeAtke variabel: z=(a=>[...a].reduce((x,y)=>x+[...Array((f=y[c='charCodeAt']()-x.slice(-1)[c]())>1?f-1:0)].reduce((e,r,t)=>e+"TAPE"[t%4],"")+y))
Rick Hitchcock
Terima kasih! Saya benar-benar jijik dengan cara kerjanya, tapi ada baiknya untuk mengetahui bahwa itu berlaku untuk masa depan.
Jhal
3

Python 2/3 , 70 69 byte

f=lambda s,*t:t and s+('TAPE'*6)[:max(ord(t[0])+~ord(s),0)]+f(*t)or s

Cobalah online!

Asone Tuhid
sumber
2

Arang , 20 byte

⭆θ⁺…TAPE∧κ⊖⁻℅ι℅§θ⊖κι

Cobalah online! Penjelasan:

 θ              θ       Input string
⭆                       Map over characters
                  κ     Current index
                 ⊖      Decremented
               §        Index into string
             ι          Current character
            ℅ ℅         Ordinal
           ⁻            Subtract
          ⊖             Decremented
         κ              Current index
        ∧               Logical and
    TAPE                Literal string
   …                    Mold to length
                   ι    Current character
  ⁺                     Concatenate
                        Implicitly print
Neil
sumber
2

Pip , 29 byte

O@a{"TAPE"@<MX[0v-$-Ag]}.BMPa

Mengambil input sebagai argumen baris perintah (huruf kecil atau besar, tidak masalah). Cobalah online!

Penjelasan

O@a{"TAPE"@<MX[0v-$-Ag]}.BMPa
                               a is 1st cmdline arg; v is -1 (implicit)
O                              Output without newline
 @a                            the first character of a
                          MPa  Map this function to pairs of successive characters of a:
                    Ag          Get the ASCII codes of the two characters
                  $-            Fold on subtraction (i.e. asc(first)-asc(second))
                v-              -1 minus the above (i.e. asc(second)-asc(first)-1)
              [0      ]         A list containing 0 and the above
            MX                  Max of the list
          @<                    The first ^ characters (with cyclic indexing)
    "TAPE"                      of this string
   {                   }.B      Concatenate the second character
DLosc
sumber
2

JavaScript (ES6), 80 78 byte

f=([s,...S],t=S[0])=>t?s.padEnd((t>s)*(parseInt(s+t,36)-370)%37,'TAPE')+f(S):s

Jarak antara dua karakter dapat ditentukan dengan mengubah rangkaiannya menjadi basis 36, mengurangi 370, modulus 37.

Sebagai contoh (parseInt('cy',36)-370)%37 == 22,.

Kita kemudian dapat menggunakan padEnduntuk mengisi celah, dan rekursi untuk menangani loop.

Kasus uji:

Rick Hitchcock
sumber
2

K4 , 48 byte

Larutan:

{,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}

Contoh:

q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"abcmnnnopstzra"
"abcTAPETAPETmnnnopTAstTAPETzra"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"aza"
"aTAPETAPETAPETAPETAPETAPEza"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"zyxxccba"
"zyxxccba"
q)k){,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"}"aabbddeeffiiacek"
"aabbTddeeffTAiiaTcTeTAPETk"

Penjelasan:

Solusi yang cukup sederhana, tetapi jumlah byte tinggi ... Temukan delta, ambil dari string "TAPE", gabungkan ke string asli yang memotong di mana delta berada> 1.

{,/_[w;x],',[1_d w:&0<d:-1+-':"j"$x;0]#\:"TAPE"} / the solution
{                                              } / lambda
                                         "TAPE"  / the string TAPE
                                      #\:        / take each-left
           ,[                      ; ]           / join (,)
                                   0             / zero (ie append zero)           
                              "j"$x              / cast input to int
                           -':                   / deltas
                        -1+                      / subtract 1
                      d:                         / assign to d
                    0<                           / delta greater than 0?
                   &                             / indices where true
                 w:                              / assign to w
               d                                 / index into deltas at w
             1_                                  / drop first
         ,'                                      / join each-both
   _[w;x]                                        / cut input x at indices w
 ,/                                              / flatten
streetster
sumber
2

Excel VBA, 106 byte

Fungsi jendela langsung VBE anonim yang mengambil input sebagai string huruf besar melalui sel A1dan output ke jendela langsung VBE.

a=90:For i=1To[Len(A1)]:c=Mid([A1],i,1):b=Asc(c):For j=2To b-a:?Mid("peta",j Mod 4+1,1);:Next:?c;:a=b:Next
Taylor Scott
sumber
2

Ruby , 59 53 byte

->s{s.reduce{|x,y|x+y.rjust(y.ord-x[-1].ord,"TAPE")}}

Cobalah online!

Ini sebenarnya cukup mudah - kami mengambil input sebagai membagi string kami menjadi array karakter (terima kasih kepada Asone Tuhid untuk menunjukkan ini) dan menerapkan operasi pengurangan, di mana kami membenarkan setiap char dengan panjang yang dibutuhkan menggunakan "TAPE" sebagai string pengisi.

Kirill L.
sumber
Pertanyaannya mengatakan Anda dapat mengambil input sebagai array karakter. ( 53 byte )
Asone Tuhid
2

K (oK) , 33 byte

{,/((0|-1+0,1_-':x)#\:"TAPE"),'x}

Cobalah online!

{ } fungsi anonim dengan argumen x

-':x kurangi masing-masing sebelumnya (gunakan imajiner 0 sebelum item pertama)

1_ jatuhkan item pertama

0, tambahkan sebuah 0

-1+ tambahkan -1

0| maks (0, ...)

(... )#\:"TAPE"membentuk kembali string "TAPE"ke setiap item dari daftar di sebelah kiri

(... ),'xtambahkan karakter yang sesuai dari xke setiap string yang dibentuk kembali

,/ menyatukan semua

ngn
sumber
2

Ruby , 78 77 64 62 byte

-1 byte terima kasih kepada Kevin Cruijssen

f=->s,*t{t[0]?s+('TAPE'*6)[0,[0,t[0].ord+~s.ord].max]+f[*t]:s}

Cobalah online!

Asone Tuhid
sumber
Anda dapat menyimpan byte yang diubah ord-l[-1].ord-1menjadi ord+~l[-1].ord. Jawaban yang bagus. +1 dari saya.
Kevin Cruijssen
2

Java (JDK) , 91 byte

s->{var p='z';for(var c:s)System.out.print("ETAP".repeat(9).substring(1,c>p?c-p:1)+(p=c));}

Cobalah online!

Penjelasan

s->{                       // char[]-accepting lambda consumer, printing a String
 var p='z';                //  store the previous character
 for(var c:s){             //  for each character of the string
  System.out.print(        //   print...
   "ETAP".repeat(9)        //    "ETAP" repeated 9 times (to go above 26 chars)
    .substring(1,          //     of which, we substring c-p -1 characters
     c>p?c-p:1             //
    )                      //
   +(p=c)                  //    and append c, while also storing the previous character
  );

Kredit

  • -2 byte terima kasih kepada RM
  • -4 bytes berkat ceilingcat , dengan memutakhirkan ke Java 10+ dan beralih jenis kevar
  • -3 byte terima kasih kepada Kevin Cruijssen , dengan mencetak hasil versi alternatif saya (sebelumnya) alih-alih mengembalikannya
Olivier Grégoire
sumber
int p=123akan menghemat satu karakter. Tidak masalah apa yang pada di iterasi pertama, asalkan lebih besar dari atau sama dengan karakter pertama. Nilai terbesar yang dapat dimiliki karakter pertama adalah 'z'== ASCII 122, jadi 123 cukup baik. Juga, jika Anda menggunakan huruf kapital, Anda bisa menggunakan 91 alih-alih 123, menyimpan karakter lain.
RM
@ RM Terima kasih, memang itu berhasil!
Olivier Grégoire
1
-3 byte dengan mencetak langsung dalam metode alternatif Anda.
Kevin Cruijssen
1

C # (.NET Core) , 122 111 byte

Disimpan 11 byte berkat @KevinCruijssen

s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;)r+="ETAP"[(e-d)%4];return r;}

Cobalah online!

Penjelasan:

s => 
{
    var r = "" + s[0];                  //Declare string for the result and initialize with the first character from the input.
    for (                               //Loop over the input,
        int i = 1, e, d;                //starting with the second character, also declare helper variables.
        i < s.Length;                   //Loop until the end of the input is reached.
        r += s[i++])                    //Add the current character to the result and increase the counter.
        for (                           //Loop for adding the TAPE.
            e = d = s[i] - s[i - 1];    //Calculate the differnce between the current and the previous character.
            d-- > 1;)                   //Loop until the difference is 1.
            r += "ETAP"[(e - d) % 4];   //Add a character from the TAPE to the result.
    return r;                           //Return the result.
}
raznagul
sumber
1
Jawaban yang bagus, +1 dari saya. Anda dapat menyimpan 4 byte dengan mengubah whileke fordan menghapus tanda kurung: for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+=t[(e-d)%4]);. :) Oh, dan karena Anda menggunakan t="ETAP"hanya sekali, Anda dapat menggunakannya secara langsung, dan perubahan stringuntuk varmenyelamatkan 7 byte lagi: s=>{var r=""+s[0];for(int i=1,e,d;i<s.Length;r+=s[i++])for(e=d=s[i]-s[i-1];d-->1;r+="ETAP"[(e-d)%4]);return r;}.
Kevin Cruijssen
@KevinCruijssen: Terima kasih, saya tidak akan berpikir untuk menyingkirkan tanda kurung dengan memindahkan barang ke loop for. Juga jika merasa bodoh karena kehilangan itu saya bisa menggunakan "ETAP" secara langsung.
raznagul
Jawaban Anda masih bagus, jadi jangan khawatir. :) Saya mendapatkan tips golf hampir setiap kali saya memposting jawaban sendiri .. Dan juga lebih mudah untuk golf jawaban yang ada lebih jauh daripada benar-benar golf sejak awal. PS: Anda mungkin sudah melihatnya, tetapi Tips untuk kode-golf di C # dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca jika Anda belum.
Kevin Cruijssen
1

Yabasic , 119 byte

Fungsi anonim yang mengambil input sebagai string huruf besar dan output ke STDOUT.

Input""s$
a=90
For i=1To Len(s$)
c$=Mid$(s$,i,1)
b=Asc(c$)
For j=2To b-a
?Mid$("peta",Mod(j,4)+1,1);
Next
?c$;
a=b
Next

Cobalah online!

Taylor Scott
sumber
1

Python 3, 90 byte

p,o=' ',''
for t in input():y=(ord(t)-ord(p)-1)*(p!=' ');o+=('TAPE'*y)[0:y]+t;p=t
print(o)

Cobalah secara Online

Dat
sumber
Hai, saya telah memperbaiki judul Anda dari **title**hingga #title. Juga, maukah Anda menambahkan tautan TryItOnline dengan kode uji?
Kevin Cruijssen
1

Clojure, 139 119 byte

#(reduce-kv(fn[r x c](let[a(cycle "TAPE")i int d(-(i(nth(cycle %)(inc x)))(i c))](str r(if(> d 1)(apply str c(take(dec d)a))c))))""(vec %))

Fungsi anonim yang mengambil string dan mengembalikan yang direkam. Seperti biasa, Clojure sepertinya tidak terlalu baik. Apa yang saya benar-benar tidak berhasil adalah mengambil arang berikutnya dengan cara singkat. Pada char terakhir saya akan mendapatkan OutOfBoundsException, alasannya jelas. Jadi saya menempatkan cycledi sekitarnya. Mungkin ada solusi yang lebih elegan.

Tidak disatukan

#(reduce-kv
  (fn [r x c]
    (let [a (cycle "TAPE")
          i int
          d (-
             (i (nth (cycle %) (inc x)))
             (i c))]
      (str r
           (if (> d 1)
             (apply str c (take (dec d) a))
             c))))
  ""
  (vec %))

Memperbarui

Berhasil melepaskan beberapa byte. Singkirkan ifpernyataan sial dengan mengurangi perbedaan. takemenghasilkan daftar kosong jika angkanya 0 atau kurang yang pada gilirannya menghasilkan string kosong.

#(reduce-kv(fn[r x c](let[d(-(int(nth(cycle %)(inc x)))(int c)1)](str r c(apply str(take d(cycle "TAPE"))))))""(vec %))

Tidak disatukan

#(reduce-kv
  (fn [r x c]
    (let [d (-
             (int (nth (cycle %) (inc x)))
             (int c)
             1)]
      (str
       r
       c
       (apply
        str
        (take
         d
         (cycle "TAPE"))))))
  ""
  (vec %))
Joshua
sumber
1

APL (Dyalog Classic) , 30 byte

{∊⍵,¨⍨⍴∘'TAPE'¨0,0⌈-1+2-/⎕a⍳⍵}

Cobalah online!

{ } fungsi anonim dengan argumen

⎕a⍳⍵ temukan indeks karakternya dalam alfabet

2-/ perbedaan berpasangan (prev minus next)

1+ tambahkan 1

- meniadakan

0⌈ maks (0, ...)

0, tambahkan sebuah 0

⍴∘'TAPE'¨membentuk kembali secara siklis string 'TAPE'untuk masing-masing

⍵,¨⍨ tambahkan setiap char dari argumen ke string yang dibentuk kembali yang sesuai

meratakan

ngn
sumber
1

CJam , 27 25 byte

q_:i2ew.{:-~0e>_"TAPE"*<}

Cobalah online!

Jauh, jauh dari bahasa golf lainnya, tapi saya bangga dengan golf ini.

Penjelasan

q                            Read the input
     ew                      And take windows of size
    2                          2
   i                           from the code points
  :                            of each of its characters.
        {               }    For each of these windows:
         :                     Reduce with
          -                      subtraction.
                                 Since there are only 2 elements, this just subtracts them.
             e>                Take the maximum
           ~                     of this difference's bitwise negation
            0                    and zero.
                                 This returns -n-1 if n is negative, and 0 otherwise.
                                 Call this new value m.
                      *        Repeat
                "TAPE"           the string "TAPE" m times.
               _       <       And then take the first m elements.
                             The result of this will be an array of strings which consist of
                             the string "TAPE" repeated the proper amount of times.
       .                     Zip this array with the original input.
                             Since the original input is one element longer than this array,
                             the nothing is pushed after the final character.
                             Implicitly print everything.
Buah Esolanging
sumber
0

Java, 213 166 153 byte

i->{String o="";for(int a=0,l=i.length;++a<=l;){char u=i[a-1],n;o+=u;if(a<l){n=i[a];o+="TAPETAPETAPETAPETAPETAPET".substring(0,n-u>0?n+~u:0);}}return o;}

coba online

    String o = "";
    for (int a = 0, l = i.length; ++a <= l; ) {              // for each character
        char u = i[a - 1];                                    //  current character
        o += u;                                               //  add current character to output string 
        if (a < l) {                                          //  if it's not the last one
            char n = i[a];                                    //  next character
            o += "TAPETAPETAPETAPETAPETAPET".substring(0, n - u > 0 ? n +~ u : 0); // fill with enough tape but only forward
        }
    }
    return o;

Tolong bantu saya membuatnya lebih baik.

Terima kasih kepada @cairdcoinheringaahing untuk tip tentang tempat putih. Terima kasih kepada @RM untuk tip tentang pita tali. Terima kasih kepada @KevinCruijssen untuk tips lambda dan ekspresi.

Amir M
sumber
1
Selamat datang di situs ini! Anda dapat menghapus banyak ruang kosong untuk golf jawaban ini dan pastikan untuk memeriksa tips ini untuk bermain golf di Jawa !
caird coinheringaahing
1
Anda tidak perlu membuat variabel t, karena Anda hanya menggunakannya satu kali. Anda bisa melakukannya "TAPETAPETAPETAPETAPETAPET".substring....
RM
Selamat datang di PPCG! Selain apa yang dikatakan @RM , Anda bisa bermain golf beberapa hal lagi: int a=1,l=i.length;a<=l;a++bisa int a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=bisa char u=i[a-1],n;o+=u;if(a<l){n=, (n-u)tidak perlu tanda kurung, dan n-u-1bisa n+~u. Selain itu, jawaban Anda saat ini adalah potongan, bukan fungsi. Untuk membuatnya lambda, Anda harus menambahkan i->{di depan dan }di akhir. Jadi totalnya: Cobalah online. 153 byte
Kevin Cruijssen
140 byte
ceilingcat