ที่นั่นฉันแก้ไขมัน (ด้วยเทป)


41

ท้าทาย:

กำหนดสตริงที่มีตัวอักษรตัวพิมพ์ใหญ่และ / เล็ก (แล้วแต่จำนวนใดก็ได้ที่คุณต้องการ) วางtapeแนวนอนเพื่อแก้ไข เราทำเช่นนี้โดยการตรวจสอบความแตกต่างของทั้งสองตัวอักษรที่อยู่ติดกันในตัวอักษร (ไม่สนใจรอบและมีเพียงก้าวไปข้างหน้า) และกรอกพื้นที่ที่มีมากที่สุดเท่าที่TAPE/ tapeที่เราจะต้อง


ตัวอย่าง:

อินพุต: abcmnnnopstzra
เอาต์พุต:abcTAPETAPETmnnnopTAstTAPETzra

ทำไม?

  • ระหว่างcและmควรเป็นdefghijkl(ความยาว 9) ดังนั้นเราจึงเติมด้วยTAPETAPET;
  • ระหว่างpและsควรเป็นqr(ความยาว 2) ดังนั้นเราจึงเติมด้วยTA;
  • ระหว่างtและzควรจะเป็นuvwxy(ความยาว 5) TAPETเพื่อให้เรากรอกข้อมูลนี้กับ

กฏท้าทาย:

  • zraแตกต่างเพียงใช้ไปข้างหน้าจึงไม่มีเทประหว่าง
  • เป็นไปได้ที่จะมีตัวอักษรติดกันหลายตัวเหมือนnnnกัน
  • คุณได้รับอนุญาตให้ป้อนข้อมูลในรูปแบบที่เหมาะสม สามารถเป็นสตริงเดี่ยวสตริงอาร์เรย์ / รายการอักขระอาร์เรย์ / รายการ ฯลฯ เอาท์พุทมีความยืดหยุ่นเหมือนกัน
  • คุณได้รับอนุญาตให้ใช้ตัวพิมพ์เล็กและ / หรือพิมพ์ใหญ่ในแบบที่คุณต้องการ TAPEนี้ใช้ได้ทั้งการป้อนข้อมูลส่งออกและ
  • เป็นไปได้ที่ไม่TAPEจำเป็นในกรณีนี้อินพุตยังคงไม่เปลี่ยนแปลง

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์ไปยังการทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

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
ไม่แน่ใจว่าทำไมเราถึงทิ้งบางอย่างระหว่างการแก้ไข (เช่นเราละทิ้ง APE หลังจากแก้ไขด้วย TAPETAPET และก่อนที่จะแก้ไขด้วย TA) ดูเหมือนว่าฉันจะใช้เทป TAPE ที่ดี แต่อาจเป็นเพราะฉันม้วน (ขอโทษ)
Jonathan Allan

@JanathanAllan Hehe คุณพูดถูกจริงๆว่ามันช่างเป็น 'เทป' เสียเปล่า อืมอาจจะเป็นสิ่งที่ผมอาจจะใช้ใน2 ส่วนหนึ่งของความท้าทาย ;)
Kevin Cruijssen

จะเกิดอะไรขึ้นถ้าสตริงมาด้วยเทป - เช่น abTAPEgh
manassehkatz

@manassehkatz มันจะตีความว่าเป็นตัวละครอื่น ๆ ทุกคนดังนั้นab[TAPETAPETAPETAPET]TA[TAPETAPETAPETA]PE[T]gh(เพิ่ม[]เพื่อให้สามารถอ่านได้มากขึ้น)
Kevin Cruijssen

1
@KevinCruijssen ซึ่งสอดคล้องกัน แต่ (เช่นเดียวกับคำถาม "wasting tape") ไม่ใช่ตรรกะ 100% ดังนั้นอาจเป็นอีกกรณีทดสอบ: อินพุต TAPE, TATAPETAPETAPETAPE เอาท์พุท (ฉันคิดว่าฉันมีสิทธิ์ ... )
manassehkatz

คำตอบ:


8

05AB1E , 14 12 ไบต์

'¡ÉIÇ¥<∍‚ζJJ

ลองออนไลน์!

คำอธิบาย

