ภาพยนตร์ของฉันน่าผิดหวังแค่ไหน?


25

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

เห็นได้ชัดว่ามันน่าหงุดหงิด แต่มันน่าหงุดหงิดที่สุดเมื่อคุณต้องการป้อนชื่อภาพยนตร์ที่ต้องใช้การนำทางคีย์บอร์ดที่มีลักษณะดังนี้:

a b c d e f
g h i j k l
m n o p q r
s t u v w x
y z 1 2 3 4
5 6 7 8 9 0

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

ตัวอย่างเช่นถ้าเราต้องการพิมพ์

keyboard
  • เราเริ่มที่kฟรี
  • eอยู่เหนือkดังนั้นเราไม่จำเป็นต้องย้ายไปทางขวา
  • y เหลือทางเดียวดังนั้นไม่จำเป็นต้องขยับไปทางขวา
  • b อย่างไรก็ตามอยู่ในคอลัมน์ถัดไปทางขวาดังนั้นเราจำเป็นต้องย้ายไปทางขวาเพื่อไปที่มัน
  • o อยู่ในคอลัมน์ถัดไปดังนั้นเราจึงต้องเลื่อนไปทางขวาเพื่อไปยังมัน
  • a กลับมาอยู่ในคอลัมน์แรกดังนั้นเราจึงเลื่อนไปทางซ้ายเพื่อไปยังคอลัมน์นั้น
  • r อยู่ทางด้านขวาดังนั้นเราจึงย้ายไปทางขวา
  • dคือสองคอลัมน์ทางด้านซ้ายของrคอลัมน์

อักขระที่ต้องเลื่อนไปทางขวาborหมายถึงความขัดข้อง 3

กฎเพิ่มเติม

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

Testcases

keyboard -> 3
2001aspaceodyssey -> 6
sorrytobotheryou -> 8
thinblueline -> 5
blast2 -> 3

3
กรณีทดสอบที่แนะนำ: "blast2" -> 3(ไม่ใช่หนังจริง แต่คำตอบบางข้อมีปัญหากับกรณีทดสอบดังกล่าว)
Arnauld

กรณีทดสอบที่แนะนำ: หนึ่งในนั้นประกอบด้วยตัวเลขเท่านั้นเช่น 5 -> 0
lirtosiast

1
กรณีทดสอบที่แนะนำ:90 -> 1
nwellnhof

เราสามารถสมมติว่าสตริงอินพุตจะไม่ว่างเปล่าได้หรือไม่?
Chas Brown

@ChasBrown ที่ครอบคลุมในคำถาม
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


8

JavaScript (Node.js) , 61 55 54 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @nwellnhof

รับอินพุตเป็นอาร์เรย์ของอักขระ

s=>s.map(p=c=>r+=p>(p=(+c?~c:1-Buffer(c)[0])%6),r=0)|r

ลองออนไลน์!

อย่างไร?

สำหรับอักขระทั้งหมดยกเว้นตัวเลขมากกว่า0คอลัมน์ 0 จะจัดทำดัชนีxดังนี้:

x=(-1)พอควร6

โดยที่คือรหัส ASCII ของตัวละคร

สำหรับหลักบวกเราต้องทำแทน:n

x=(n+1)พอควร6

ตัวอย่าง:

"a" --> (97 - 1) mod 6 = 96 mod 6 = 0
"b" --> (98 - 1) mod 6 = 97 mod 6 = 1
"0" --> (48 - 1) mod 6 = 47 mod 6 = 5
"3" --> ( 3 + 1) mod 6 =  4 mod 6 = 4

แสดงความคิดเห็น

s =>                       // s = input string (as array)
  s.map(p =                // initialize p to a non-numeric value
  c =>                     // for each character c in s:
    r +=                   //   update the result r:
      p > (                //   compare p with
        p = (              //   the new value of p defined as:
          +c ?             //     if c is a positive digit:
            ~c             //       -(int(c) + 1)
          :                //     else:
            1-Buffer(c)[0] //       -(ord(c) - 1)
        ) % 6              //     apply modulo 6
      ),                   //   yields 1 if the previous value is greater than the new one
    r = 0                  //   start with r = 0
  ) | r                    // end of map(); return r

