Marks Marken aufspalten

21

Herausforderung

Mark ist ein Student, der seine NNoten verkettet in einer einzigen Zeile erhält .

Die Herausforderung besteht darin, seine Marken zu trennen, in dem Wissen, dass jede Marke nur 0oder 1oder 2oder 3oder 4oder 5oder 6oder 7oder 8oder 9oder sein kann 10.

Eingang

N natürliche Zahl und eine Zeile.

Ausgabe

Eine Reihe von natürlichen Zahlen.

Beispiel

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]

Regeln

  • Wenn mehrere Ausgänge möglich sind, geben Sie nur einen Ausgang an.
  • Nur die Wertmarke 10steht auf zwei Dezimalstellen, andere auf einer Dezimalstelle.
  • Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen
  • Keine Notwendigkeit, ungültige Eingaben zu verarbeiten
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
mdahmoune
quelle
Hier ist ein Python-Snippet, mit dem ich die n, 'string'Paare aus dem kopierten Beispieltextblock abgerufen habe:spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop
3
Bitte einige Kommentare für Abstimmungen ...
mdahmoune
Downvotes müssen nicht ohne Grund kommentiert werden. An dieser Herausforderung kann nichts verbessert werden.
User202729
Also mach dir keine Sorgen.
User202729
Müssen sich die Ausgänge in derselben Reihenfolge wie die Eingänge befinden?

Antworten:

6

Brachylog , 23 21 Bytes

-2 Bytes dank Fatalize

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

Probieren Sie es online!

Der Eingang ist ein Paar [Line, N].

Dies ist mein erstes Brachylog-Programm, daher gibt es wahrscheinlich viel Raum für Verbesserungen.

Es ist sehr langsam, wenn die Länge der Linie> 7 ist.

Erläuterung:

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 

(*) ịṫ?prüft, dass keine führenden Nullen vorhanden sind. Es konvertiert die Zeichenfolge in eine Ganzzahl und dann zurück in eine Zeichenfolge und vergleicht sie mit der ursprünglichen Zeichenfolge.

fergusq
quelle
Sie müssen die Zahl nicht als Zeichenfolge eingeben, sondern verwenden nur eine Ganzzahl. Dies verringert die Notwendigkeit für alle diejenigen , und für den führenden Null - Check: h~c.{ℕ≤10}ᵛ&t~l. Dies ist wahrscheinlich langsamer, da die Dekonkatenation von Ganzzahlen auch für unbekannte Ganzzahlen durch Einschränkungen funktionieren muss, was sie ineffizient macht.
Fatalize
(Beachten Sie auch, dass die Verwendung von hund t, um das erste / letzte Element zu erhalten, effizienter ist als die Verwendung für beide (was in den meisten Programmen nicht einmal funktioniert).
Fatalize
@Fatalize Ich habe verstanden, dass die Eingabezeile führende Nullen enthalten kann, daher wäre es nicht möglich, eine Ganzzahl als Eingabe zu verwenden.
Fergusq
Richtig, das ist ärgerlich ...
Fatalize
5

Perl 6 , 25 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der eine Zahl und eine Zeichenfolge akzeptiert und als Match-Objekt zurückgibt.

Erläuterung:

->\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
Scherzen
quelle
5

Python 3 , 47 Bytes

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

Probieren Sie es online!

Nimmt die "eine Zeile" als Bytestring mit unformatierten Bytes \x00 - \x09. Wenn es nicht akzeptabel ist:

Python 3 , 56 Bytes

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

Probieren Sie es online!

Nimmt "eine Zeile" als Bytestring.

Bubbler
quelle
5

V , 17 , 12 Bytes

\ÓòÀGjí1“î…0

Probieren Sie es online!

Ich war mit 17 Bytes zufrieden, aber als 05AB1E mit 13 einherging, konnte ich eine Herausforderung nicht unbeantwortet lassen. : 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

Alternative Lösung:

\ÓòÀGjç1î0/J

Leider ersetzt dies 10mit1 0

DJMcMayhem
quelle
4

Ruby , 57 Bytes

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

Probieren Sie es online!

Dies mag sich als nicht die golferischste Herangehensweise herausstellen, aber es scheint eine unterhaltsame Idee zu sein, vorübergehend 10ein Hex zu ersetzen A, was im Übrigen auch eine gute Note ist (wenn wir das AF-Bewertungssystem berücksichtigen :)).

