ตัวเลขที่เพิ่มขึ้น


19

งานนี้ค่อนข้างง่ายและใช้ประโยชน์จากอักขระ "โอเปอเรเตอร์" สามตัว งานของคุณจะได้รับลำดับที่เรียบง่ายของตัวอักษรดำเนินงานต่อไปนี้การเข้ารหัสโดยใช้<, ,> *คุณอาจเลือกที่จะใช้ตัวอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ได้โดยที่คุณไม่ต้องใช้ทั้งสองตัว


คำอธิบายการเข้ารหัส

รหัสลับนั้นง่ายคุณกำลังใช้การดำเนินการเพิ่มและลดเพื่อสำรวจจากตัวอักษร 1 ถึงตัวอักษรท้ายโดยใช้*ฟังก์ชัน "ส่ง" ของคุณ ผู้ประกอบการสำหรับ "เพิ่มขึ้น" จะเป็น>และ "พร่อง" <จะเป็น

ตัวอย่างการใช้คำว่าadbc:

  • เริ่มด้วยตัวอักษรตัวแรกของคำเอาท์พุทตัวอักษรนั้น a
  • ถัดไปใช้>และ<(เช่น brainfuck) เพื่อ "นำทาง" ตัวอักษรปัจจุบันไปยังตัวถัดไป a>จะส่งผลให้ 'ยก' aโดยที่ 1 bไปยังตัวอักษรa<จะส่งผลให้zเนื่องจากคุณลดจดหมาย (มันตัดคุณจะต้องเลือกทิศทางที่ทำให้เกิดการดำเนินงานจำนวนน้อยที่สุด)
  • หลังจากแสดงชุดค่าผสมที่น้อยที่สุดที่ถูกต้องของ<และ>เอาท์พุท a *เพื่อแสดงว่าเราได้มาถึงตัวอักษรถัดไป

ขั้นตอนในการเข้ารหัสadbcจะเป็น:

a          # a
a>>>*      # ad
a>>>*<<*   # adb
a>>>*<<*>* # adbc

ตัวอย่าง

ขั้นตอนในการเข้ารหัสazaจะเป็น:

a       # a
a<*     # az
a<*>*   # aza

ตัวอย่างเพิ่มเติม:

"abcdef"    =  "a>*>*>*>*>*"
"zyaf"      =  "z<*>>*>>>>>*"
"zzzzzz"    =  "z*****"
"z"         =  "z"
"zm"        =  "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl"        =  "z>>>>>>>>>>>>*"
"alphabet"  =  "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana"    =  "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz"   =  "a>*>*>*>*>*<<<<<<*"

กฎระเบียบ

  • เรากำลังเข้ารหัสไม่ถอดรหัสดังนั้นอย่าสับสน
  • คุณอาจถือว่าข้อความจะมีตัวอักษร[A-Z]หรือ[a-z]ตัวเลือกของคุณ
  • คุณสามารถใช้อักขระที่ไม่ใช่ตัวอักษร / ตัวเลข / สงวนเพื่อแสดง*(EG $)
  • คุณต้องมีจุดจบ*มันไม่ได้บอกเป็นนัยซ้ำ
  • คุณอาจสมมติว่าไม่มีสตริงว่าง แต่สามารถใช้อักขระเดี่ยวได้
  • หากมีความยาวเท่ากันทั้งสองทางไปยังตัวอักษรถัดไปคุณอาจเลือกทิศทาง
  • นี่คือชนะน้อยที่สุดนับไบต์

โปรดอธิบายคำตอบของคุณมันช่วยให้ผู้อื่นเรียนรู้วิธีนี้


เพื่อให้ชัดเจนกรณีทดสอบครั้งสุดท้ายแสดงให้เห็นถึงabcdefghijklmnopqrstuvwxyzและไม่ใช่อินพุตของมันเอง?
Nick Clifford

1
@NickClifford ใช่
Magic Octopus Urn

ผมคิดว่าควรจะใช้zl >
xnor

