Tanda mark split


21

Tantangan

Mark adalah seorang siswa yang menerima Nnilai - nilainya secara serentak dalam satu baris.

Tantangannya adalah untuk memisahkan tanda, mengetahui bahwa setiap tanda hanya bisa 0atau 1atau 2atau 3atau 4atau 5atau 6atau 7atau 8atau 9atau 10.

Memasukkan

N bilangan alami dan satu baris.

Keluaran

Satu set angka alami.

Contoh

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]

Aturan

  • Ketika beberapa output dimungkinkan, berikan hanya satu output.
  • Hanya tanda nilai 10pada dua desimal, yang lain pada satu desimal.
  • Input dan output dapat diberikan dalam format apa pun yang nyaman
  • Tidak perlu menangani input yang tidak valid
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Berikut cuplikan Python yang saya gunakan untuk mendapatkan n, 'string'pasangan dari blok teks contoh copypasted:spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop


Downvotes tidak perlu meninggalkan komentar karena suatu alasan. Tidak ada yang dapat diperbaiki tentang tantangan ini.
user202729

Jadi jangan khawatir tentang itu.
user202729

Apakah output harus dalam urutan yang sama dengan input?

Jawaban:


6

Brachylog , 23 21 byte

-2 byte berkat Fatalize

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

Cobalah online!

Masukan adalah pasangan [Line, N].

Ini adalah program Brachylog pertama saya, jadi mungkin ada banyak ruang untuk perbaikan.

Sangat lambat ketika panjang garis> 7.

Penjelasan:

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 

(*) ịṫ?memeriksa bahwa tidak ada nol di depan. Ini mengkonversi string ke integer dan kemudian kembali ke string dan membandingkannya dengan string asli.


Anda tidak perlu memasukkan angka sebagai string, cukup gunakan bilangan bulat. Ini mengurangi kebutuhan bagi semua orang dan untuk nol cek terkemuka: h~c.{ℕ≤10}ᵛ&t~l. Ini mungkin lebih lambat meskipun sebagai deconcatenation pada bilangan bulat harus bekerja bahkan untuk bilangan bulat yang tidak diketahui melalui kendala, yang membuatnya tidak efisien.
Fatalkan

(Perhatikan juga bahwa menggunakan hdan tmendapatkan elemen pertama / terakhir lebih efisien daripada menggunakan untuk keduanya (yang dalam sebagian besar program bahkan tidak akan bekerja)).
Fatalkan

@Fatalize Saya mengerti bahwa jalur input dapat berisi angka nol di depan, jadi tidak mungkin menggunakan integer sebagai input.
fergusq

Benar, itu menyebalkan ...
Fatalkan

5

Perl 6 , 25 byte

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

Cobalah online!

Blok kode anonim yang mengambil angka dan string dan kembali sebagai objek Pencocokan.

Penjelasan:

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

Python 3 , 47 byte

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

Cobalah online!

Mengambil "satu baris" sebagai bytestring dengan byte mentah \x00 - \x09. Jika tidak dapat diterima:

Python 3 , 56 byte

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

Cobalah online!

Mengambil "satu baris" sebagai bytestring.


5

V , 17 , 12 byte

\ÓòÀGjí1“î…0

Cobalah online!

Saya puas dengan 17 byte, tetapi dari 05AB1E datang dengan 13 byte, dan saya tidak bisa membiarkan tantangan tidak terjawab. : 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

Solusi alternatif:

\ÓòÀGjç1î0/J

Sayangnya, ini diganti 10dengan1 0


4

Ruby , 57 byte

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

Cobalah online!

Ini mungkin berubah menjadi bukan pendekatan golf, tetapi sepertinya ide yang menyenangkan untuk sementara menggantikan 10hex A, yang notabene juga merupakan nilai tinggi (jika kita mempertimbangkan sistem penilaian AF :))


4

Haskell , 68 byte

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

Cobalah online!

Dengan rakus butuh 10-an asalkan ada lebih banyak digit daripada tanda tersisa.



4

Python 3 , 71 68 59 byte

turun 9 byte berkat ovs.

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

Cobalah online!

Awalnya saya mencoba menggunakan str.partition()secara rekursif, tetapi menggunakan replacememukul wajah saya tidak lama kemudian. Adakah yang bisa memperbaiki ini?

Juga, inilah tautan TIO yang saya gunakan untuk menjadikan kasus uji menjadi sesuatu yang lebih mudah disalin / ditempel


1
-3 byte: ruang jatuh antara : [cdan 'x' elsedan10 for
mdahmoune

@mdahmoune Terima kasih telah memperhatikan, Saya kesulitan mengingat apa yang bisa disatukan.
Gigaflop

8
Aturan umum: Pada dasarnya apa pun kecuali dua huruf dapat disatukan. Jika Anda mendapatkan kesalahan sintaksis, tambahkan spasi acak hingga berhasil :)
Quintec

Ada beberapa pengecualian seperti <number>e, <letter><number>, f'.
user202729

3
59 byte dengan mengganti 10 dengan dan membaca setiap karakter sebagai dasar 11 int: lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)].
Ovs

3

Haskell , 98 byte

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

Cobalah online atau uji semua!

Penjelasan

Fungsi smelakukan semua kemungkinan pemisahan, misalnya: "1010"menjadi [[1,0,1,0],[10,1,0],[1,0,10],[10,10]], perhatikan bagaimana pemisahan terpanjang berakhir di awal (karena 1:0:yterjadi sebelumnya 10:y).

Dengan mengingat hal itu, kita dapat mengambil semua nilai ini dan memfilter ys di tempat y == take n yyang juga menyimpan pemisahan yang lebih pendek dari yang dibutuhkan. Misalnya dengan 4kita biarkan daftarnya sama [[1,0,1,0],[10,1,0],[1,0,10],[10,10]].

Sekarang kita bisa mendapatkan elemen pertama dalam daftar itu karena input akan selalu valid (mis. 5!"1010"Akan memberi [1,0,1,0]juga, tetapi kita tidak perlu menanganinya).

Catatan: Saya entah bagaimana salah hitung .. y==take n ypanjangnya sama dengan length y==n: S



2

Bersihkan , 128 byte

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]

Cobalah online!


2

05AB1E , 13 byte

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

Cobalah online! atau sebagai Test Suite

Penjelasan

.œ              # 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 Node) ,  70 69  59 byte

Mengambil input sebagai (n)(line).

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

Cobalah online!

Berkomentar

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 byte

Disimpan 5 byte berkat @ guest271314

Mengambil input sebagai (n)(line).

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

Cobalah online!

Berkomentar

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

Mengapa output untuk N = 3 dan baris = '1010' adalah dengan tipe campuran [1, 0, '10']?
mdahmoune

s.match()mengembalikan array string tetapi "10"dapat dibagi menjadi [1,0](2 bilangan bulat) dalam fungsi panggilan balik dari flatMap().
Arnauld

1
Kami dapat memaksa semuanya ke integer untuk +1 byte .
Arnauld

59 byteeval(`[${s}]`.replace('1,0',10))
tamu271314

@ guest271314 Terima kasih! Tangkapan bagus.
Arnauld

2

Java (OpenJDK 8) , 78 byte

Satu garis yang bagus menggunakan stream API.

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

Cobalah online!


Bagaimana itu bekerja

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

Sementara panjang string lebih besar dari n, gantikan 10 berikutnya yang Anda raih untuk ":"(karakter ASCII setelah 9). Kemudian dibagi menjadi angka-angka dengan mengambil nilai ASCII dari masing-masing karakter dalam string.

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

Cobalah online!



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.