Скільки балів дає мій номерний знак?


31

(Це моє перше кодове питання про гольф)

Коли я був дитиною, ми з татом винайшли гру, де номерний знак, який ми бачимо на автомобілях, може давати певні бали на основі деяких досить простих правил:

X кількість тієї самої літери чи цифри дає X-1 бали, приклади:

22 = 1 point
aa = 1 point
5555 = 3 points

Цифри повинні бути поруч з іншими, тому 3353дає лише 1 бал, оскільки 5 порушує послідовність 3.

Послідовність X чисел у порядку зростання або спадання, як мінімум, 3, наводять X балів, приклади:

123 = 3 points
9753 = 4 points
147 = 3 points

Система точок працює лише для одноцифрових чисел, тому 1919не дає очок, а 14710лише 3, (147).

Послідовності можна комбінувати, щоб зробити більше точок, прикладів:

1135 = 4 points (1 point for 11 and 3 points for 135)
34543 = 6 points (3 points for 345 and 3 points for 543)

Однак вам заборонено розбивати більшу послідовність на 2 менші послідовності для додаткових точок: 1234 = 123, 234 (6 points)заборонено.

Ваше завдання, задавши послідовність, визначити кількість балів, які дає номерний знак.

У Данії ліцензійні знаки структуровані так: CC II III, де C є символом, а я цілим числом, і, таким чином, мої приклади вкладу відображають цю структуру. Якщо ви хочете, ви можете зробити послідовність відповідно до вашої власної структури, або, якщо ви відчуваєте, що це справді авантюризм, дозвольте програмі проаналізувати структуру номерних знаків і таким чином дозволити їй працювати на будь-якому типі номерних знаків у всьому світі. Явно вказуйте структуру, яку ви вирішили використовувати у своїй відповіді.

Ви можете взяти вклад будь-яким способом, будь ласка, або рядок або масив, здається, мають для мене найбільш сенс.

Тестовий вхід | вихід:

AA 11 111 | 5
AB 15 436 | 3
OJ 82 645 | 0
UI 65 456 | 6
HH 45 670 | 5
YH 00 244 | 5
AJ 00 754 | 1

Зважаючи на характер вибору власної структури або навіть покриття всіх структур, я не обов'язково бачу, як можна чітко визначити переможця. Я думаю, що переможець буде найкоротшим байтом структури, яку вирішив. (І не приймайте такі дані, як CICIC, просто щоб зробити це легше для себе)

Редагувати:

Через запитання коментарів, я маю поділитися кількома додатковими відомостями: Послідовність висхідних чи низхідних чисел відноситься до арифметичної послідовності, тому X +/- a * 0, X +/- a * 1, ... X +/- a * n тощо. Отже, 3-5-7, наприклад, є 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2. Послідовність, однак, не повинна починатися з 0 і не закінчуватися в 0.

БІЛЬШЕ редагування:

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


Мало споріднені . Ласкаво просимо в PPCG і приємне перше запитання!
Містер Xcoder

Схожий тест: XX 87 654. Я придумав те, що було правильним для всіх ваших тестових випадків, але якимось чином невірним для цього. Працюю над його виправленням.
Kevin Cruijssen

7
Я настійно пропоную вам виправити певну структуру (я пропоную CCIIIII, немає пробілів), інакше в цій проблемі відсутній об'єктивний критерій виграшу, який нам тут потрібен. Як є, "(І не сприймайте такі дані, як CICIC, лише щоб полегшити для себе)" дуже суб'єктивно. Що таке, а чи не допустима структура?
Лінн

1
@Lynn Допустима структура - це така, яка може насправді давати бали, CICIC ніколи не матиме послідовності, яка дасть будь-які бали, тому вона неприпустима. І крім цього, чому "найкоротша відповідь у байтах на вибраній мові програмування та вибраній структурі" не є чіткими, об'єктивними критеріями виграшу? Цей критерій виграшу має чітке правило, яке легко виконувати, але дає розробникові свободу вибору того, з якою структурою вони хочуть працювати. Звичайно, це може бути багато різних переможців, але, справді, так що?
Тролі MB MB Jensen

