Ở đó, tôi đã sửa nó (bằng băng keo)


41

Thử thách:

Đưa ra một chuỗi chỉ chứa các chữ cái viết hoa và / hoặc chữ thường (tùy theo ý thích của bạn), đặt tapetheo chiều ngang để sửa nó. Chúng tôi thực hiện điều này bằng cách kiểm tra sự khác biệt của hai chữ cái liền kề trong bảng chữ cái (bỏ qua việc bao quanh và chỉ đi về phía trước) và lấp đầy khoảng trống với bao nhiêu TAPE/ tapenếu cần.


Thí dụ:

Đầu vào: abcmnnnopstzra
Đầu ra:abcTAPETAPETmnnnopTAstTAPETzra

Tại sao?

  • Giữa cmnên là defghijkl(chiều dài 9), vì vậy chúng tôi điền vào đây TAPETAPET;
  • Giữa psnên là qr(chiều dài 2), vì vậy chúng tôi điền vào đây TA;
  • Giữa tznên uvwxy(chiều dài 5), vì vậy chúng tôi điền vào đây TAPET.

Quy tắc thử thách:

  • Sự khác biệt chỉ áp dụng về phía trước, vì vậy không có băng giữa zra.
  • Có thể có nhiều chữ cái liền kề như thế nnn.
  • Bạn được phép lấy đầu vào ở bất kỳ định dạng hợp lý. Có thể là một chuỗi đơn, chuỗi-mảng / danh sách, mảng ký tự / danh sách, v.v ... Đầu ra có cùng tính linh hoạt.
  • Bạn được phép sử dụng chữ thường và / hoặc chữ hoa theo bất kỳ cách nào bạn muốn. Điều này áp dụng cả cho đầu vào, đầu ra và TAPE.
  • Có thể không TAPEcần thiết, trong trường hợp đầu vào vẫn không thay đổi.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết để kiểm tra mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

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
Không chắc chắn lý do tại sao chúng tôi sẽ loại bỏ một số giữa các bản sửa lỗi (ví dụ: chúng tôi loại bỏ APE sau khi sửa bằng TAPETAPET và trước khi sửa với TA) có vẻ như là một sự lãng phí TAPE tốt đối với tôi, nhưng có lẽ đó chỉ là cách tôi lăn (xin lỗi).
Jonathan Allan

@Jonathan ALLan Hehe, bạn thực sự đúng rằng thật lãng phí 'băng'. Hmm, có thể là thứ tôi có thể sử dụng trong phần 2 của thử thách . ;)
Kevin Cruijssen

Điều gì về nếu chuỗi đi kèm với băng - ví dụ, abTAPEgh?
manassehkatz-Phục hồi Monica

@manassehkatz Nó sẽ được giải thích như mọi nhân vật khác, vì vậy ab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh(thêm vào []để làm cho nó dễ đọc hơn).
Kevin Cruijssen

1
@KevinCruijssen Điều này phù hợp, mặc dù (như với câu hỏi "lãng phí băng") không hợp lý 100%. Vì vậy, có thể thêm một trường hợp thử nghiệm: TAPE đầu vào, đầu ra TATAPETAPETAPETAPE (Tôi nghĩ rằng tôi đã hiểu đúng ...)
manassehkatz-Tái lập Monica

Câu trả lời:


8

05AB1E , 14 12 byte

'¡ÉIÇ¥<∍‚ζJJ

Hãy thử trực tuyến!

Giải trình

'¡É            # 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
Bạn có phiền thêm một lời giải thích? Tôi nghĩ nó khá giống với câu trả lời của Jelly, nhưng tôi tò mò không biết nhân vật nào được sử dụng cho hoạt động nào để có kết quả. Một trong những quy tắc chung trong các thử thách của tôi: " Ngoài ra, vui lòng thêm một lời giải thích nếu cần thiết. ", Với các ngôn ngữ như Jelly, 05AB1E, Char than, APL, v.v ... sẽ tiết kiệm khi cho rằng hầu hết mọi người không thể đọc nó và một lời giải thích là bắt buộc . :)
Kevin Cruijssen

@KevinCruijssen: Chắc chắn. Tôi thường thêm một lời giải thích cho câu trả lời 05AB1E của mình, nhưng tôi không luôn có thời gian đúng khi tôi đăng nó.
Emigna