'¡É            # 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
คุณจะช่วยเพิ่มคำอธิบายได้ไหม? ฉันคิดว่ามันค่อนข้างคล้ายกับคำตอบของ Jelly แต่ฉันอยากรู้ว่าตัวละครตัวไหนที่ใช้ในการดำเนินการเพื่อให้ได้ผลลัพธ์ กฎทั่วไปข้อหนึ่งในความท้าทายของฉัน: " นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น " ด้วยภาษาเช่น Jelly, 05AB1E, Charcoal, APL และอื่น ๆ มันเป็นการประหยัดที่จะสมมติว่าคนส่วนใหญ่ไม่สามารถอ่านได้ . :)
Kevin Cruijssen

@KevinCruijssen: แน่นอน ฉันมักจะเพิ่มคำอธิบายลงในคำตอบ 05AB1E ของฉัน แต่ฉันไม่ได้มีเวลาเสมอเมื่อฉันโพสต์
Emigna

1
@KevinCruijssen ในข้อโต้แย้งของลิงค์ 05AB1E TIO ใด ๆ ที่คุณสามารถเพิ่ม-dเพื่อรับการดัมพ์แบบ raw-operation โดยการปฏิบัติการของสิ่งที่เกิดขึ้นแทนคำอธิบาย แต่ฉันพยายามโพสต์มันตรงไปตรงมาโดยเฉพาะ ของฉัน LOL
Magic Octopus Urn

10

เยลลี่ขนาด 13 ไบต์

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

ลองออนไลน์!

คำอธิบาย

OI '“ ¡ʂƁ»ṁ $ €ż @ - โปรแกรมเต็ม ใช้สตริงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
O - ลำดับ รับค่า ASCII ของตัวละครแต่ละตัว
 I '- รับส่วนเพิ่ม (เดลตา) และลบ 1 จากแต่ละอัน
          € - สำหรับความแตกต่างฉัน ...
   “ ¡ʂƁ»ṁ $ - ปั้นสตริง "เทป" ที่บีบอัดตามค่าเหล่านี้
                โดยทั่วไปจะขยาย / ย่น "เทป" ให้ยาวเท่าที่จำเป็น
           ż @ - แทรกสอดด้วยอินพุต


@JanathanAllan ฉันคิดว่าไม่ถูกต้อง มันออกแทนabctapetapetmnnnopapstetapezra abctapetapetmnnnoptasttapetzra
Mr. Xcoder

7
โอ้ใช่มันไม่ถูกต้อง - ฉันไม่ได้ตระหนักว่าเราต้องเสียเทปม้วน!
Jonathan Allan

7

Haskell , 58 ไบต์

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

ลองออนไลน์! ฟังก์ชั่นfrecurses มากกว่าสตริงและรูปลักษณ์ที่ตัวละครต่อเนื่องและx อัตราผลตอบแทนสตริงไม่มีที่สิ้นสุด รับช่วงของอักขระจากถึงรวมดังนั้นเราต้องลบสองตัวจากความยาว ในกรณีที่เกิดขึ้นในภายหลังในตัวอักษรแล้วหรือทั้งสองเป็นตัวละครเดียวกันเราได้รับจำนวนลบหลังจากการลบ แต่โชคดีที่ยอมรับเหล่านั้นเช่นกันและไม่ต้องทำอะไรเลยycycle"TAPE""TAPETAPETAPE..."[x..y]xyxytake


6

Perl 5 , -F46 ไบต์

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

ลองออนไลน์!