3
Тестовий випадок: IA99999(містить зменшується послідовність кодових точок, але не цифр).
Згарб

Відповіді:


7

05AB1E , 25 22 20 18 байт

Приймає рядок малих алфавітних символів та цифр без пробілів.

Ç¥0Kγ€gXK>OIγ€g<OO

Спробуйте в Інтернеті! або як тестовий набір


Я не можу читати 05AB1E без пояснення;) Але чи можете ви зберегти байти, отримавши введення без пробілів?
Kevin Cruijssen

@ Mr.Xcoder Я також сумніваюся. Але я особисто не можу читати 05AB1E, тому я подумав, що, можливо, Емінья додала будь-який код, щоб позбутися / проігнорувати пробіли. Можливо, це робиться неявно без зайвих байтів, але я просто запитав у випадку, якщо цього не зробило.
Kevin Cruijssen

Я щойно взяв ваш код для розгойдування, і святе лайно, він фактично працює будь-якої довжини чи послідовності! Єдине "питання" полягає в тому, що він також дає 3 бали за ABC, що саме по собі не є помилковим, я просто не врахував це, оскільки в Данії у нас є лише два листи поруч.
Тролі MB MB Jensen

2
@KevinCruijssen: Жоден пробіл у введенні не дозволив би зберегти кілька байт. Так. Я пропустив ту частину, де ми могли самі вирішити це. Дякую за голову вгору (Приходить також пояснення).
Емінья

@Emigna Я не говорив це в питанні прямо, я вважав, що досить натякнув на це, коли писав. Ви можете взяти вклад будь-яким способом, будь ласка, або рядок, або масив, здається, мають для мене найбільш сенс. .
Тролі MB MB Jensen

7

Лушпиння , 20 16 15 байт

-1 байт завдяки @Zgarb

Здійснює введення даних без пробілів і в малій області

ṁ??¬o→LεL←gẊ¤-c

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

Пояснення

           Ẋ      Map over all adjacent pairs
            ¤-c   get the difference of their codepoints
          g       Split into groups of equal elements
ṁ                 Map then sum
 ?       ←          If the head of the list is truthy (not 0)
  ?    ε              If the length of the list is 1
   ¬                    return 0
                       Else
    o→L                 return the length + 1
                     Else
        L             return the length

Я думаю, K0що ¬тут може бути .
Згарб

Гм, це, здається, не вдається IA99999.
Згарб

@ Zgarb, змінив формат введення на малі регістри.
H.PWiz


2

Java 8, 195 байт

a->{int r=a[0]==a[1]?1:0,i=3,j,p=a[2],x,y,z;for(;i<7;p=a[i++])for(r+=(x=a[i])==p?1:0,j=-4;++j<4;r+=j==0?0:i<6&&p+j==x&x+j==(y=a[i+1])?++i<6&&y+j==(z=a[i+1])?++i<6&&z+j==a[i+1]?5:4:3:0);return r;}

Однозначно можна пограти ще трохи, використовуючи іншу техніку для перевірки послідовностей.

Пояснення:

Спробуйте тут.