1
@KevinCruijssen trong các đối số của bất kỳ liên kết TIO 05AB1E nào bạn có thể thêm -dđể có được kết xuất hoạt động ngăn xếp thô của những gì đang diễn ra thay cho lời giải thích, nhưng tôi cố gắng đăng chúng vì nó không đơn giản LOL của tôi.
Bạch tuộc ma thuật Urn

10

Thạch , 13 byte

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

Hãy thử trực tuyến!

Giải trình

OI 'Đổi »$ € ż @ - Chương trình đầy đủ. Lấy một chuỗi làm đối số dòng lệnh.
O - Bình thường. Lấy các giá trị ASCII của từng ký tự.
 I '- Nhận số gia (deltas) và trừ 1 từ mỗi số.
          € - Với mỗi sự khác biệt tôi ...
   Ưng ʂƁ »$ - Tạo khuôn" băng "nén theo các giá trị này.
                Về cơ bản kéo dài / rút ngắn "băng" đến độ dài cần thiết.
           ż @ - Xen kẽ với đầu vào.

Đây là một mẹo để đưa bạn xuống còn 12
Jonathan Allan

@Jonathan ALLan Điều đó dường như không hợp lệ đối với tôi. Nó đầu ra abctapetapetmnnnopapstetapezrathay vì abctapetapetmnnnoptasttapetzra.
Ông Xcoder

7
Ồ, vâng, nó không hợp lệ - Tôi đã không nhận ra rằng chúng ta đã lãng phí băng từ cuộn phim!
Jonathan Allan

7

Haskell , 58 byte

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

Hãy thử trực tuyến! Hàm fđệ quy qua chuỗi và xem xét các ký tự liên tiếp xy. cycle"TAPE"mang lại chuỗi vô hạn "TAPETAPETAPE...". [x..y]nhận được hàng loạt các ký tự từ xđể ybao gồm, vì vậy chúng ta cần phải trừ hai từ chiều dài. Trong trường hợp xxảy ra sau đó trong bảng chữ cái sau đó yhoặc cả hai là cùng một ký tự, chúng ta sẽ nhận được một số âm sau khi trừ, nhưng may mắn takechấp nhận những điều đó là tốt và không mất gì cả.


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

Hãy thử trực tuyến!


2
Đã định hỏi tại sao P,E,T,Athay vì T,A,P,E, nhưng bây giờ tôi nhận thấy bạn đã sử dụng ((P,E,T,A)x7)[2..-$^H+($^H=ord)thay vì ((T,A,P,E)x7)[0..-$^H+($^H=ord)-2để lưu hai byte. Câu trả lời tốt đẹp!
Kevin Cruijssen

Thực sự rất tốt đẹp! Tốt hơn nhiều so với cách tiếp cận ngây thơ của tôi! Bạn có thể lưu 2 byte bằng chữ ^H( \x08)!
Dom Hastings

@DomHastings Các biến ký tự điều khiển bằng chữ đã bị vô hiệu hóa cho khá nhiều phiên bản perl. Tôi có thể yêu cầu một số điểm trên một phiên bản perl cũ hơn (Giống như tôi đã làm gần đây do$0) nhưng nó chỉ có 2 byte ở đây, vì vậy tôi đã không bận tâm
TonMedel

À, tất nhiên rồi! Đó là vì macOS có 5.18.2 theo mặc định, vì vậy đây là phiên bản tôi quen thuộc nhất!
Dom Hastings



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

Hãy thử trực tuyến!

C (chạy trên 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]);}

Đầu ra:


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]

Hãy thử trực tuyến!

-1 byte nhờ Asone Tuhid


@AsoneTuhid Cảm ơn. Tôi khuyên bạn nên đăng câu trả lời của riêng mình vì bạn đã chơi golf khá nhiều và bạn cũng đã trả lời câu trả lời của TFeld cho cùng một điều đó để chỉnh sửa sẽ gây ra các bản sao (không được phép)
HyperNeutrino

Được rồi, có một byte -1
Asone Tuhid

@AsoneTuhid oh được rồi, cảm ơn
HyperNeutrino

4

Scala , 66 byte

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

Hãy thử trực tuyến!

Giải trình

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

Chào mừng bạn đến với PPCG, và câu trả lời đầu tiên tốt đẹp! +1 từ tôi.
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');

Hãy thử trực tuyến!

Giải trình

$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
Chào mừng đến với trang web! :)
DJMcMayhem

3

Javascript, 131 127 byte

4 byte được lưu nhờ 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))