2
กำลังจะถามว่าทำไมP,E,T,Aแทนที่จะเป็นT,A,P,Eแต่ตอนนี้ฉันสังเกตเห็นว่าคุณใช้((P,E,T,A)x7)[2..-$^H+($^H=ord)แทน((T,A,P,E)x7)[0..-$^H+($^H=ord)-2การบันทึกสองไบต์ คำตอบที่ดี!
Kevin Cruijssen

ดีมากจริง ๆ ! ดีกว่าของฉันวิธี naiive! คุณสามารถบันทึก 2 ไบต์โดยใช้ตัวอักษร^H( \x08) แม้ว่า!
Dom Hastings

@DomHastings ตัวแปรอักขระการควบคุมตัวอักษรถูกปิดการใช้งานสำหรับ Perl หลายรุ่นแล้ว ฉันสามารถรับคะแนนในรุ่น Perl ที่เก่ากว่า (เหมือนที่ฉันทำเมื่อเร็ว ๆ นี้do$0) แต่มีเพียง 2 ไบต์ที่นี่ดังนั้นฉันจึงไม่ต้องกังวล
Ton Hospel

แน่นอน! เป็นเพราะ macOS มีค่าเริ่มต้น 5.18.2 ดังนั้นจึงเป็นรุ่นที่ฉันคุ้นเคยมากที่สุด!
Dom Hastings



4

C, 84 ไบต์

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

ลองออนไลน์!

C (ทำงานบนพรอมต์คำสั่งของ Windows), 81 ไบต์

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

เอาท์พุท:


4

Python 3 , 98 ไบต์

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]

ลองออนไลน์!

-1 ไบต์ขอบคุณ Asone Tuhid


@AsoneTuhid ขอบคุณ ฉันขอแนะนำให้โพสต์คำตอบของคุณเองเพราะคุณเล่นกอล์ฟได้ไม่นานและคุณยังตอบคำถามของ TFeld เช่นเดียวกันดังนั้นการแก้ไขอาจทำให้เกิดเสียงเรียกเข้า (ซึ่งไม่ได้รับอนุญาต)
HyperNeutrino

เอาล่ะมี-1 ไบต์
Asone Tuhid

@AsoneTuhid โอเคขอบคุณ
HyperNeutrino

4

สกาลา 66 ไบต์

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

ลองออนไลน์!

คำอธิบาย

/: 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 และคำตอบแรกที่ดี! +1 จากฉัน
Kevin Cruijssen

4

PHP , 85 ไบต์

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

ลองออนไลน์!

คำอธิบาย

$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
ยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem

3

Javascript, 131 127 Bytes

4 ไบต์บันทึกไว้ขอบคุณ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))

คลี่

Z = a => [ ... เป็น] .reduce (
  (x, y) =>
    x + [... อาร์เรย์ (
      (f = y.charCodeAt () - (x.slice (-1) .charCodeAt ()))> 1? (f-1): 0
    )].ลด(
      (E, R, t) => 
        e + "TAPE" [t% 4], "") + y
);

ปัญหาของฉันที่นี่คือ Javascript ไม่มีวิธีที่สะอาดเพื่อให้ได้ระยะห่างระหว่างอักขระ a และ 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
ดี คุณสามารถบันทึกไบต์โดยลบเซมิโคลอนต่อท้ายและบันทึกอีกสองสามไบต์โดยการกำหนดcharCodeAtตัวแปร: 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

ขอบคุณ! ฉันรู้สึกเบื่อหน่ายอย่างแน่นอนกับวิธีการทำงาน แต่ก็เป็นเรื่องดีที่ได้รู้ว่ามันใช้ได้สำหรับอนาคต
Jhal


2

ถ่าน 20 ไบต์

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

ลองออนไลน์! คำอธิบาย:

 θ              θ       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 ไบต์

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (ต่ำกว่าหรือตัวพิมพ์ใหญ่ไม่สำคัญ) ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ระยะห่างระหว่างตัวละครทั้งสองสามารถถูกกำหนดโดยการแปลงการต่อกันเป็นฐาน 36 ลบ 370, โมดูลัส 37

ตัวอย่างเช่น, (parseInt('cy',36)-370)%37 == 22 .

จากนั้นเราสามารถใช้padEndเติมช่องว่างและเรียกซ้ำเพื่อจัดการลูป

กรณีทดสอบ:


2

K4 , 48 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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"

คำอธิบาย:

วิธีการแก้ปัญหาที่ค่อนข้างง่าย แต่มีจำนวนไบต์สูง ... ค้นหา deltas นำมาจากสตริง"TAPE"เข้าร่วมกับการตัดสตริงต้นฉบับโดยที่ delta เป็น> 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

Excel VBA, 106 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อแบบทันทีที่รับอินพุตเป็นสตริงตัวพิมพ์ใหญ่ผ่านเซลล์A1และส่งออกไปยังหน้าต่าง 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 ไบต์

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

ลองออนไลน์!