4
คุณกรุณาตรวจสอบตัวอย่างได้ไหม alphabetอยู่ในความคิดของฉันa>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*และzlควรz>>>>>>>>>>>>*และbananaควรมีวิธีแก้ปัญหาที่สองอยู่แล้วb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
JörgHülsermann

@xnor ถูกต้องเป็นคำที่พิมพ์ผิดzmด้วยตนเอง @ jorg จับที่ดีแก้ไขพวกเขาทั้งหมดเป็นความพยายามด้วยตนเอง
Magic Octopus Urn

คำตอบ:


2

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

OIżN$ẋ"@€⁾><;€⁶ṭḢ

ใช้อักขระเว้นวรรคแทนที่*(เว้นวรรคหรือขึ้นบรรทัดใหม่บันทึกหนึ่งไบต์บน”*)

ทำงานร่วมกับทั้งตัวพิมพ์ใหญ่เท่านั้นหรือการป้อนตัวพิมพ์เล็กเท่านั้น

ลองออนไลน์! หรือดูชุดทดสอบ (ซึ่งช่องว่างเหล่านั้นถูกแทนที่ด้วยโพสต์*เพื่อความสะดวกในการอ่าน)

อย่างไร?

OIżN$ẋ"@€⁾><;€⁶ṭḢ - Main link: string s          e.g. "adbc"
O                 - cast s to ordinals                [97,100,98,99]
 I                - incremental differences           [3,-2,1]
    $             - last two links as a monad:
   N              -     negate                        [-3,2,-1]
  ż               -     zip together                  [[3,-3],[-2,2],[1,-1]]
         ⁾><      - literal ['>','<']                 "><"
      "@€         - using reversed @arguments for €ach zip with("):
     ẋ            -     repeat (-n are like zeros)    [[">>>",""],["","<<"],[">",""]]
            ;€    - concatenate €ach with:
              ⁶   -     literal ' '                   [[">>>","",' '],["","<<",' '],[">","",' ']]
               ṭ  - tack to:
                Ḣ -     head of s (1st char)          [['a'],[">>>","",' '],["","<<",' '],[">","",' ']]
                  - implicit print   (" not printed:) "a>>> << > "

11

รหัสเครื่อง 8086, 70 68 67 ไบต์

00000000  be 82 00 bf 43 01 57 31  d2 ac 3c 0d 74 2c 89 d1  |....C.W1..<.t,..|
00000010  88 c2 aa e3 f4 4f 28 c1  9f 88 e7 79 02 f6 d9 83  |.....O(....y....|
00000020  f9 0d 9f 76 05 83 e9 1a  f6 d9 30 fc 9e b0 3c 78  |...v......0...<x|
00000030  02 b0 3e f3 aa b0 2a aa  eb cf c6 05 24 b4 09 5a  |..>...*.....$..Z|
00000040  cd 21 c3                                          |.!.|
00000043

มันทำงานอย่างไร:

            |   org 0x100
            |   use16
be 82 00    |       mov si, 0x82        ; source = command line arguments
bf 43 01    |       mov di, result      ; destination = result
57          |       push di
31 d2       |       xor dx, dx          ; clear dx
ac          |   n:  lodsb               ; al = *si++
3c 0d       |       cmp al, 0x0d        ; end of input reached? (newline)
74 2c       |       je q                ; jump to exit in that case
89 d1       |   @@: mov cx, dx          ; store last char in cl
88 c2       |       mov dl, al          ; and store the current char in dl
aa          |       stosb               ; *di++ = al
e3 f4       |       jcxz n              ; skip encoding this char if cx == 0 (only happens for the first char)
4f          |       dec di              ; move di pointer back
28 c1       |       sub cl, al          ; take the difference between this char and the last one
9f          |       lahf                ; store flags from last subtraction in bh
88 e7       |       mov bh, ah
79 02       |       jns @f
f6 d9       |       neg cl              ; make sure cl is positive
83 f9 0d    |   @@: cmp cl, 13          ; which way is shorter?
9f          |       lahf                ; also store these flags
76 05       |       jbe @f
83 e9 1a    |       sub cl, 26          ; invert cl if we're going backwards
f6 d9       |       neg cl
30 fc       |   @@: xor ah, bh          ; xor saved flags together
9e          |       sahf                ; load flags register with the result
b0 3c       |       mov al, '<'
78 02       |       js @f               ; now the sign flag tells us which operator to use
b0 3e       |       mov al, '>'
f3 aa       |   @@: rep stosb           ; while (cx--) *di++ = al
b0 2a       |       mov al, '*'         ; mark the end with an asterisk
aa          |       stosb
eb cf       |       jmp n               ; repeat
c6 05 24    |   q:  mov byte [di], '$'  ; mark end of string
b4 09       |       mov ah, 0x09        ; dos function: print string
5a          |       pop dx              ; dx = string pointer
cd 21       |       int 0x21            ; syscall
c3          |       ret
            |   result rb 0

นี้. นี่มันเจ๋งเกินกว่า คุณทำสิ่งนี้จริง ๆ อย่างรวดเร็วด้วยเช่นกัน
Magic Octopus Urn

ขอบคุณ มันเป็นวิธีแก้ปัญหาเล็กน้อย เพิ่งจะเกิดขึ้นค่อนข้างสั้นใน 8086
user5434231

10

Python 3 , 87 ไบต์

r,*s=input();p=r
for c in s:d=(ord(p)-ord(c)-13)%26-13;r+='<'*d+'>'*-d+'*';p=c
print(r)

ลองออนไลน์!

ทำงานได้กับตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่

โปรแกรมจะสร้างสตริงเอาต์พุตrตามที่วนซ้ำอักขระในอินพุตสตริง มันเก็บตัวอักษรก่อนหน้าเป็นpและคำนวณการดำเนินการที่เพิ่มขึ้นเพื่อรับจากpตัวละครใหม่cการเป็นตัวละครใหม่

ช่วงเวลาระหว่างตัวอักษรเป็นord(c)-ord(p)และ(ord(c)-ord(p)-13)%26-13ใช้มันแบบโมดูโล 26 [-13..12]ถึงช่วงเวลา ผลลัพธ์ในเชิงลบหมายถึงสั้นลงและก้าวไปข้างหน้าและผลบวกหมายถึงการก้าวขึ้น จำเป็นต้องแปลงเป็นสตริง>หรือ<ขึ้นอยู่กับเครื่องหมาย แทนที่จะใช้absหรือมีเงื่อนไขเราใช้ประโยชน์จากการคูณสตริงของไพ ธ อนs*nให้สตริงว่างเมื่อnเป็นลบ ในการแสดงออก'<'*-d+'>'*dส่วนที่ลงนามผิดไม่ได้มีส่วนร่วม

สถานะเริ่มต้นถูกจัดการโดยแยกอินพุตให้เป็นอักขระตัวแรกและส่วนที่เหลือด้วยการเปิดออกของ Python 3 r,*s=input()เอาออก อักขระเริ่มต้นใช้ในการเริ่มต้นสร้างสตริงเช่นเดียวกับอักขระ "ก่อนหน้า" เริ่มต้น

ขอบคุณ ovs สำหรับการแนะนำให้เปลี่ยนเป็น Python 3 เพื่อทำการแกะกล่องออก


6

Python 3 , 110 93 ไบต์

r,*s=input()
b=r
for a in s:d=(ord(a)-ord(b))%26;r+=['>'*d,'<'*(26-d)][d>13]+'*';b=a
print(r)

ลองออนไลน์!


Ooo ... ใช้ได้กับทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตัวดี (แต่ฉันคิดว่าคุณสามารถกำจัดไบต์ด้วยการสันนิษฐานอย่างใดอย่างหนึ่ง)
Magic Octopus Urn

กรุณาอธิบาย
สหาย SparklePony

3

JavaScript (ES6), 118 109 107 ไบต์

สตริงอินพุตไม่คำนึงถึงขนาดตัวพิมพ์

s=>s.replace(/./g,(c,i)=>(d=~~s-(s=parseInt(c,36)),i)?'<><>'[k=d/13+2|0].repeat([d+26,-d,d,26-d][k])+'*':c)

มันทำงานอย่างไร

ซึ่งแตกต่างจาก Python ตัวดำเนินการ JS modulo ส่งคืนตัวเลขที่มีเครื่องหมายเช่นเดียวกับเงินปันผลมากกว่าตัวหาร นอกจากนี้repeat()เมธอดJS จะเกิดข้อผิดพลาดเมื่อได้รับจำนวนลบแทนที่จะส่งคืนสตริงว่าง (และมันก็จะนานกว่าอย่างง่าย ๆ*อยู่ดี)

สิ่งเหล่านี้เป็นพฤติกรรมที่ไม่พึงประสงค์สำหรับความท้าทายนี้ ดังนั้นเราควรระบุในกรณีที่เราควรจะใช้เทคนิคทางคณิตศาสตร์ (ซึ่งไม่ได้หมายความว่าเทคนิคดังกล่าวไม่มีอยู่จริง แต่เป็นการที่ฉันไม่สามารถหามันได้)

ด้านล่างเป็นตารางที่อธิบายถึงกรณีที่เป็นไปได้ทั้ง 4 กรณีโดยที่dระยะทางที่เซ็นชื่อระหว่างตัวละครปัจจุบันกับตัวก่อนหน้า:

d           | floor(d / 13) + 2 | direction | repeat
------------+-------------------+-----------+-------
-25 ... -14 |         0         |     <     | d + 26
-13 ... -1  |         1         |     >     | -d  
 +0 ... +12 |         2         |     <     | +d  
+13 ... +25 |         3         |     >     | 26 - d

กรณีทดสอบ


2

PHP, 127 ไบต์

for($l=ord($r=($s=$argn)[0]);$x=ord($s[++$i]);$l=$x)$r.=str_pad("",($a=abs($n=$l-$x))<14?$a:26-$a,"><"[$n>0^$a>13])."*";echo$r;

Testcases

PHP, 137 ไบต์

for($l=$r=($s=$argn)[0];$s[++$i];$l=$s[$i])$r.=str_pad("",$d=min($a=abs(ord($l)-ord($s[$i])),$b=26-$a),"><"[$d<$b^$l<$s[$i]])."*";echo$r;

Testcases


2

JavaScript (ES6), 111 103 ไบต์

f=
s=>s.replace(/./g,(c,i)=>(p=(n+26-(n=parseInt(c,36)))%26,i?'<>'[p+3>>4].repeat(p>13?26-p:p)+'*':c),n=0)
<input oninput=o.textContent=f(this.value)><pre id=o>

s=>[...s].map(c=>(n=parseInt(c,36),p&&(p=(n+26-p)%26,s+='><'[p+3>>4].repeat(p>13?26-p:p)+'*'),p=n),s=s[p=0])&&s

เดิมทีเป็นรุ่นที่ใช้เวลา 111 ไบต์ก่อนที่ฉันจะปรับเปลี่ยนเคล็ดลับของ @ Arnauld nในขณะที่คำนวณpฉันคิดว่าอาจมีอีกวิธีหนึ่งที่ใช้sแทนnแต่มันจะมาสายดังนั้นฉันจึงไม่ต้องกังวล:


2

Haskell (lambdabot), 161 153 bytes

w(s:n)=s:(join.snd$mapAccumL(ap(,).g)s n);g c n|q<-[c..'z']++['a'..c],(Just l,s)<-minimum$first(elemIndex n)<$>[(q,'>'),(reverse q,'<')]=(s<$[1..l])++"*"

ลองออนไลน์!


คำอธิบาย:

-- Encode a single letter
g c n | q          <- [c..'z']++['a'..c]        -- The alphabet starting from letter c, looping around
      , (Just l,s) <- minimum                   -- Choose the smallest of ..
                    $ first(elemIndex n)        -- the index of the letter n ..
                  <$> [(q,'>'),(reverse q,'<')] -- from the alphabet q and its reverse

      = (s<$[1..l]) -- Repeat < or > the same number of times as the index of n ..
     ++ "*"         -- and append *

-- Encode the whole string
w (s:n) = s                                -- Yield the first char of the input
        : ( join . snd                     -- Concatinate the result of ..
          $ mapAccumL (\a b->(b,g a b))s n -- executing the g function on each letter of the input string ..
                                           -- except the first, passing the previous letter as the 'c' ..
                                           -- argument on each iteration
          )

2

EXCEL VBA 130 ไบต์

s="":p=Mid(s,1,1):For i=1 To Len(s)-1:b=Asc(Mid(s,i+1,1)):a=Asc(Mid(s,i,1)):p=p &String(abs(b-a),IIf(b>a,">","<"))&"*":Next:[a1]=p

เรียกใช้จาก Excel VBA หน้าต่างทันที

คำอธิบาย:

ง่ายสำหรับการวนซ้ำที่มีฟังก์ชัน String เพื่อทำซ้ำ ">" หรือ "<" n จำนวนครั้งโดยที่ n คือความแตกต่างของ ASCII ระหว่างสตริงอักขระ i และ i + 1


2

Java 7-, 232 ไบต์

class C{static void main(String[]a)throws Exception{int i=System.in.read(),j,d,c;p(i);while((j=System.in.read())>10){d=(j-i+26)%26;c=d>13?-1:1;while(d%26>0){d-=c;p(61+c);}p(42);i=j;}}static void p(int k){System.out.print((char)k);}}

ค่อนข้างแก้ปัญหาเล็กน้อย Ungolfed และแสดงความคิดเห็น:

class C {
    static void main(String[] a) throws Exception {
        int i = System.in.read(), j, d, c; // i is the last character. j is the current character. d is the difference. c is the direction (-1 is left, 1 is right)
        p(i); // print the starting character first
        while ((j = System.in.read()) > 10) { // keep going until a newline is hit (or an EOF/EOL for -1)
            d = (j - i + 26) % 26; // get the difference (always positive) by wrapping around
            c = d > 13 ? -1 : 1; // get the direction by finding which way is shorter, going right when it's a tie
            while (d % 26 > 0) { // keep going until the current character is reached
                d -= c; // reduce d in the right direction
                p(61 + c); // < is 60 = 61 + (-1), > is 62 = 61 - (-1)
            }
            p(42); // print an asterisk
            i = j; // set the current character to the new reference point
        }
    }

    static void p(int k) {
        System.out.print((char) k);
    }
}

2

C, 170 ไบต์

e(c){putchar(c);}i;m(a,b){i=b-a?a>b?b-a<14?b-a:-(a+26-b):a-b<14?-(a-b):b+26-a:0;while(i>0)e(62),i--;while(i<0)e(60),i++;}f(char*l){e(*l);while(l[1])m(*l,l[1]),e(42),l++;}

รายละเอียด สด

e(c){ putchar(c); } // encode

g(a,b) // obtain required transition
{
    return (b-a) // calculate distance

         ? (a > b // distance is non-zero

             // if b comes after a
             ? (b-a < 14 // if forward is a shorter path
                 ? b-a // go forward
                 : -(a+26-b)) // otherwise go backward

             // if b comes before a
             : (a-b < 14 // if backward is a shorter path
                 ? -(a-b) // go backward
                 : b+26-a)) // otherwise go forward

         : 0; // if distance is 0
}

// transition
i;m(a,b)
{
    // obtain required transition
    i=g(a,b);

    // encode forward transition
    while(i>0)e('>'), i--;

    // encode backward transition
    while(i<0)e('<'),i++;
}

// incremental cipher function
f(char*l)
{
    e(*l); // encode first character

    while(*(l+1)) // while next character is not END-OF-STRING
        m(*l,*(l+1)), // do transition from current to next character
        e('*'), // encode
        l++; // next
}

ทางออกที่ดี ต่อไปนี้อาจเข้าใจได้ง่ายขึ้น แต่นานกว่า 1 ไบต์:#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
Moreaki

1
@Moreaki Thx แต่นี่เป็นโค้ดกอล์ฟดังนั้นเราจึงมุ่งมั่นที่จะลดจำนวนไบต์เสมออย่างไรก็ตามฉันได้เพิ่มคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานของรหัสของฉัน
Khaled.K

2

JavaScript (ES6), 140 128 129 111 113 ไบต์

ฉันลงเส้นทางที่แตกต่างไปยังโซลูชัน JS อื่น ๆ แต่มันก็ไม่ได้ผลดีเกินไป - นี่คือสิ่งที่ฉันมี:

f=

([x,...s])=>x+s.map(y=>`<><>`[r=(d=y[c=`charCodeAt`]()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+`*`).join``

i.addEventListener("input",()=>o.innerText=i.value&&f(i.value))
console.log(f("adbc"))
console.log(f("aza"))
console.log(f("abcdef"))
console.log(f("zyaf"))
console.log(f("zzzzzz"))
console.log(f("z"))
console.log(f("zm"))
console.log(f("zl"))
console.log(f("alphabet"))
console.log(f("banana"))
console.log(f("abcdefghijklmnopqrstuvwxyz"))
console.log(f("abcdefz"))
<input id=i>
<pre id=o>

  • บันทึก 12 ไบต์ด้วยคำแนะนำจาก Lukeในการทำลายสตริง
  • เพิ่ม 1 ไบต์ในการแก้ไขความท้าทายที่ผิดซึ่งฉันคิดว่าได้รับอนุญาตสำหรับตัวละครสุดท้ายที่พิมพ์โดยนัย
  • บันทึกอีก 18 ไบต์ด้วยการเขียนใหม่อย่างกว้างขวางโดยลุค
  • เพิ่ม 2 ไบต์เนื่องจากดูเหมือนว่าตัวเลขไม่ใช่อักขระพิมพ์ที่ถูกต้อง

ดั้งเดิม 131 ไบต์


1
([x,...s])=>x+s.map(...)บันทึก 12 ไบต์ โปรดทราบว่าคุณควรใส่อักขระพิมพ์ต่อท้ายด้วยเช่นกัน ผมขอแนะนำให้ใช้หมายเลขซึ่งจะเสียค่าใช้จ่าย 2 ไบต์แทน`1`+1 `*`
ลุค

ขอบคุณลุค; ฉันลืมไปเลยว่าฉันสามารถโครงสร้างอินพุตสตริงเช่นนั้นได้ เมื่อคืนนี้ฉันต้องเข้าใจผิด ฉันสาบานได้เลยว่าตัวอักษรตัวสุดท้ายนั้นมีความหมายโดยนัย แต่น่าเสียดายที่เพียงตรึงมันไว้หลังจากที่joinจะส่งผลให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับอินพุตตัวอักษรเดียว อย่างไรก็ตามการย้ายตัวอักษรที่พิมพ์ภายในmapวิธีนี้มีราคาเพียง 1 ไบต์
Shaggy

1
([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``for 111 bytes
Luke

ขอบคุณอีกครั้ง @Luke ก่อนที่ฉันจะแก้ไขคุณต้องการโพสต์ข้างต้นเป็นคำตอบของคุณเองหรือไม่ ฉันรู้สึกว่ามันแตกต่างจากของฉันพอสมควร (เกือบจะเป็นลูกผสมของมันและของ Arnauld) เพื่อที่จะโอเค
Shaggy

ไม่คุณสามารถแก้ไขได้ฉันลองเล่นกอล์ฟreduceแก้ปัญหา แต่กลับกลายเป็น 115 ไบต์
ลุค

2

C ++, 210 190 ไบต์

การตีกอล์ฟครั้งแรกของฉัน!

#include<iostream>
int g(char*a){char k,j,d;std::cout<<*a;a++;for(;*a;a++){for(j=*(a-1),d=j-*a,k=d>0?d>13?62:60:d<-13?60:62;j!=*a;j+=k-61,j=j<97?122:j>122?97:j)std::cout<<k;std::cout<<'*';}}

k จะเก็บค่า <,> หรือ * ที่จะพิมพ์ก่อนอื่นเพียงพิมพ์องค์ประกอบแรกของอาร์เรย์จากนั้นเรียกใช้ลูปสำหรับ a จากองค์ประกอบแรกไปจนถึงองค์ประกอบสุดท้ายของอาร์เรย์ j เก็บองค์ประกอบก่อนหน้านี้แล้วเปรียบเทียบว่า j ใกล้เคียงกับ * a โดย <หรือ> ตั้งค่า k เป็น <,> ตามลำดับแล้วพิมพ์ k จากนั้นเรียกใช้ลูปนี้จนกว่า j จะเท่ากับ p จากนั้นทุกครั้งหลังจากสิ้นสุดการวนซ้ำครั้งที่สอง *


2
ยินดีต้อนรับสู่เว็บไซต์! ถ้าผมจำได้อย่างถูกต้องสามารถถูกแทนที่ด้วย*p!=0 *pฉันค่อนข้างแน่ใจว่าพื้นที่ในchar *aนั้นไม่จำเป็นเช่นกัน คุณจะต้อง#include <iostream>และusing namespace std;(แม้ว่าฉันคิดว่ามันอาจจะถูกกว่าการเพิ่มstd::) เพื่อให้คำตอบนี้สมบูรณ์
ข้าวสาลีตัวช่วยสร้าง

2
ยินดีต้อนรับสู่เว็บไซต์! ฉันคิดว่าคุณต้องรวมไว้std::หรือusing namespace std;คุณอาจต้อง#include <iostream>นับจำนวนไบต์ด้วย
DJMcMayhem

+1 แต่แก้ไขสองสิ่งที่กล่าวมาแล้วยินดีต้อนรับสู่ PPCG;) ชำระเงินบางภาษารอบ ๆ TIO Nexus ( tio.run/nexus ) เมื่อคุณมีโอกาส! อาจแนะนำตัวเองให้รู้จักกับ Dennis เขาเป็นคนสำคัญที่ลอยอยู่แถวนี้
Magic Octopus Urn

ขอบคุณทุกคนสำหรับคำแนะนำและชี้ให้เห็นข้อผิดพลาด ฉันจะอัปเดตรหัสในไม่ช้า
0x81915

1

05AB1E , 17 ไบต์

¬sÇ¥v„<>y0›èyÄ×ðJ

ลองออนไลน์!

คำอธิบาย

การใช้ประโยชน์ > , <และ<space>เพื่อแสดงถึงการเพิ่มขึ้น , ลดลง , ส่ง

¬                  # get the first letter of the input string
 sǥ               # push a list of delta's of the character codes in the input string
    v              # for each delta
     „<>           # push the string "<>"
        y0›        # check if the delta is positive
           è       # use this to index into the string
            yÄ×    # repeat it abs(delta) times
               ðJ  # join to string with a space

และสูญเสียอันนี้ไป 3 ชั่วโมง😉
Magic Octopus Urn

1

Haskell , 167 168 126 ไบต์

f=fromEnum
r=replicate
a?b=mod(f a-f b-13)26-13
c#x=r(c?x)'<'++r(-c?x)'>'
s(c,s)x=(x,s++c#x++"*")
e(x:y)=x:snd(foldl s(x,[])y)

ตอนนี้ใช้โซลูชันเลขคณิตของ xnor โทรไปด้วยe strที่str :: Stringเป็นสตริงที่จะเข้ารหัส


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