Không được kiểm soát

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

Vấn đề của tôi ở đây là Javascript không có cách nào rõ ràng để có được khoảng cách giữa ký tự a và 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>


1
Tốt đẹp. Bạn có thể lưu một byte bằng cách xóa dấu chấm phẩy và lưu thêm một vài byte bằng cách gán charCodeAtcho một biến: 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

Cảm ơn! Tôi hoàn toàn chán ghét cách nó hoạt động, nhưng thật tốt khi biết rằng nó sẽ làm cho tương lai.
Jhal


2

Than , 20 byte

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

Hãy thử trực tuyến! Giải trình:

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

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

Lấy đầu vào làm đối số dòng lệnh (chữ thường hoặc chữ hoa, không quan trọng). Hãy thử trực tuyến!

Giải trình

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 byte

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

Khoảng cách giữa hai ký tự có thể được xác định bằng cách chuyển đổi phép nối của chúng sang cơ sở 36, trừ đi 370, mô đun 37.

Ví dụ , (parseInt('cy',36)-370)%37 == 22.

Sau đó chúng ta có thể sử dụng padEnd để điền vào các khoảng trống và đệ quy để xử lý vòng lặp.

Các trường hợp thử nghiệm:


2

K4 , 48 byte

Giải pháp:

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

Ví dụ:

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"

Giải trình:

Giải pháp khá đơn giản, nhưng số byte cao ... Tìm deltas, lấy từ chuỗi "TAPE", nối với chuỗi gốc ban đầu trong đó deltas> 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

2

VBA Excel, 106 byte

Một hàm cửa sổ ngay lập tức VBE ẩn danh lấy đầu vào là một chuỗi chữ hoa thông qua ô A1và xuất ra cửa sổ ngay lập tức 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

2

Ruby , 59 53 byte

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

Hãy thử trực tuyến!

Điều này thực sự khá đơn giản - chúng tôi lấy đầu vào là chia chuỗi của chúng tôi thành một mảng ký tự (cảm ơn Asone Tuhid đã chỉ ra điều này) và áp dụng thao tác giảm, trong đó chúng tôi biện minh cho mỗi char với độ dài cần thiết bằng cách sử dụng "TAPE" làm chuỗi phụ.


Câu hỏi cho biết bạn có thể lấy đầu vào là một mảng các ký tự. ( 53 byte )
Asone Tuhid

2

K (oK) , 33 byte

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

Hãy thử trực tuyến!

{ } hàm ẩn danh với đối số x

-':x trừ đi mỗi trước (sử dụng 0 tưởng tượng trước mục đầu tiên)

1_ thả mục đầu tiên

0, trả trước 0

-1+ thêm -1

0| tối đa (0, ...)

(... )#\:"TAPE"định hình lại chuỗi "TAPE"cho từng mục từ danh sách bên trái

(... ),'xNối thêm ký tự tương ứng từ xmỗi chuỗi được định hình lại

,/ nối tất cả



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

Hãy thử trực tuyến!

Giải trình

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

Tín dụng

  • -2 byte nhờ vào RM
  • -4 byte nhờ vào trần nhà , bằng cách nâng cấp lên Java 10+ và chuyển loại sangvar
  • -3 byte nhờ Kevin Cruijssen , bằng cách in kết quả của phiên bản thay thế (trước đây) của tôi thay vì trả lại

int p=123sẽ cứu một nhân vật. Không có vấn đề gì ptrong lần lặp đầu tiên, miễn là nó lớn hơn hoặc bằng ký tự đầu tiên. Giá trị lớn nhất mà ký tự đầu tiên có thể có là 'z'== ASCII 122, vì vậy 123 là đủ tốt. Ngoài ra, nếu bạn đã sử dụng chữ in hoa, bạn có thể sử dụng 91 thay vì 123, lưu một ký tự khác.
RM

@RM Cảm ơn, thực sự là hoạt động!
Olivier Grégoire

1
-3 byte bằng cách in trực tiếp trong phương pháp thay thế của bạn.
Kevin Cruijssen

1

C # (.NET Core) , 122 111 byte

Đã lưu 11 byte nhờ @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;}

Hãy thử trực tuyến!