นี่เป็นเรื่องที่ค่อนข้างตรงไปตรงมา - เรารับข้อมูลโดยแบ่งสตริงของเราออก เป็นอาร์เรย์ของตัวอักษร (ขอบคุณ Asone Tuhid สำหรับการชี้ให้เห็น) และใช้การดำเนินการลดลง


คำถามบอกว่าคุณสามารถป้อนข้อมูลเป็นชุดอักขระได้ ( 53 bytes )
Asone Tuhid

2

K (oK) , 33 ไบต์

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

ลองออนไลน์!

{ } ฟังก์ชั่นไม่ระบุชื่อกับการโต้แย้ง x

-':x ลบแต่ละอันก่อน (ใช้จินตภาพ 0 ก่อนไอเท็มแรก)

1_ วางรายการแรก

0, เติม 0

-1+ เพิ่ม -1

0| สูงสุด (0, ... )

(... )#\:"TAPE"ปรับแต่งสตริง"TAPE"เป็นแต่ละรายการจากรายการทางด้านซ้าย

(... ),'xผนวกอักขระที่เกี่ยวข้องจากxไปยังแต่ละสตริงที่มีการเปลี่ยนรูป

,/ เชื่อมต่อทั้งหมด



2

Java (JDK) , 91 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

เครดิต

  • -2 ไบต์ต้องขอบคุณRM
  • -4 ไบต์ขอบคุณที่ปรับระดับเป็นcatcatโดยอัพเกรดเป็น Java 10+ และเปลี่ยนเป็นvar
  • -3 ไบต์ขอบคุณKevin Cruijssenด้วยการพิมพ์ผลลัพธ์ของรุ่นอื่น (ก่อนหน้านี้) แทนที่จะส่งคืน

int p=123จะบันทึกอักขระหนึ่งตัว มันไม่สำคัญว่าจะเกิดอะไรขึ้นpในการทำซ้ำครั้งแรกตราบใดที่มันมีขนาดใหญ่กว่าหรือเท่ากับตัวละครแรก ค่ามากที่สุดที่อักขระตัวแรกสามารถมีได้คือ'z'== ASCII 122ดังนั้น 123 จึงดีพอ นอกจากนี้หากคุณใช้ตัวพิมพ์ใหญ่คุณสามารถใช้ 91 แทน 123 เพื่อบันทึกอักขระอื่น
RM

@RM ขอบคุณที่ใช้งานได้จริง ๆ !
Olivier Grégoire

1
-3 ไบต์โดยการพิมพ์โดยตรงในวิธีการอื่นของคุณ
Kevin Cruijssen

1

C # (.NET Core) , 122 111 ไบต์

บันทึกแล้ว 11 ไบต์ขอบคุณ@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;}

ลองออนไลน์!

คำอธิบาย:

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
คำตอบที่ดี +1 จากฉัน คุณสามารถบันทึก 4 ไบต์โดยการเปลี่ยนwhileไปและลบวงเล็บ:for 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, และเนื่องจากคุณกำลังใช้t="ETAP"เพียงครั้งเดียวคุณสามารถใช้โดยตรงและการเปลี่ยนแปลงstringเพื่อvarที่จะบันทึก 7 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: ขอบคุณฉันจะไม่คิดเกี่ยวกับการกำจัดวงเล็บโดยการย้ายสิ่งต่าง ๆ เพื่อห่วง นอกจากนี้ถ้ารู้สึกงี่เง่าที่หายไปนั้นฉันสามารถใช้ "ETAP" ได้โดยตรง
raznagul

คำตอบของคุณยังดีมากดังนั้นอย่ากังวลไปเลย :) ฉันได้เคล็ดลับกอล์ฟเกือบทุกครั้งที่ฉันโพสต์คำตอบตัวเอง .. และมันก็ง่ายกว่าที่จะเล่นกอล์ฟคำตอบที่มีอยู่ไกลกว่าการตีกอล์ฟให้ถูกต้องตั้งแต่เริ่มต้น PS: คุณอาจเคยเห็นพวกเขามาแล้ว แต่เคล็ดลับในการเล่นโค้ดใน C #และเคล็ดลับสำหรับการเล่นกอล์ฟใน <ภาษาทั้งหมด>อาจน่าสนใจที่จะอ่านหากคุณยังไม่ได้อ่าน
Kevin Cruijssen

