スプリットマークのマーク


21

チャレンジ

マークは、N単一の行で連結された方法でマークを受け取る学生です。

課題は、各マークが唯一できることを知って、彼のマークを分離することである0か、1または2または3または4または5または6または7または8または9または10

入力

N 自然数と1行。

出力

自然数のセット。

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]

ルール

  • 複数の出力が可能な場合、出力は1つだけにしてください。
  • 値のマークのみが10小数点以下2桁で、その他は小数点以下1桁です。
  • 入力と出力は任意の便利な形式で指定できます
  • 無効な入力を処理する必要はありません
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

n, 'string'コピーペーストされたサンプルテキストブロックからペアを取得するために使用したPythonスニペットを次に示します。spl = [item.split('-')[0] for item in text.split('\n')]
Gigaflop

3
投票数に対するいくつかのコメント...
mdahmoune

Downvotesは、理由をコメントにする必要はありません。この課題について改善できるものは何もありません。
user202729

心配しないでください。
user202729

出力は入力と同じ順序である必要がありますか?

回答:


6

Brachylog23 21バイト

Fatalizeのおかげで-2バイト

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。ただし、制約による未知の整数でも整数の連結解除が機能する必要があるため、これはおそらく遅くなり、非効率になります。
18年

(また、最初と最後の要素を取得するためにhtを使用することは、両方に使用するよりも効率的であることに注意してください(ほとんどのプログラムでは機能しません)。
18年

@Fatalize入力行に先行ゼロを含めることができるため、整数を入力として使用することはできないことを理解しました。
fergusq

そう、迷惑だ…
18年



5

V17、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

残念ながら、これは置き換え101 0





4

Pythonの371の68 59バイト

ovsにより、さらに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
一般的な経験則:基本的に、2文字を除いて何でも一緒に押しつぶすことができます。あなたは構文エラーを取得する場合、それが動作するまで、ランダムにスペースを追加します:)
Quintec

以下のようないくつかの例外があります<number>e<letter><number>f'
user202729

3
10をaに置き換え、各文字をベース11 int:として読み取ることにより、59バイトlambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]
ovs

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]もありますが、処理する必要はありません)。

注:私はどういうわけか誤算しました。. :S y==take n yと同じ長さlength y==nです




2

05AB1E、13バイト

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

オンラインでお試しください! またはテストスイートとして

説明

.œ              # 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ノード) 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バイト

@ guest271314のおかげで5バイト節約

入力をとして受け取ります(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()は文字列の配列を返しますが、のコールバック関数では(2つの整数)に"10"分割できます。[1,0]flatMap()
アーナウルド

1
すべてを+1バイトの整数に強制できます
アーナウルド

59バイトeval(`[${s}]`.replace('1,0',10))
-guest271314

@ 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をa ":"(9の後のASCII文字)に置き換えます。次に、文字列内の各文字のASCII値を取得して数値に分割します。

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

オンラインでお試しください!



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.