Znaki Split Mark

21

Wyzwanie

Mark jest studentem, który otrzymuje swoje Noceny w sposób połączony w jednym pojedynczym wierszu.

Wyzwaniem jest, aby oddzielić jego ślady, wiedząc, że każdy znak może być tylko 0lub 1lub 2lub 3lub 4lub 5lub 6lub 7lub 8lub 9lub 10.

Wkład

N liczba naturalna i jedna linia.

Wydajność

Zestaw liczb naturalnych.

Przykład

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]

Zasady

  • Jeśli możliwych jest kilka wyjść, podaj tylko jedno wyjście.
  • Jedyny znak wartości 10znajduje się z dokładnością do dwóch miejsc po przecinku, a pozostałe są po przecinku.
  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie
  • Nie trzeba obsługiwać nieprawidłowych danych wejściowych
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
mdahmoune
źródło
Oto fragment n, 'string'spl = [item.split('-')[0] for item in text.split('\n')]
kodu
3
Proszę o komentarze na temat głosowania w dół ...
mdahmoune,
Komentarze negatywne nie wymagają pozostawienia komentarza z określonego powodu. Nic nie można poprawić w tym wyzwaniu.
user202729,
Więc nie martw się o to.
user202729,
Czy wyjścia muszą być w tej samej kolejności co dane wejściowe?

Odpowiedzi:

6

Brachylog , 23 21 bajtów

-2 bajty dzięki Fatalize

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

Wypróbuj online!

Dane wejściowe to para [Line, N].

To mój pierwszy program Brachylog, więc prawdopodobnie jest wiele do zrobienia.

Jest bardzo wolny, gdy długość linii> 7.

Wyjaśnienie:

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 

(*) ịṫ?sprawdza, czy nie ma zer wiodących. Konwertuje ciąg na liczbę całkowitą, a następnie z powrotem na ciąg i porównuje z ciągiem oryginalnym.

fergusq
źródło
Nie musisz wprowadzać liczby jako ciągu, wystarczy użyć liczby całkowitej. To łagodzi potrzebę tych wszystkich, i dla wiodących czeku zerowej: h~c.{ℕ≤10}ᵛ&t~l. Jest to prawdopodobnie wolniejsze, ponieważ dekonkatacja na liczbach całkowitych musi działać nawet w przypadku nieznanych liczb całkowitych z powodu ograniczeń, co czyni go nieefektywnym.
Fatalize
(Zauważ też, że użycie hi taby uzyskać pierwszy / ostatni element jest bardziej wydajne niż używanie dla obu (co w większości programów nawet nie będzie działać)).
Fatalize
@Fatalize Zrozumiałem, że linia wejściowa może zawierać początkowe zera, więc nie byłoby możliwe użycie liczby całkowitej jako danych wejściowych.
fergusq
Racja, to denerwujące…
Fatalize
5

Perl 6 , 25 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i ciąg znaków i zwraca jako obiekt dopasowania.

Wyjaśnienie:

->\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
Jo King
źródło
5

Python 3 , 47 bajtów

lambda s,n:[*s.replace(b'\1\0',b'\n',len(s)-n)]

Wypróbuj online!

Bierze „jedną linię” jako bajtowanie z surowymi bajtami \x00 - \x09. Jeśli to nie do przyjęcia:

Python 3 , 56 bajtów

lambda s,n:[x-48for x in s.replace(b'10',b':',len(s)-n)]

Wypróbuj online!

Trwa „jedna linia” jako testowanie.

Bubbler
źródło
5

V , 17 , 12 bajtów

\ÓòÀGjí1“î…0

Wypróbuj online!

Byłem zadowolony z 17 bajtów, ale potem 05AB1E przyszło z 13, i nie mogłem pozwolić, by wyzwanie pozostało bez odpowiedzi. :RE

\Ó                      " 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

Alternatywne rozwiązanie:

\ÓòÀGjç1î0/J

Niestety, ten zastępuje 10z1 0

DJMcMayhem
źródło
4

Rubinowy , 57 bajtów

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

Wypróbuj online!

Może to okazać się nie podejście golfiest, ale wygląda na to pomysł zabawy tymczasowo zastąpił 10na hex A, który nawiasem mówiąc jest również wysoki znak (jeśli weźmiemy pod uwagę Normy AF :))

Kirill L.
źródło
4

Haskell , 68 bajtów

n!('1':'0':x)|n-2<length x=10:(n-1)!x
n!(s:x)=read[s]:(n-1)!x
n!_=[]

Wypróbuj online!

Zachłannie zajmij 10 sekund, o ile pozostanie więcej cyfr niż znaków.