1

Yabasic , 119 ไบต์

ฟังก์ชันที่ไม่ระบุชื่อที่รับอินพุตเป็นสตริงตัวพิมพ์ใหญ่และเอาต์พุตไปยัง 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

ลองออนไลน์!



1

Clojure, 139 119 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้สตริงและส่งกลับเทป เช่นเคย Clojure ดูเหมือนจะไม่ได้ทำดีเกินไป สิ่งที่ฉันไม่สามารถทำได้คือดึงถ่านตัวต่อไปในเวลาอันสั้น เมื่อถ่านตัวสุดท้ายฉันจะได้รับOutOfBoundsExceptionเหตุผลที่ชัดเจน ดังนั้นฉันจึงใส่cycleมันเข้าไป อาจจะมีทางออกที่หรูหรากว่านี้

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

ปรับปรุง

มีการจัดการเพื่อความปลอดภัยไม่กี่ไบต์ กำจัดifคำสั่งที่น่ารำคาญโดยการลดความแตกต่าง takeสร้างรายการที่ว่างเปล่าถ้าจำนวนเป็น 0 หรือน้อยกว่าซึ่งจะส่งผลในสตริงที่ว่างเปล่า

#(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 Classic)ขนาด 30 ไบต์

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

ลองออนไลน์!

{ } ฟังก์ชั่นไม่ระบุชื่อกับการโต้แย้ง

⎕a⍳⍵ หาดัชนีของตัวอักษรในตัวอักษร

2-/ ความแตกต่างแบบคู่ (ก่อนหน้าลบถัดไป)

1+ เพิ่ม 1

- ลบล้าง

0⌈ สูงสุด (0, ... )

0, เติม 0

⍴∘'TAPE'¨ก่อร่างใหม่สตริง'TAPE'ให้แต่ละคน

⍵,¨⍨ ผนวกอักขระแต่ละตัวจากอาร์กิวเมนต์ไปยังสตริงที่ปรับรูปร่างแล้วที่เกี่ยวข้อง

เรียบ


1

CJam , 27 25 ไบต์

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

ลองออนไลน์!

ห่างไกลจากภาษากอล์ฟอื่น ๆ แต่ฉันก็ภูมิใจในกีฬากอล์ฟนี้อยู่ดี

คำอธิบาย

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 bytes

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

ลองออนไลน์

    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;

โปรดช่วยฉันทำให้ดีขึ้น

ขอบคุณ @cairdcoinheringaahing สำหรับเคล็ดลับในพื้นที่ว่าง ขอบคุณ @RM สำหรับคำแนะนำบนสตริงเทป ขอบคุณ @KevinCruijssen สำหรับคำแนะนำแลมบ์ดาและการแสดงออก


1
ยินดีต้อนรับสู่เว็บไซต์! คุณสามารถลบคำตอบนี้ออกไปได้และให้แน่ใจว่าได้ตรวจสอบเคล็ดลับเหล่านี้สำหรับการเล่นกอล์ฟใน Java !
caird coinheringaahing

1
คุณไม่จำเป็นต้องสร้างตัวแปร t เพราะคุณจะใช้เพียงครั้งเดียว "TAPETAPETAPETAPETAPETAPET".substring...คุณก็สามารถทำ
RM

ยินดีต้อนรับสู่ PPCG! นอกจากสิ่งที่@RMพูดแล้วคุณสามารถตีกอล์ฟอีกสองสามอย่าง: int a=1,l=i.length;a<=l;a++สามารถint a=0,l=i.length;++a<=l;, char u=i[a-1];o+=u;if(a<l){char n=สามารถchar u=i[a-1],n;o+=u;if(a<l){n=, เป็นได้, (n-u)ไม่จำเป็นต้องใช้วงเล็บและn-u-1สามารถเป็นn+~uได้ นอกจากนี้คำตอบของคุณยังเป็นข้อมูลโค้ดแทนที่จะเป็นฟังก์ชัน เพื่อให้เป็นแลมบ์ดาคุณจะต้องเพิ่มi->{ด้านหน้าและ}ท้าย ดังนั้นทั้งหมด: ลองออนไลน์ 153 bytes
Kevin Cruijssen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.