Mark'ın işaretlerini böl


21

Meydan okuma

Mark, Nnotlarını tek bir satırda bitiştirilmiş şekilde alan bir öğrencidir .

Buradaki zorluk, her marka sadece olabilir bilerek onun işaretleri ayırmaktır 0ya 1ya 2ya 3ya 4ya 5ya 6ya 7ya 8ya 9ya 10.

Giriş

N doğal sayı ve bir satır.

Çıktı

Bir dizi doğal sayı.

Örnek

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]

kurallar

  • Birkaç çıkış mümkün olduğunda sadece bir çıkış verin.
  • Yalnızca değer işareti 10iki ondalık basamakta, diğerleri bir ondalık basamaktadır.
  • Giriş ve çıkış herhangi bir uygun formatta verilebilir
  • Geçersiz girişi işlemeye gerek yok
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlevse, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle normal golf kurallarının tümü geçerli olur ve en kısa kod (bayt cinsinden) kazanır.

İşte ben n, 'string'kopyalanan örnek metin bloğundan çiftleri almak için kullanılan bir Python pasajı :spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop

3
Plz aşağı oylar için bazı yorumlar ...
mdahmoune

Alt oylar, bir sebepten dolayı yorum bırakmayı gerektirmez. Bu konuda geliştirilebilecek bir şey yok.
user202729

Bu yüzden endişelenme.
user202729

Çıkışların girişle aynı sırada mı olması gerekiyor?

Yanıtlar:


6

Brachylog , 23 21 bayt

Fatalize sayesinde -2 bayt

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

Çevrimiçi deneyin!

Giriş bir çift [Line, N].

Bu benim ilk Brachylog programım, bu yüzden muhtemelen iyileştirme için çok yer var.

Çizginin uzunluğu> 7 olduğunda çok yavaştır.

Açıklama:

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 

(*) ịṫ?baştaki sıfır olmadığını kontrol eder. Dizeyi tamsayıya dönüştürür ve sonra dizeye geri döndürür ve orijinal dizeyle karşılaştırır.


Sayıyı bir dize olarak girmenize gerek yoktur, sadece bir tamsayı kullanın. Onca ihtiyacını azaltır ve lider sıfır kontrolü için: h~c.{ℕ≤10}ᵛ&t~l. Bu muhtemelen daha yavaş olsa da, tamsayılar üzerindeki temizlik, kısıtlamalar yoluyla bilinmeyen tamsayılar için bile çalışmalıdır, bu da onu yetersiz kılar.
7'de ölümle sonuçlandı

(Ayrıca , ilk / son öğeyi kullanmanın hve telde etmenin her ikisinden de daha etkili olduğunu unutmayın (çoğu programda bile çalışmaz).
7'de ölümle sonuçlandı

@Faltalize Giriş satırının baştaki sıfır içerebileceğini anladım, bu nedenle giriş olarak bir tamsayı kullanmak mümkün olmayacaktı.
fergusq

Tamam, bu can sıkıcı…
18'de

5

Perl 6 , 25 bayt

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

Çevrimiçi deneyin!

Sayı ve dize alan ve bir Eşleme nesnesi olarak dönen adsız kod bloğu.

Açıklama:

->\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 bayt

\ÓòÀGjí1“î…0

Çevrimiçi deneyin!

17 bayttan memnundum ama 05AB1E'den fazlası 13'le geldi ve bir mücadelenin cevapsız kalmasına izin veremedim. : 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

Alternatif çözüm:

\ÓòÀGjç1î0/J

Ne yazık ki, bu cümledeki 10ile1 0


4

Ruby , 57 bayt

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

Çevrimiçi deneyin!

Bu değil golfiest yaklaşım haline gelmek olabilir, ama geçici olarak yerine eğlenceli bir fikir gibi görünüyor 10bir onaltılık için Atesadüfen aynı zamanda yüksek bir işareti olduğunu, (biz :) AF derecelendirme sistemini düşünecek olursak)


4

Haskell , 68 bayt

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

Çevrimiçi deneyin!

Kalan işaretlerden daha fazla basamak olduğu sürece, açgözlülükle 10 saniye sürebilir.



4

Python 3 , 71 68 59 bayt

ovs sayesinde 9 byte daha azaldı.

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

Çevrimiçi deneyin!

Başlangıçta str.partition()özyinelemeli kullanmaya çalışıyordum , ama çok geçmeden suratımdan aşağı sıçradım replace. Bunu geliştirebilecek biri var mı?

Ayrıca, test senaryolarını daha kopyalanabilir / yapıştırılabilir hale getirmek için kullandığım bir TIO bağlantısı


1
-3 bayt: damla alanı arasında : [cve 'x' elseve10 for
mdahmoune

@mdahmoune Fark ettiğiniz için teşekkürler, neyin birlikte ezileceğini hatırlamakta zorlanıyorum.
Gigaflop

8
Genel kural: Temel olarak iki harf hariç her şey birlikte ezilebilir. Bir sözdizimi hatası alırsanız, çalışana kadar rasgele boşluk ekleyin :)
Quintec

Gibi bazı istisnalar vardır <number>e, <letter><number>, f'.
user202729

3
Bir ile 10 değiştirilmesi ve bir baz 11 int her karakter okuyarak 59 bayt: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
ovs

3

Haskell , 98 bayt

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

Çevrimiçi deneyin ya da hepsini test edin!

açıklama

İşlev s, tüm olası bölmeleri yapar, örneğin: "1010"olur [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], en uzun bölmelerin en baştan nasıl bittiğine dikkat edin (çünkü 1:0:ydaha önce gelir 10:y).

Bunu göz önünde bulundurarak, tüm bu değerleri alabilir ve ayırıcıları gerektiğinden daha kısa tutan yyerleri filtreleyebiliriz y == take n y. Örneğin4 listeyi aynı bırakıyoruz [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

Girişler her zaman geçerli olacak çünkü Şimdi sadece (o listedeki ilk elemanını alabilirsiniz mesela. 5!"1010"Verecekti[1,0,1,0] de, ama biz bunu ele almak gerekmez).

Not: Bir şekilde yanlış sayıldım .. y==take n yaynı uzunluktadır length y==n: S




2

05AB1E , 13 bayt

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

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

2

JavaScript (Babel Düğümü) ,  70 69  59 bayt

Girişi olarak alır (n)(line).

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

@ Guest271314 sayesinde 5 bayt kaydedildi

Girişi olarak alır (n)(line).

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

Çevrimiçi deneyin!

Yorumlananlar

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 ve satır = '1010' çıktısı neden karışık tipte [1, 0, '10']?
mdahmoune

s.match()bir dizge dizisi döndürür fakat a , geri çağırma işlevinde (2 tam sayı) 'ya "10"ayrılabilir . [1,0]flatMap()
Arnauld

1
Her şeyi +1 bayt için tamsayılara zorlayabiliriz .
Arnauld

59 bayteval(`[${s}]`.replace('1,0',10))
misafir 271314

@ guest271314 Teşekkürler! İyi yakaladın.
Arnauld

2

Java (OpenJDK 8) , 78 bayt

Streams API kullanarak güzel bir astar.

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

Çevrimiçi deneyin!


Nasıl çalışır

(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 bayt

Dize uzunluğu daha büyük olsa da n, bir sonraki (10'dan ":"sonra ASCII karakteri) için ulaştığınız sonraki 10 yerine . Daha sonra dizedeki her karakterin ASCII değerini alarak sayılara bölün.

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

Çevrimiçi deneyin!



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.