Nitrodon
źródło
4

Python 3 , 71 68 59 bajtów

o kolejne 9 bajtów dzięki ovs.

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

Wypróbuj online!

Początkowo próbowałem używać str.partition()rekurencyjnie, ale replaceniedługo potem uderzyłem mnie w twarz. Czy ktoś może to poprawić?

Ponadto, oto link TIO, którego użyłem, aby przekształcić przypadki testowe w coś bardziej kopiowalnego / wklejalnego

Gigaflop
źródło
1
-3 bajtów: przestrzeń pomiędzy kropli : [ci 'x' elsei10 for
mdahmoune
@mdahmoune Dzięki za zauważenie, nie mogę sobie przypomnieć, co można zmiażdżyć razem.
Gigaflop,
8
Ogólna zasada praktyczna: w zasadzie wszystko oprócz dwóch liter można zgnieść razem. Jeśli pojawi się błąd składniowy, dodaj losowe spacje, aż
zadziała
Istnieją pewne wyjątki, takie jak <number>e, <letter><number>, f'.
user202729,
3
59 bajtów zastępując 10 O i odczyt każdego znaku jako podstawy 11 Int: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
ov
3

Haskell , 98 bajtów

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 _=[[]]

Wypróbuj online lub przetestuj wszystko!

Wyjaśnienie

Funkcja swykonuje wszystkie możliwe podziały, na przykład: "1010"staje się [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], zwróć uwagę na to, jak najdłuższe podziały kończą się na początku (ponieważ 1:0:ywystępuje wcześniej 10:y).

Mając to na uwadze, możemy wziąć wszystkie te wartości i odfiltrować ys, gdzie y == take n yzachowane są również podziały krótsze niż wymagane. Na przykład 4pozostawiamy tę samą listę [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

Teraz możemy po prostu pobrać pierwszy element z tej listy, ponieważ dane wejściowe zawsze będą poprawne (np. 5!"1010"Też dadzą [1,0,1,0], ale nie musimy sobie z tym poradzić).

Uwaga: jakoś przeliczyłem ... y==take n yma taką samą długość jak length y==n: S

ბიმო
źródło
2

Czysty , 128 bajtów

import StdEnv
@[]=[[]]
@['10':t]=[u++v\\u<-[[10],[1,0]],v<- @t];@[h:t]=[[digitToInt h:v]\\v<- @t]
?n l=hd[e\\e<- @l|length e==n]

Wypróbuj online!

Obrzydliwe
źródło
2

05AB1E , 13 bajtów

.œsù.ΔïTÝÃJ¹Q

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

.œ              # partitions of the first input
  sù            # of a length equal to the second input
    .Δ          # find the first partition that returns true when:
      ï         # each element is converted to integer
       TÝÃ      # and only numbers in [0 ... 10] are kept
          J     # then join it together
           ¹Q   # and compare it to the first input for equality
Emigna
źródło
2

JavaScript (węzeł Babel) ,  70 69  59 bajtów

Pobiera dane wejściowe jako (n)(line).

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

Wypróbuj online!

Skomentował

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 bajtów

Zapisano 5 bajtów dzięki @ guest271314

Pobiera dane wejściowe jako (n)(line).

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

Wypróbuj online!

Skomentował

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
Arnauld
źródło
Dlaczego dane wyjściowe dla N = 3 i wiersza = „1010” dotyczą typów mieszanych [1, 0, „10”]?
mdahmoune
s.match()zwraca tablicę ciągów, ale a "10"może być podzielone na [1,0](2 liczby całkowite) w funkcji wywołania zwrotnego flatMap().
Arnauld
1
Możemy wymusić wszystko na liczbach całkowitych dla +1 bajtu .
Arnauld
59 bajtóweval(`[${s}]`.replace('1,0',10))
guest271314
@ guest271314 Dzięki! Dobry chwyt.
Arnauld
2

Java (OpenJDK 8) , 78 bajtów

Przyjemny jednowarstwowy przy użyciu interfejsu API strumieni.

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

Wypróbuj online!


Jak to działa

(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
Luke Stevens
źródło
2

R , 63 bajty

Chociaż długość łańcucha jest większa niż n, zamień 10 kolejnych, na które sięgasz, ":"(znak ASCII po 9). Następnie podziel na liczby, biorąc wartość ASCII każdego znaku w ciągu.

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

Wypróbuj online!

J.Doe
źródło
1

Czerwony , 91 bajtów

func[n s][while[n < length? s][replace s"10""a"]foreach c s[prin[either c =#"a"[10][c]""]]]

Wypróbuj online!

Galen Iwanow
źródło