Giải trình:

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
Câu trả lời hay, +1 từ tôi. Bạn có thể lưu 4 byte bằng cách thay đổi whilethành a forvà xóa dấu ngoặc : 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, và kể từ khi bạn đang sử dụng t="ETAP"một lần duy nhất, bạn có thể sử dụng nó trực tiếp, và thay đổi stringđể vartiết kiệm hơn 7 byte: 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: Cảm ơn, tôi sẽ không nghĩ đến việc thoát khỏi dấu ngoặc bằng cách di chuyển công cụ vào vòng lặp for. Ngoài ra nếu cảm thấy ngu ngốc vì đã bỏ lỡ rằng tôi có thể sử dụng "ETAP" trực tiếp.
raznagul

Câu trả lời của bạn vẫn rất tuyệt, vì vậy đừng lo lắng về nó. :) Tôi nhận được các mẹo chơi golf gần như mỗi lần tôi tự trả lời câu trả lời .. Và cũng dễ dàng hơn để chơi một câu trả lời hiện có hơn là hoàn toàn chơi golf ngay từ đầu. Tái bút: bạn có thể đã nhìn thấy chúng, nhưng Mẹo chơi gôn mã trong C #Mẹo chơi golf bằng <tất cả các ngôn ngữ> có thể rất thú vị để đọc qua nếu bạn chưa đọc.
Kevin Cruijssen

1

Yabasic , 119 byte

Một hàm ẩn danh nhận đầu vào là một chuỗi chữ hoa và xuất ra 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

Hãy thử trực tuyến!



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

Hàm ẩn danh lấy chuỗi và trả về chuỗi được ghi. Như mọi khi, Clojure dường như không thực hiện quá tốt. Những gì tôi không thể thực sự làm việc là tìm nạp char tiếp theo một cách ngắn gọn. Trên char cuối cùng tôi sẽ nhận được một OutOfBoundsExceptionlý do rõ ràng. Vì vậy, tôi đặt một cyclexung quanh nó. Có lẽ có một giải pháp thanh lịch hơn.

Bị đánh cắp

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

Cập nhật

Quản lý để tắt an toàn một vài byte. Loại bỏ các iftuyên bố pesky bằng cách giảm sự khác biệt. taketạo ra một danh sách trống nếu số đó bằng 0 hoặc ít hơn, từ đó dẫn đến một chuỗi trống.

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

Bị đánh cắp

#(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 Classic) , 30 byte

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

Hãy thử trực tuyến!

{ } hàm ẩn danh với đối số

⎕a⍳⍵ tìm chỉ số ký tự của nó trong bảng chữ cái

2-/ sự khác biệt theo cặp (trước trừ đi tiếp theo)

1+ thêm 1

- phủ định

0⌈ tối đa (0, ...)

0, trả trước 0

⍴∘'TAPE'¨định hình lại theo chu kỳ chuỗi 'TAPE'cho mỗi

⍵,¨⍨ nối từng char từ đối số vào chuỗi được định hình lại tương ứng

làm phẳng


1

CJam , 27 25 byte

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

Hãy thử trực tuyến!

Khác xa với các ngôn ngữ chơi gôn khác, nhưng dù sao tôi cũng tự hào về môn golf này.

Giải trình

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

thử trực tuyến

    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;

Xin hãy giúp tôi làm cho nó tốt hơn.

Cảm ơn @cairdcoinheringaahing cho mẹo về khoảng trắng. Cảm ơn @RM về mẹo trên chuỗi băng. Cảm ơn @KevinCruijssen về lambda và các mẹo diễn đạt.


1
Chào mừng đến với trang web! Bạn có thể xóa rất nhiều khoảng trắng để đánh golf câu trả lời này và đảm bảo kiểm tra các mẹo này để chơi gôn trong Java !
caird coinheringaahing

1
Bạn không cần tạo biến t, vì bạn chỉ sử dụng một lần. Bạn chỉ có thể làm "TAPETAPETAPETAPETAPETAPET".substring....
RM

Chào mừng đến với PPCG! Ngoài những gì @RM đã nói, bạn có thể chơi thêm một số điều: int a=1,l=i.length;a<=l;a++có thể int a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=có thể char u=i[a-1],n;o+=u;if(a<l){n=, (n-u)không cần dấu ngoặc đơn và n-u-1có thể n+~u. Ngoài ra, câu trả lời của bạn hiện là một đoạn thay vì một chức năng. Để làm cho nó một lambda, bạn sẽ cần phải thêm i->{ở phía trước và }ở cuối. Vì vậy, trong tổng số: Hãy thử trực tuyến. 153 byte
Kevin Cruijssen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.