Orada (bantla) düzelttim


41

Meydan okuma:

Yalnızca büyük ve küçük harf içeren bir dize verildiğinde (hangisini tercih ederseniz), tapedüzeltmek için yatay olarak yerleştirin. Bunu, alfabedeki iki bitişik harf arasındaki farkı kontrol ederek (etrafa sarılarak ve sadece ileriye bakacak şekilde) kontrol ederek ve boşluğu istediğimiz kadar TAPE/ ile doldurarak tapeyapıyoruz.


Örnek:

Giriş: abcmnnnopstzra
Çıkış:abcTAPETAPETmnnnopTAstTAPETzra

Neden?

  • Arasında cve molması gerekir defghijkl(uzunluk 9), bu yüzden şunu doldururuz TAPETAPET;
  • Arasında pve solmalıdır qr(uzunluk 2), bu yüzden bunu doldurun TA;
  • Arasında tve zolmalıdır uvwxy(uzunluğu 5), bu yüzden bunu doldurun TAPET.

Meydan okuma kuralları:

  • Bu fark sadece ileriye doğru uygulanır, yani aralarında bant yoktur zra.
  • Gibi aynı bitişik harflerin birden fazla olması mümkündür nnn.
  • Girdiyi herhangi bir makul formatta almanıza izin verilir. Tek bir dize, string-array / list, character-array / list, vb. Olabilir. Çıktı aynı esnekliğe sahiptir.
  • İstediğiniz gibi küçük harf ve / veya büyük harf kullanmanıza izin verilir. Bu hem giriş, hem de çıkış için geçerlidir TAPE.
  • Bu TAPEgerekli değildir, bu durumda giriş değişmeden kalır.

Genel kurallar:

  • Bu , yani bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir teste bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

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"

10
Neden bazı düzeltmeler arasında attığımızdan emin değiliz (örneğin, TAPETAPET ile sabitledikten sonra ve TA ile sabitlemeden önce APE'yi atıyoruz) bana iyi bir TAPE israfı gibi görünüyor, ama belki de tam bu şekilde yuvarlanıyorum (üzgünüm).
Jonathan Allan,

@ JonathanAllan Hehe, gerçekten de 'bant' israfı olduğu konusunda haklısın. Hmm, mücadelenin ikinci bölümünde kullanabileceğim bir şey olabilir . ;)
Kevin Cruijssen

Peki ya string bantla gelirse - örneğin, abTAPEgh?
manassehkatz

@ manassehkatz Her diğer karakter olarak yorumlanır, bu yüzden ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh( []onu daha okunaklı hale getirmek için eklenir ).
Kevin Cruijssen

1
@KevinCruijssen Olan tutarlı, ("atık bant" sorusu ile olduğu gibi)% 100 mantıklı değil. Yani belki bir test daha: Girdi TAPE, çıktı TATAPETAPETAPETAPE (Sanırım doğru olanı ...)
manassehkatz

Yanıtlar:


8

05AB1E , 14 12 bayt

'¡ÉIÇ¥<∍‚ζJJ

Çevrimiçi deneyin!

açıklama

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

4
Bir açıklama ekler misiniz? Jelly cevabına oldukça benzer olduğunu düşünüyorum, ancak sonucu almak için hangi işlemlerin hangi karakterlerin kullanıldığını merak ediyorum. Mücadelelerimdeki genel kurallardan biri: " Ayrıca lütfen gerekirse bir açıklama da ekleyin. ", Jelly, 05AB1E, Charcoal, APL, vb. . :)
Kevin Cruijssen

@KevinCruijssen: Kesinlikle. Genellikle 05AB1E cevaplarıma bir açıklama eklerim, ancak gönderdiğimde her zaman doğru zamanım olmaz.
Emigna

1
@KevinCruijssen herhangi bir 05AB1E TIO bağlantısının argümanlarında, -dbir açıklama yerine neler olup bittiğini işlemden geçirme işlemiyle ilgili ham yığına almak için ekleyebileceğiniz herhangi bir açıklama yapmıyor. benim
Magic Octopus Urn

10

Jöle , 13 bayt

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

Çevrimiçi deneyin!

açıklama