Kirill L.
quelle
4

Haskell , 68 Bytes

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

Probieren Sie es online!

Nehmen Sie sich gierig 10 Sekunden Zeit, solange mehr Ziffern als Zeichen übrig sind.

Nitrodon
quelle
4

Python 3 , 71 68 59 Bytes

dank ovs nochmal 9 bytes runter.

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

Probieren Sie es online!

Ich habe ursprünglich versucht, str.partition()rekursiv zu verwenden , aber die Verwendung replacehat mich nicht allzu lange danach ins Gesicht geschlagen. Kann jemand dies verbessern?

Hier ist auch ein TIO-Link, den ich verwendet habe, um die Testfälle in etwas kopierbareres / einfügbareres zu verwandeln

Gigaflop
quelle
1
-3 Bytes: drop Raum zwischen : [cund 'x' elseund10 for
mdahmoune
@mdahmoune Danke fürs mitbekommen, mir fällt es schwer, mich daran zu erinnern, was man zusammenquetschen kann.
Gigaflop
8
Allgemeine Faustregel: Grundsätzlich kann alles außer zwei Buchstaben zusammengequetscht werden. Wenn Sie einen Syntaxfehler erhalten, fügen Sie zufällige Leerzeichen hinzu, bis es funktioniert :)
Quintec
Es gibt einige Ausnahmen, wie <number>e, <letter><number>, f'.
User202729
3
59 Bytes , die durch 10 mit einem Ersetzen und jedes Zeichen als Ausgangspunkt 11 int Lese: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
Ovs
3

Haskell , 98 Bytes

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

Probieren Sie es online aus oder testen Sie alle!

Erläuterung

Die Funktion sführt alle möglichen Teilungen durch, zum Beispiel: "1010"wird [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], notieren Sie, wie die längsten Teilungen am Anfang enden (weil 1:0:yvorher kommt 10:y).

In diesem Sinne können wir alle diese Werte nehmen und die ys herausfiltern, y == take n ywodurch auch Teilungen erhalten bleiben, die kürzer als erforderlich sind. Zum Beispiel mit lassen 4wir die Liste gleich [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

Jetzt können wir nur das erste Element in dieser Liste erhalten, da die Eingaben immer gültig sind (z. B. 5!"1010"würde auch geben [1,0,1,0], aber wir müssen nicht damit umgehen).

Hinweis: Ich habe irgendwie falsch gezählt. Hat y==take n ydie gleiche Länge wie length y==n: S

ბიმო
quelle
2

Sauber , 128 Bytes

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]

Probieren Sie es online!

Οurous
quelle
2

05AB1E , 13 Bytes

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

Probieren Sie es online! oder als Test Suite

Erläuterung

.œ              # 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
quelle
2

JavaScript (Babel Node) ,  70 69  59 Bytes

Übernimmt die Eingabe als (n)(line).

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

Probieren Sie es online!

Kommentiert

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 Bytes

5 Bytes dank @ guest271314 gespeichert

Übernimmt die Eingabe als (n)(line).

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

Probieren Sie es online!

Kommentiert

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
quelle
Warum ist die Ausgabe für N = 3 und line = '1010' mit gemischten Typen [1, 0, '10']?
Mdahmoune
s.match()gibt ein Array von Strings zurück, aber a "10"kann [1,0]in der Callback-Funktion von in (2 Integer) aufgeteilt werden flatMap().
Arnauld
1
Wir können alles in ganze Zahlen für +1 Byte umwandeln .
Arnauld
59 Byteseval(`[${s}]`.replace('1,0',10))
guest271314
@ guest271314 Danke! Schöner Fang.
Arnauld
2

Java (OpenJDK 8) , 78 Byte

Ein netter Einzeiler mit der Streams-API.

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

Probieren Sie es online!


Wie es funktioniert

(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
quelle
2

R , 63 Bytes

nErsetzen Sie die nächsten 10, die Sie für ein ":"(das ASCII-Zeichen nach 9) erreichen, während die Länge der Zeichenfolge größer als ist . Teilen Sie dann die Zeichen in Zahlen auf, indem Sie den ASCII-Wert jedes Zeichens in der Zeichenfolge verwenden.

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

Probieren Sie es online!

J.Doe
quelle
1

Rot , 91 Bytes

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

Probieren Sie es online!

Galen Ivanov
quelle