ดูเหมือนว่าจะทำงานได้โดยไม่ต้องประกอบไปด้วย46 ไบต์
Shaggy

1
@Shaggy มันจะไม่ "blast2"ดูกรณีทดสอบปัญหาของฉัน
Arnauld

อา ในกรณีนี้: 53 bytes
Shaggy

1
@Shaggy "234"ค่าที่เหมาะสมหรือจะล้มเหลวสำหรับการพูด
Arnauld

4
วิสกี้ที่น้อยลงไม่ใช่คำตอบ!
Shaggy

7

เยลลี่ 11 ไบต์

⁾04yO‘%6<ƝS

ลิงก์ monadic ยอมรับรายการของอักขระ (ตัวพิมพ์ใหญ่)

ลองออนไลน์!

อย่างไร?

ขั้นแรกให้แทนที่'0's ด้วย'4's (ดังนั้นส่วนที่เหลือของรหัสจะถือว่าพวกเขาอยู่ในคอลัมน์ด้านขวาสุด) จากนั้นปลดเปลื้องไปยังเลขลำดับเพิ่มหนึ่งและโมดูโลของโดยที่6จะได้รับดัชนีคอลัมน์ 0 จากนั้นเปรียบเทียบเพื่อนบ้านด้วยค่าที่น้อยกว่าและสรุปผลที่ได้

⁾04yO‘%6<ƝS - Link: list of characters         e.g. "BLAST20"
⁾04         - list of characters = ['0', '4']
   y        - translate                             "BLAST24"
    O       - ordinals                              [66,76,65,83,84,50,52]
     ‘      - increment                             [67,77,66,84,85,51,53]
       6    - literal six
      %     - modulo                                [ 1, 5, 0, 0, 1, 3, 5]
         Ɲ  - neighbourly:
        <   -   less than?                          [  1, 0, 0, 1, 1, 1  ]
          S - sum                                   4





1

Japt -x , 14 ไบต์

®rT4 c Ä u6Ãä<

ลองออนไลน์!

ท่าเรือแห่งนี้คำตอบของวุ้น รับอินพุตเป็นอาร์เรย์ของอักขระด้วยตัวอักษรตัวพิมพ์ใหญ่

คำอธิบาย:

®rT4 c Ä u6Ãä<    :
®          Ã      :Map each character through:
 rT4              : Replace 0 with 4
     c            : Get the char-code
       Ä          : Increment it
         u6       : Modulo 6
            ä<    :Replace with 1 if you had to move right, 0 otherwise
                  :Implicitly sum and output

1

Java (OpenJDK 8) , 73 ไบต์

ไม่ใช่ทางออกที่ดีสำหรับ Java! การมีศูนย์อยู่ทางด้านขวามือนั้นทำให้ผมต้องเสียค่าใช้จ่ายหลายไบต์

t->{int a=9,c=0;for(int d:t)c+=a<(a=(--d+(d/48==1?2:0))%6)?1:0;return c;}

ลองออนไลน์!

อธิบาย

t -> {                          // Lambda taking a char array as input
    int a=9,                    // Initialise last column value
        c=0;                    // Initialise frustration count
    for(int d:t)                // Loop through all chars in title
        c+=                     // increment the frustration count if...
          a<                    // The last column is smaller than the current column
            (a=                 // Set last column to current column
              (--d+             // Decrement ascii value of char
                  (d/48==1      // If ascii decremented ascii value is between 48 and 95
                    ?2:0)       // increment by 2 (1 total) or 0 (-1 total)
                )%6)            // Mod 6 to retrieve column index
            ?1:0;               // Increment if to right hand side
    return c;                   // return calculated frustration count
}

