เครื่องหมายแยก


21

ท้าทาย

Mark เป็นนักเรียนที่ได้รับNคะแนนของเขาในแบบเรียงต่อกันในบรรทัดเดียว

ความท้าทายคือการแยกเครื่องหมายของเขารู้ว่าแต่ละเครื่องหมายเท่านั้นสามารถ0หรือ1หรือ2หรือ3หรือ4หรือ5หรือ6หรือ7หรือ8หรือหรือ910

อินพุต

N จำนวนธรรมชาติและหนึ่งบรรทัด

เอาท์พุต

ชุดของตัวเลขธรรมชาติ

ตัวอย่าง

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]

กฎระเบียบ

  • เมื่อเป็นไปได้หลายเอาต์พุตให้ส่งออกเพียงครั้งเดียว
  • เฉพาะเครื่องหมายของค่าที่10เป็นทศนิยมสองตำแหน่งส่วนที่เหลือเป็นทศนิยมหนึ่ง
  • อินพุตและเอาต์พุตสามารถกำหนดได้ในรูปแบบที่สะดวก
  • ไม่จำเป็นต้องจัดการอินพุตที่ไม่ถูกต้อง
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดรวมลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

นี่เป็นตัวอย่างของ Python ที่ฉันใช้เพื่อรับทั้งn, 'string'คู่จากบล็อคข้อความตัวอย่างที่spl = [item.split('-')[0] for item in text.split('\n')]
คัดลอกมา

3
Plz ความคิดเห็นบางส่วนสำหรับการลงคะแนน ...
mdahmoune

Downvotes ไม่ต้องการออกความคิดเห็นด้วยเหตุผล ไม่มีอะไรที่สามารถปรับปรุงเกี่ยวกับความท้าทายนี้ได้
user202729

ดังนั้นไม่ต้องกังวลกับมัน
user202729

เอาต์พุตจำเป็นต้องเรียงตามลำดับเดียวกันกับอินพุตหรือไม่?

คำตอบ:


6

Brachylog , 23 21 ไบต์

-2 ไบต์ต้องขอบคุณ Fatalize

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. นี่อาจจะช้ากว่านี้เนื่องจาก deconcatenation ในจำนวนเต็มต้องทำงานได้แม้กระทั่งจำนวนเต็มที่ไม่รู้จักผ่านข้อ จำกัด ซึ่งทำให้ไม่มีประสิทธิภาพ
ทำให้เสียชีวิต

(โปรดทราบว่าการใช้hและtเพื่อให้องค์ประกอบแรก / สุดท้ายมีประสิทธิภาพมากกว่าการใช้สำหรับทั้งสองอย่าง (ซึ่งในโปรแกรมส่วนใหญ่จะไม่ทำงาน))
ทำให้เสียชีวิต

@ สรุปฉันเข้าใจว่าบรรทัดอินพุตสามารถมีเลขศูนย์นำหน้าดังนั้นจึงไม่สามารถใช้จำนวนเต็มเป็นอินพุตได้
fergusq

ใช่มันน่ารำคาญ…
เสียชีวิต

5

Perl 6 , 25 ไบต์

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

ลองออนไลน์!

รหัสบล็อกที่ไม่ระบุชื่อที่ใช้ตัวเลขและสตริงและส่งกลับเป็นวัตถุที่ตรงกัน

คำอธิบาย:

->\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 ไบต์

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

ลองออนไลน์!

เตะ "หนึ่งบรรทัด" เป็น bytestring \x00 - \x09กับไบต์ดิบ หากไม่เป็นที่ยอมรับ:

Python 3 , 56 ไบต์

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

ลองออนไลน์!

ใช้ "หนึ่งบรรทัด" เป็นการทดสอบ


5

V , 17 , 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

น่าเสียดายที่สิ่งนี้มาแทนที่10ด้วย1 0


4

ทับทิม , 57 ไบต์

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

ลองออนไลน์!

นี่อาจเป็นวิธีที่ไม่ใช่ golfiest แต่ดูเหมือนความคิดที่สนุกที่จะใช้แทน10hex ชั่วคราวAซึ่งเป็นเครื่องหมายที่สูงโดยบังเอิญ (ถ้าเราพิจารณาระบบการให้เกรด AF :)


4

Haskell , 68 ไบต์

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

ลองออนไลน์!

อย่างตะกละตะกลามใช้เวลา 10 วินาทีตราบใดที่ยังมีตัวเลขมากกว่าเครื่องหมายที่เหลืออยู่



4

Python 3 , 71 68 59 ไบต์

ลดลงอีก 9 ไบต์ด้วย ovs

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 ขอบคุณที่สังเกตฉันมีเวลาที่ยากลำบากในการจำสิ่งที่สามารถ squished ด้วยกัน
Gigaflop

8
กฎทั่วไปของหัวแม่มือ: โดยทั่วไปอะไรก็ได้ยกเว้นตัวอักษรสองตัวสามารถถูกบีบเข้าด้วยกัน หากคุณได้รับข้อผิดพลาดทางไวยากรณ์ให้เพิ่มการเว้นวรรคแบบสุ่มจนกว่าจะได้ผล :)
Quintec

มีข้อยกเว้นบางอย่างเช่น<number>e, ,<letter><number> f'
user202729

3
59 ไบต์โดยการแทนที่ด้วย 10 และการอ่านตัวละครแต่ละตัวเป็นฐาน 11 lambda n,s:[int(c,11)for c in s.replace('10','a',len(s)-n)]int:
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]เช่นกัน แต่เราไม่จำเป็นต้องจัดการมัน)

หมายเหตุ:ฉันผิดไปอย่างใดอย่างหนึ่ง .. y==take n yมีความยาวเท่ากับlength y==n: S




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 (โหนดบาเบล) ,  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 ไบต์

บันทึก 5 ไบต์ขอบคุณ @ guest271314

(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()ส่งกลับอาร์เรย์ของสตริง แต่"10"อาจจะแยกออกเป็น[1,0](2 จำนวนเต็ม) flatMap()ในฟังก์ชั่นการโทรกลับของ
Arnauld

1
เราสามารถบีบบังคับทุกอย่างเพื่อจำนวนเต็มสำหรับ1 ไบต์
Arnauld

59 ไบต์ eval(`[${s}]`.replace('1,0',10))
แขก 271314

@ guest271314 ขอบคุณ! รับได้สวย.
Arnauld

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 ถัดไปที่คุณไปถึง":"(ตัวอักษร ASCII หลัง 9) จากนั้นแบ่งออกเป็นตัวเลขโดยการใช้ค่า 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.