OI '“¡ʂƁ» ṁ $ € ż @ - Tam program. Komut satırı argümanı olarak bir dize alın.
O - Sıra. Her karakterin ASCII değerlerini alın.
 I '- Artımları (deltaları) alın ve her birinden 1 çıkarın.
          € - Her fark için ben ...
   “¡ꟅƁ» ṁ $ - Bu değerlere göre "teyp" sıkıştırılmış dizgisini kalıplayın.
                Temel olarak "bandı" gerekli uzunlukta uzatır / kısaltır.
           ż @ - Giriş ile serpiştirin.


@ JonathanAllan Bu bana geçersiz görünüyor. Bunun abctapetapetmnnnopapstetapezrayerine çıktılar abctapetapetmnnnoptasttapetzra.
Bay Xcoder

7
Oh, evet geçersiz - Rulodan kaseti boşa harcayacağımızın farkında değildim!
Jonathan Allan

7

Haskell , 58 bayt

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

Çevrimiçi deneyin! İşlev, fdizginin üzerine geri döner ve ardışık karakterlere bakar xve y. cycle"TAPE"sonsuz dize verir "TAPETAPETAPE...". [x..y]karakterlerin aralığını alır xiçin yuzunluk tan iki çıkarmak gerekir, böylece kapsayıcı. xAlfabede daha sonra meydana gelmesi durumunda , o zaman yveya her ikisi de aynı karakterde olduğunda, çıkardıktan sonra negatif bir sayı alırız, ancak neyse ki takebunları da kabul eder ve hiçbir şey almaz.


6

Perl 5 , -F46 bayt

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

Çevrimiçi deneyin!


2
Was hakkında sormak neden P,E,T,Ayerine T,A,P,E, ama şimdi kullandım fark ((P,E,T,A)x7)[2..-$^H+($^H=ord)yerine ((T,A,P,E)x7)[0..-$^H+($^H=ord)-2iki bayt kaydedin. Güzel cevap!
Kevin Cruijssen

Gerçekten çok iyi! Saf yaklaşımımdan çok daha iyi! Olsa değişmez ^H( \x08) kullanarak 2 bayt kaydedebilirsiniz !
Dom Hastings

@DomHastings Değişmez kontrol karakter değişkenleri, zaten birçok perl sürümü için devre dışı bırakıldı. Eski bir perl sürümünde bir puan alabiliyordum (Son zamanlarda yaptığım gibi do$0) ancak burada sadece 2 bayt, bu yüzden rahatsız etmedim
Ton Hospel

Ah, elbette! MacOS varsayılan olarak 5.18.2 olduğundan, bu yüzden en aşina olduğum sürüm!
Dom Hastings



4

C, 84 bayt

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

Çevrimiçi deneyin!

C (Windows Komut İsteminde Çalıştır), 81 bayt

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

Çıktı:


4

Python 3 , 98 bayt

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]

Çevrimiçi deneyin!

Asone Tuhid sayesinde -1 bayt


@AsoneTuhid Teşekkürler. Kendi cevabınızı göndermenizi öneririm, çünkü biraz kapalı golf oynuyorsunuz ve aynı zamanda TFeld'in cevabını golf yaptınız, böylece düzenleme dupeslere neden olacak (bu izin verilmeyen)
HyperNeutrino


@AsoneTuhid oh tamam, teşekkürler
HyperNeutrino

4

Scala , 66 bayt

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

Çevrimiçi deneyin!

açıklama

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

PPCG'ye hoş geldiniz ve güzel bir cevap! Benden +1.
Kevin Cruijssen

4

PHP , 85 bayt

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

Çevrimiçi deneyin!

açıklama

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

2
Siteye Hoşgeldiniz! :)
DJMcMayhem

3

Javascript, 131 127 Bayt

Rick Hitchcock sayesinde 4 bayt kaydedildi .

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

unrolled

Z = a => [... a] .reduce (
  (X, y) =>
    x + [... Dizi (
      (f = y.charCodeAt () - (x.slice (-1) .charCodeAt ()))> 1? (f-1): 0
    )]. (Azaltmak
      (E, r, t) => 
        e + "TAPE" [t% 4], "") + y
);