1

05AB1E , 12 11 ไบต์

-1 ไบต์ขอบคุณ @Kevin Cruijssen

¾4:Ç>6%¥1@O

อีกพอร์ตของ Jonathan Allan Jelly ตอบ รับอินพุตเป็นตัวพิมพ์ใหญ่

คำอธิบาย:

¾4:Ç>6%¥1@O   //full program
¾4:           //replace all '0's with '4's
   Ç          //get ASCII code points
    >         //increment
     6%       //modulo 6
       ¥      //get deltas
        1@    //is >= 1
          O   //sum

ลองออนไลน์!


1
0'4สามารถ¾4บันทึกไบต์ได้ ( เคล็ดลับ 05AB1E ที่เกี่ยวข้อง )
Kevin Cruijssen


0

เรติน่า 0.8.2 , 46 ไบต์

T`l1-90`1-61-61-61-61-61-6
.
;$&$*
&`;(1+);1\1

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

T`l1-90`1-61-61-61-61-61-6

แสดงรายการตัวอักษรและตัวเลขตามลำดับบน OSK และจับคู่แต่ละคอลัมน์กับหมายเลขคอลัมน์ (1 ดัชนี)

.
;$&$*

แปลงหมายเลขคอลัมน์แต่ละรายการเป็น unary

&`;(1+);1\1

นับจำนวนคอลัมน์ที่ตามด้วยคอลัมน์ที่มีขนาดใหญ่กว่า (เช่นทางขวา) &`ช่วยให้แมตช์ที่จะซ้อนทับกัน



0

Mathematica, 102 ไบต์

Differences[Last@@Join[Alphabet[],ToString/@Range@9,{"0"}]~Partition~6~Position~#&/@#]~Count~_?(#>0&)&

ฟังก์ชั่นบริสุทธิ์ รับรายการอักขระเป็นอินพุตและส่งคืนตัวเลขเป็นเอาต์พุต นี่เป็นทางออกที่ไร้เดียงสาและยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ


0

PHP, 74 81 77 ไบต์

for(;$o=ord($argn[$i]);$i++&&$f+=$p<$x,$p=$x)$x=(--$o/48^1?$o:$o+2)%6;echo$f;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


0

C (gcc) ,  82 79  77 ไบต์

o;c(i){i+=i<60&i>48?1:5;i%=6;}f(char*s){for(o=0;*++s;o+=c(*s)>c(s[-1]));o=o;}

ลองออนไลน์!

ฟังก์ชั่นนี้จะรองรับอินพุตตัวพิมพ์เล็กเท่านั้น


Ungolfed และแสดงความคิดเห็น:

o; //Used for output
c(i){             //Calculates the column of given character
     i+=          //Correct i to get the correct column
        i<60      //If i is a digit...
        & i>48   //... but not '0'
        ?1           //Then move it one column on the right
        :5;          //Else move it five columns on the right
     i%=6;        //Get the column number
}
f(char*s){                        // The actual "frustrating" function
          for(                    //Loop for each character
              o=0;                //reinitialize output
              *++s;               //move to next character / while this is not '\0'
              o+=c(*s)>c(s[-1])  //Increment if current character is on the right of the previous one
             );
           o=o;                   // Outputs result
}

หากฟังก์ชั่นของฉันได้รับอนุญาตให้ยอมรับสตริงตัวอักษรกว้างก็สามารถลดได้ถึง76 ไบต์ด้วย:

o;c(i){i+=i<60&i>48?1:5;i%=6;}f(int*s){for(o=0;*++s;o+=c(*s)>c(s[-1]));o=o;}

ลองออนไลน์!

รุ่นนี้เพิ่งรับอินพุตint*แทนchar*


การแก้ไข:

  • Golfed 3 ไบต์ในการคำนวณคอลัมน์ (ฟังก์ชันc)
  • Golfed 2 ไบต์ต้องขอบคุณแมวป่า

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