Як засмучує мій фільм?


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.

Додаткові правила

Це виклик з тому ваші відповіді будуть набрані у байтах, а менша кількість байтів - краща. Вхід завжди буде складатися з буквено-цифрових символів, ви можете підтримувати великі або малі літери, і вам потрібно підтримувати лише одну. Вхід ніколи не буде порожнім.

Тестові шафи

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

3
Пропонований тестовий випадок: "blast2" -> 3(не справжній фільм, але у деяких відповідей є проблеми з такими тестовими кейсами)
Арнольд

Запропонований тестовий випадок: один, що складається лише з цифр, таких як 5 -> 0
lirtosiast

1
Пропонований тестовий випадок:90 -> 1
nwellnhof

Чи можемо ми припустити, що вхідний рядок буде не порожнім?
Час Браун

@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-індексований стовпець х визначається за формулою:

х=(c-1)мод6

де c - код символу ASCII.

Для позитивних цифр н нам потрібно зробити:

х=(н+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".
Арнольд

Ага. У такому випадку: 53 байти
Shaggy

1
@Shaggy Порозрядне АБО зазнає невдачі, скажімо, "234".
Арнольд

4
Менше віскі - це ніколи не відповідь!
Кудлатий

7

Желе , 11 байт

⁾04yO‘%6<ƝS

Монадична посилання, що приймає список (великих літер) символів.

Спробуйте в Інтернеті!

Як?

Спочатку замінюється будь-який '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

Ще один портрет Джонатана Аллана відповідь Желе. Вводить великі літери.

Пояснення:

¾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

Перелічіть алфавіт та цифри в порядку в ОСК і присвячіть їх кожному номеру стовпця (1-індексований).

.
;$&$*

Перетворіть кожен номер стовпця в одинаковий.

&`;(1+);1\1

Порахуйте кількість стовпців, за якими слідує більший (тобто праворуч) стовпчик. &`Дозволяє сірники , щоб перекриття.



0

Математика, 102 байти

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

Чиста функція. Приймає список символів як вхідний і повертає число як вихід. Це досить наївне рішення, пропозиції щодо гольфу вітаються.



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

Спробуйте в Інтернеті!

Ця функція підтримуватиме лише малі входи


Негольфірованний і прокоментував:

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*


Зміни:

  • Поле 3 байти в обчисленні стовпця (функція c)
  • Поле для байтінгу 2 байти завдяки стельовій кішці

А там 77 байт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.