Buradaki sorunum Javascript'in a ve b karakterleri arasındaki mesafeyi almak için temiz bir yolu olmadığı yönünde.

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


1
Güzel. İzleyen yarı sütunu kaldırarak bir bayt kaydedebilir charCodeAtve bir değişkeni atayarak birkaç bayttan tasarruf edebilirsiniz : 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

Teşekkürler! Bunun nasıl yürüdüğünden kesinlikle bıktım, ama bunun gelecek için olduğunu bilmek güzel.
Jhal


2

Kömür , 20 bayt

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

Çevrimiçi deneyin! Açıklama:

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

2

Pip , 29 bayt

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

Bir komut satırı argümanı olarak girdi alır (küçük veya büyük harf, farketmez). Çevrimiçi deneyin!

açıklama

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

2

JavaScript (ES6), 80 78 bayt

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

İki karakter arasındaki mesafe, birleştirmelerini 37 tabanına (370, 37 modül) çıkartarak, baz 36'ya dönüştürerek belirlenebilir.

Örneğin (parseInt('cy',36)-370)%37 == 22,.

Daha sonra padEndboşlukları doldurmak için kullanabiliriz ve döngüyü ele almak için özyineleme yapabiliriz.

Test Durumları:


2

K4 , 48 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

Oldukça basit bir çözüm, ancak yüksek bayt sayısı ... Deltaları bulun, dizeden alın "TAPE", deltaların> 1 olduğu orijinal dize kesimine katılın.

