Розділити позначки Марка


21

Виклик

Марк - студент, який отримує свої Nоцінки з'єднаним чином в один рядок.

Завдання полягає в тому, щоб відокремити його сліди, знаючи , що кожен знак може бути тільки 0або 1або 2або 3або 4або 5або 6або 7або 8або 9або 10.

Вхідні дані

N натуральне число і один рядок.

Вихідні дані

Набір натуральних чисел.

Приклад

N, One line------------------> Set of marks
3, '843'---------------------> [8, 4, 3]
1, '0'-----------------------> [0]
2, '1010'--------------------> [10,10]
3, '1010'--------------------> [1,0,10] or [10,1,0] 
4, '1010'--------------------> [1,0,1,0]
9, '23104441070'-------------> [2, 3, 10, 4, 4, 4, 10, 7, 0]
12,'499102102121103'---------> [4, 9, 9, 10, 2, 10, 2, 1, 2, 1, 10, 3]
5, '71061'-------------------> [7, 1, 0, 6, 1]
11,'476565010684'------------> [4, 7, 6, 5, 6, 5, 0, 10, 6, 8, 4]
4, '1306'--------------------> [1, 3, 0, 6]
9, '51026221084'-------------> [5, 10, 2, 6, 2, 2, 10, 8, 4]
14,'851089085685524'---------> [8, 5, 10, 8, 9, 0, 8, 5, 6, 8, 5, 5, 2, 4]
11,'110840867780'------------> [1, 10, 8, 4, 0, 8, 6, 7, 7, 8, 0]
9, '4359893510'--------------> [4, 3, 5, 9, 8, 9, 3, 5, 10]
7, '99153710'----------------> [9, 9, 1, 5, 3, 7, 10]
14,'886171092313495'---------> [8, 8, 6, 1, 7, 10, 9, 2, 3, 1, 3, 4, 9, 5]
2, '44'----------------------> [4, 4]
4, '9386'--------------------> [9, 3, 8, 6]

Правила

  • Коли можливо кілька виходів, дайте лише один вихід.
  • Тільки позначка значення 10розміщена на двох десяткових, інші - на одній десятковій.
  • Введення та вихід можуть бути задані у будь-якому зручному форматі
  • Не потрібно обробляти неправильний ввід
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Ось фрагмент Python, який я використав для отримання n, 'string'пар з текстового блоку прикладу копіювання:spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop

3
Plz деякі коментарі для супресорних голосів ...
mdahmoune

Новини не потребують коментарів залишати причину. Немає нічого, що можна покращити в цьому виклику.
користувач202729

Тому не хвилюйтеся з цього приводу.
користувач202729

Чи потрібно, щоб виходи були в тому ж порядку, що і вхід?

Відповіді:


6

Брахілог , 23 21 байт

-2 байти завдяки Fatalize

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l

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

Вхід - пара [Line, N].

Це моя перша програма Brachylog, тому, мабуть, є багато можливостей для вдосконалення.

Це дуже повільно, коли довжина лінії> 7.

Пояснення:

h~c.{ịℕ≤10&ịṫ?∧}ᵛ&t~l
h                         The first element in the input
 ~c                       is formed by concatenating
   .                      the elements in the output array
   .{         ∧}ᵛ     AND For every element in the output array holds that
     ị                      The element converted to an integer
      ℕ                       is a natural number
       ≤10                    and less than or equal to 10
          &ịṫ?              and it has no leading zeroes (*)
                 &t   AND The second element of the input
                   ~l     is the length of the output 

(*) ịṫ?перевіряє відсутність провідних нулів. Він перетворює рядок у ціле число, а потім назад у рядок і порівнює з початковим рядком.


Вам не потрібно вводити число як рядок, просто використовуйте ціле число. Це усуває необхідність для всіх тих , і для ведучого нуля перевірки: h~c.{ℕ≤10}ᵛ&t~l. Це, мабуть, повільніше, оскільки деконканація на цілі числа повинна працювати навіть для невідомих цілих чисел через обмеження, що робить її неефективною.
Фаталізувати

(Також зауважте, що використання hта tотримання першого / останнього елемента є більш ефективним, ніж використання для обох (що в більшості програм навіть не працює)).
Фаталізувати

@Fatalize Я зрозумів, що рядок введення може містити провідні нулі, тому використовувати ціле число в якості введення неможливо.
fergusq

Правильно, це дратує ...
Підписано

5

Perl 6 , 25 байт

->\a,\b{b~~/(10|.)**{a}/}

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

Блок анонімного коду, який приймає число і рядок і повертається як об'єкт відповідності.

Пояснення:

->\a,\b{                }  # Anonymous code block taking params a and b
        b~~/           /   # Match using b
            (10|.)           # 10 or a single digit
                  **{a}      # Exactly a times, being greedy


5

V , 17 , 12 байт

\ÓòÀGjí1“î…0

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

Я був задоволений 17 байтами, але ніж 05AB1E прийшов разом з 13, і я не міг не допустити жодного завдання без відповіді. : D

\Ó                      " Put each character on it's own line
  ò                     " Recursively (repeat until an error happens)...
   ÀG                   "   Go to the "n"th line
     j                  "   Move down a line (this will error if there are exactly "n" lines)
      í                 "   Remove...
       1                "     a '1'
        <0x93>          "     START THE MATCH HERE
              î         "     a newline
               <0x85>   "     END THE MATCH HERE
                   0    "     a '0'

Hexdump:

00000000: 5cd3 f2c0 476a ed31 93ee 8530            \...Gj.1...0

Альтернативне рішення:

\ÓòÀGjç1î0/J

На жаль, це замінює 10на1 0


4

Рубін , 57 байт

->n,m{m.sub!"10",?A while m[n];m.chars.map{|c|c.to_i 16}}

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

Це може виявитися не найкращим підходом, але це виглядає цікавою ідеєю тимчасово замінити 10шестигранну A, що, до речі, також є високою оцінкою (якщо розглянути систему класифікації AF :))




4

Пітон 3 , 71 68 59 байт

вниз ще 9 байт завдяки ов.

lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]

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

Я по-справжньому намагався використовувати str.partition()рекурсивно, але replaceне дуже довго вдарив мене по обличчю. Чи може хтось покращити це?

Також ось посилання TIO, яке я використовував для перетворення тестових випадків на щось більш копіювальне / вставляемое


1
-3 байт: падіння простір між : [cта 'x' elseі10 for
mdahmoune

@mdahmoune Спасибі за те, що я помітив, мені важко запам'ятати, що можна збривати разом.
Гігафлоп

8
Загальне правило: В основному все, окрім двох літер, можна скласти разом. Якщо ви отримаєте синтаксичну помилку, додайте випадкові пробіли, поки вона не працює :)
Quintec

Є деякі винятки , такі як <number>e, <letter><number>, f'.
користувач202729

3
59 байт шляхом заміни 10 з і читання кожного символу в якості основи 11 INT: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
ов

3

Haskell , 98 байт

n!x=[y|y<-s x,y==take n y]!!0
s('1':'0':x)=do y<-s x;[1:0:y,10:y]
s(x:y)=(read[x]:)<$>s y
s _=[[]]

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

Пояснення

Функція sвиконує всі можливі розбиття, наприклад: "1010"стає [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], зауважте, як найдовші розщеплення закінчуються на початку (тому що 1:0:yйде раніше 10:y).

Зважаючи на це, ми можемо взяти всі ці значення і відфільтрувати ys, куди y == take n yтакож зберігаються розбиття, короткіші, ніж потрібно. Наприклад, 4ми залишаємо список таким же [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

Тепер ми можемо просто отримати перший елемент у цьому списку, оскільки вхідні дані завжди будуть дійсними (наприклад 5!"1010", давали б [1,0,1,0]теж, але нам не потрібно це обробляти).

Примітка: я якось неправильно рахував .. y==take n yтака ж довжина, як length y==n: S





2

JavaScript (Babel Node) ,  70 69  59 байт

Вводиться як " (n)(line).

n=>s=>(a=s.match(/10|./g)).flatMap(x=>x>9&&!a[--n]?[1,0]:x)

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

Прокоментував

n => s =>                       // given n and s
  (a = s.match(/10|./g))        // split s into marks; a '1' followed by a '0' is always
                                // interpreted as '10'
  .flatMap(x =>                 // for each mark x:
    x > 9 &&                    //   if x = '10',
    !a[--n] ?                   //   then decrement n; if a[n] is undefined:
      [1, 0]                    //     yield [1, 0]
    :                           //   else:
      x                         //     yield the mark unchanged
  )                             // end of flatMap()

JavaScript (ES6),  64  59 байт

Збережено 5 байт завдяки @ guest271314

Вводиться як " (n)(line).

n=>g=([...s])=>1/s[n]?g(eval(`[${s}]`.replace('1,0',10))):s

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

Прокоментував

n =>                            // main function, taking n
  g = ([...s]) =>               // g = recursive function, taking s
                                //     (which is either a string or an array)
    1 / s[n] ?                  // if s[n] is defined (i.e. we have too many marks):
      g(                        //   do a recursive call to g:
        eval(                   //     build a new array by evaluating ...
          `[${s}]`              //       ... the string representation of s[] where the
          .replace('1,0', 10)   //       first occurrence of '1,0' is replaced with '10'
        )                       //     end of eval()
      )                         //   end of recursive call
    :                           // else:
      s                         //   return s

Чому вихід для N = 3 та line = '1010' має змішані типи [1, 0, '10']?
mdahmoune

s.match()повертає масив рядків, але "10"може бути розділений на [1,0](2 цілих числа) у функції зворотного виклику flatMap().
Арнольд

1
Ми можемо примусити все до цілих чисел для +1 байта .
Арнольд

59 байтeval(`[${s}]`.replace('1,0',10))
гість271314

@ guest271314 Дякую! Гарний улов.
Арнольд

2

Java (OpenJDK 8) , 78 байт

Приємний однолінійний за допомогою API потоків.

(n,l)->l.join(":",l.split("10",l.length()-n+1)).chars().map(i->i-48).toArray()

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


Як це працює

(n,l)->                     // Lambda function taking int and string
  l.join(":",               // Join the following array with colons
    l.split("10",           // Split the original string on "10"...
      l.length()-n+1))      // But limit the parts to the difference between the length
                            // and expected length, to only remove  required number of 10s              
  .chars()                  // Convert to an intstream of codepoints
  .map(i->i-48)             // Remove 48 to get the numeric value of each codepoint
  .toArray()                // Return an int array

2

R , 63 байти

Хоча довжина рядка більша за n, замініть наступні 10, для яких ви досягнете ":"(символ ASCII після 9). Потім розділіть на числа, взявши значення ASCII кожного символу в рядку.

function(n,x){while(nchar(x)>n)x=sub(10,":",x);utf8ToInt(x)-48}

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



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