a->{                      // Method with character-array parameter and integer return-type
  int r=                  //  Result-integer
        a[0]==a[1]?       //   If the two letters are equal:
         1                //    Start this result-integer at 1
        :                 //   Else:
         0,               //    Start the result-integer at 0 instead
      i=3,j,              //  Index-integers
      p=a[2],x,y,z;       //  Temp integers
   for(;i<7;              //  Loop (1) from index 3 to 7 (exclusive)
       p=a[i++])          //    And after every iteration: Set `p` and raise `i` by 1
     for(r+=(x=a[i])==p?  //   If the current digit (now `x`) equals the previous `p`:
             1            //    Raise the result-integer by 1
            :             //   Else:
             0,           //    Keep the result-integer the same
         j=-4;++j<4;      //   Inner loop (2) from -3 to 3 (inclusive)
       r+=j==0?           //    If `j` is 0:
           0              //     Skip it, so keep the result-integer the same
          :i<6            //    Else-if `i` is not 6,
           &&p+j==x       //    and the previous digit `p` + `j` equals the current digit,
           &x+j==(y=a[i+1])?
                          //    and the current digit `x` + `j` equals the next digit `y`:
            ++            //     Raise index `i` by 1 first,
              i<6         //     and check if `i` is not 6 again,
              &&y+j==(z=a[i+1])?
                          //     and if the new current digit `y` + `j` equals the next digit `z`:
               ++         //      Raise index `i` by 1 first again,
                 i<6      //      and check if `i` is not 6 again,
                 &&z+j==a[i+1]?
                          //      and if the new current digit `z` + `j` equals the next digit:
                  5       //       Raise the result-integer by 5
                 :        //      Else:
                  4       //       Raise it by 4 instead
              :           //     Else:
               3          //      Raise it by 3 instead
           :              //    Else:
            0             //     Keep it the same
     );                   //   End of inner loop (2)
                          //  End of loop (1) (implicit / single-line body)
  return r;               //  Return the result-integer
}                         // End of method


1

R , 153 , 145 , 143 байт

function(x){p=0;s=sum;if(x[1]==x[2])p=1;a=diff(strtoi(x[3:7]));p=p+s(a==0);l=sort(table(a[a!=0]),T);(p=p+s(l[(l[((s(l)>0)&(l[1]>1))]+1)>2]+1))}

Анонімна функція, яка приймає символ символів і повертає ціле число.
Очікуваний вхідz(c("A", "A", "1", "1", "1", "1", "1"))

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

Безгольова версія

function(x){
  pnt <- 0; s <- sum
  if(x[1] == x[2]) pnt <- 1
  a <- diff(strtoi(x[3:7]))
  pnt <- pnt + s(a == 0)
  l <- sort(table(a[a!=0]), T)
  (pnt <- pnt + s(l[(l[((s(l) > 0) & (l[1] > 1))] + 1) > 2] + 1))
}


0

Pyth , 48 42 байт

Прямий порт від моєї відповіді python. Вводиться як вхідний рядок з малими літерами як: b'aa11111 '.

Це вперше моє кодування в Pyth, тому будь-які поради вітаються: D

KJ=b0VQ=d&KqK-NJ=+b+qNJ*dZ=Z-3yd=K-NJ=JN;b

Спробуйте тут


0

JavaScript, 216 192 186 202 201 байт

function f(s){var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;for(i=0;i<4;i++){if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){p++;b=2}if(i>0){if(a[i]==a[i-1]){p++;h++}if(i<3&c[i]==c[i-1])p++}}return h==4?p+b:p-b}

Немініфікований

function f(s){
    var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;
    for(i=0;i<4;i++){
        if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){
            p++;
            b=2
        }
        if(i>0){
            if(a[i]==a[i-1]){
                p++;
                h++;
            }
            if(i<3&c[i]==c[i-1]) 
                p++;
        }
    }

    return h==4?p+b:p-b
}

Редагувати історію:

  • Звужений код, щоб він працював лише з 0000 XXXформатом. (-24 байти)
  • Редагує, як запропонував @Titus. (-6 байт)
  • виправлено помилку, коли чотири однакові числа дали бал 7 замість 3. (+16 байт)
  • Видалено останню напівкрапку. (-1 байт)
  • Виправлена ​​помилка в коді. (без зміни байтів)

Як я рахую байти?
Брайан Х.


я дуже ненавиджу той факт, що блок коду не розпізнає мову ...
Брайан Х.

Хочете виділити синтаксис?
H.PWiz

btw, 0000дає 7 балів, це правильно? (читається як арифметична послідовність і одночасно повторювана послідовність чисел)
Брайан Х.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.