{,/_[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

2

Excel VBA, 106 bayt

Hücre üzerinden büyük harfli bir dize olarak giriş yapan A1ve VBE anlık penceresine çıkış yapan anonim bir VBE anlık pencere işlevi .

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

2

Ruby , 59 53 bayt

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

Çevrimiçi deneyin!

Bu aslında oldukça basittir - biz girdi almak içine bölünmüş bizim dize karakter (bu işaret için Asone TÜHİD sayesinde) bir dizi ve dolgu dizesi olarak "BANT" kullanarak gerekli uzunluğa her kömürü haklı nerede, operasyon azaltmak geçerlidir.


Soru, girdiyi bir karakter dizisi olarak alabileceğinizi söylüyor. ( 53 bayt )
Asone Tuhid

2

K (oK) , 33 bayt

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

Çevrimiçi deneyin!

{ } bağımsız değişkenli adsız işlev x

-':x her birini önce çıkar (ilk öğeden önce hayali 0 kullanın)

1_ ilk öğeyi bırak

0, 0 hazırlamak

-1+ -1 ekle

0| maksimum (0, ...)

(... )#\:"TAPE"dizeyi yeniden şekillendirmek"TAPE" soldaki listeden her bir maddeye ait

(... ),'xkarşılık gelen karakteri ekleyinx her yeniden şekillendirilen dizgiden

,/ hepsini birleştirmek



2

Java (JDK) , 91 bayt

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

Çevrimiçi deneyin!

açıklama

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

Kredi

  • RM sayesinde -2 bayt
  • Ceilingcat sayesinde -4 byte , Java 10+ sürümüne yükseltme ve değiştirmevar
  • Kevin Cruijssen sayesinde -3 bayt , (daha önce) alternatif sürümün sonucunu döndürmek yerine basarak

int p=123bir karakter kaydederdi. pİlk karakterde, ilk karakterden daha büyük veya ona eşit olduğu sürece, ne olduğu önemli değildir . İlk karakterin sahip olabileceği en büyük değer 'z'== ASCII 122, yani 123 yeterince iyi. Ayrıca, büyük harfler kullanıyorsanız, 123 yerine 91 kullanarak başka bir karakter kaydedebilirsiniz.
RM

@RM Teşekkürler, gerçekten işe yarıyor!
Olivier Grégoire


1

C # (.NET Core) , 122 111 bayt

@KevinCruijssen sayesinde 11 bayt kaydedildi

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

Çevrimiçi deneyin!

Açıklama:

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

1
Güzel cevap, benden +1. Sen değiştirerek 4 bayt kaydedebilirsiniz whilea forve parantezleri kaldırıldıktan: 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 ve kullandığınız beri t="ETAP"sadece bir kez, doğrudan kullanabilirsiniz ve değişiklik stringiçin var7 daha bayt kaydetmek için: 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: Teşekkürler, malzemeleri for loop'a taşıyarak parantezlerden kurtulmayı düşünmezdim. Ayrıca eksik olduğum için kendimi aptal hissediyorsam doğrudan "ETAP" kullanabilirim.
raznagul

Cevabın hala harika, bu yüzden endişelenme. :) Hemen hemen her seferinde kendime bir cevap gönderdiğimde golf ipuçlarını alıyorum .. Ayrıca mevcut bir cevabı baştan itibaren tamamen golf oynamaktan daha fazla golf oynamak daha kolay. Not: Zaten onları görmüş olabilir, ama İpuçları C # kod golf için ve <tüm dillerde> golf için İpuçları henüz yapmadıysanız okumaya ilginç olabilir.
Kevin Cruijssen

1

Yabasic , 119 bayt

Girdiyi büyük harfli bir dizge olarak alan ve STDOUT çıktısını alan anonim bir işlev.

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

Çevrimiçi deneyin!



1

Clojure, 139 119 bayt

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

Dizeyi alan ve bantlananı döndüren adsız işlev. Her zamanki gibi, Clojure her şeyi pek iyi performans göstermiyor gibi görünüyor. Gerçekten çözemediğim şey bir sonraki karakteri kısa sürede almak. Son karakterde alacağım birOutOfBoundsException , açık neden . Ben de cycleetrafına koydum . Belki daha şık bir çözüm var.

Ungolfed

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

Güncelleme

Birkaç byte salınımını başardı. ifFarkı azaltarak sinir bozucu ifadeden kurtuldum . takesayı 0 veya daha küçükse boş bir liste oluşturur; bu da boş bir dizeyle sonuçlanır.

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

Ungolfed

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

1

APL (Dyalog Klasik) , 30 bayt

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

Çevrimiçi deneyin!

{ } bağımsız değişkenli adsız işlev

⎕a⍳⍵ Alfabedeki karakter indekslerini bulmak

2-/ ikili farklar (önceki eksi)

1+ ekle 1

- negate

0⌈ maksimum (0, ...)

0, 0 hazırlamak

⍴∘'TAPE'¨'TAPE'her birine dize periyodik olarak yeniden şekillendirme

⍵,¨⍨ argümanlardan her bir karakteri karşılık gelen yeniden şekillendirilmiş dizeye ekle

düzleştirmek


1

CJam , 27 25 bayt

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

Çevrimiçi deneyin!

Uzak, diğer golf dillerinden uzak, ama yine de bu golfle gurur duyuyorum.

açıklama

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.



0

Java, 213 166 153 bayt

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

çevrimiçi dene

    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;

Lütfen daha iyi yapmama yardım et.

Beyaz boşluklardaki bahşiş için @cairdcoinheringaahing teşekkür ederiz. Teyp ipindeki ipucu için @RM 'e teşekkürler. Lamda ve ifadeler için @KevinCruijssen teşekkürler.


1
Siteye Hoşgeldiniz! Bu cevabı golf oynamak için çok fazla boşluk kaldırabilir ve Java'da golf oynamak için bu ipuçlarını kontrol ettiğinizden emin olun !
caird coinheringaahing 7/18

1
T değişkenini oluşturmanıza gerek yoktur, çünkü yalnızca bir kez kullanıyorsunuzdur. Sadece yapabilirsin "TAPETAPETAPETAPETAPETAPET".substring....
RM

PPCG'ye Hoşgeldiniz! Ne ek olarak @RM dedi golf bir kaç sorum daha edebilirsiniz: int a=1,l=i.length;a<=l;a++olabilir int a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=olabilir char u=i[a-1],n;o+=u;if(a<l){n=, (n-u)parantez ihtiyacı yoktur ve n-u-1olabilir n+~u. Ayrıca, cevabınız şu anda bir işlev yerine bir pasajdır. Bir lambda yapmak için i->{önüne ve }sonuna eklemeniz gerekir . Toplam olarak: Çevrimiçi deneyin. 153 bayt
Kevin Cruijssen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.