แยกตัวอักษรและตัวเลข


15

ย่อหน้าของข้อความประกอบด้วยตัวเลขและตัวอักษรผสมกัน งานของคุณคือการแยกตัวเลขไปทางด้านซ้ายและตัวอักษรตัวอักษรไปทางด้านขวาในลำดับเดียวกันของแต่ละบรรทัด

กฎ:

  1. ตัวเลขเป็นจำนวนเต็มธรรมดา ดังนั้นไม่มีจุดทศนิยมและไม่มีสัญญาณลบ / บวก
  2. ตัวเลขอาจหรือไม่ต่อเนื่องกัน แต่ไม่ว่ากรณีใดก็ตามพวกเขาจะต้องถูกผลักไปทางซ้ายในลำดับเดียวกัน
  3. ตัวเลขอาจเกิดขึ้นระหว่างคำ
  4. ข้อความมีเพียงตัวอักษรและตัวเลขตัวอักษร ASCII เท่านั้นพร้อมด้วยช่องว่างเครื่องหมายขีดล่างเครื่องหมายจุลภาคและจุด
  5. ผู้ที่ทำสิ่งนี้ด้วยการกดแป้นพิมพ์ขั้นต่ำ (เช่นมาโครมาโคร) หรือจำนวนไบต์น้อยที่สุดในกรณีของการเขียนสคริปต์เป็นผู้ชนะ

ข้อความตัวอย่าง:

A word can have any number of text like 433884,
but all the numb89ers has to be moved left side 
but alph6abetical va9lues has to be pas46ted on right side.
The text might con4tain chara29cters s2huffled like hlep or dfeintino or even
meaningless1 words co43mbined togeth81er.

ผลลัพธ์ที่คาดหวัง:

433884A word can have any number of text like ,
89but all the numbers has to be moved left side 
6946but alphabetical values has to be pasted on right side.
4292The text might contain characters shuffled like hlep or dfeintino or even
14381meaningless words combined together.

4
@SibiCoder ยินดีต้อนรับบนเรือแล้ว! คุณอาจต้องการใช้sandboxในครั้งต่อไป มันใช้สำหรับการโพสต์ความท้าทายก่อนทำที่นี่ วิธีการที่คุณจะได้รับการตอบรับจากผู้ใช้อื่น ๆ และเพิ่มความท้าทาย
หลุยส์ Mendo

1
ฉันเชื่อว่าการใช้ตัวอักษรเป็นตัวอักษรหมายถึงตัวอักษรนั้นเป็นลักษณะเฉพาะของภาษาอังกฤษอินเดีย
TRiG

2
@AstroDan ทั้งสองได้รับอนุญาตโดยค่าเริ่มต้น
Adnan

2
ดูเหมือนจะค่อนข้างชัดเจนแล้ว @ close-voters - คุณคิดว่าคุณสามารถถอนการโหวตของคุณตอนนี้หรือไม่?
บาดเจ็บทางดิจิทัล

1
แก้ไขกรณีทดสอบครั้งแรกเนื่องจากไม่มีอะไรมากไปกว่าการพิมพ์ผิด ฉันลงคะแนนเพื่อเปิดโพสต์นี้อีกครั้ง
Bassdrop Cumberwubwubwub

คำตอบ:


11

เรติน่า 14 ไบต์

O%$`\d|(.)
$#1

ลองออนไลน์!

คำอธิบาย

Oแนะนำขั้นตอนการเรียงลำดับ %บอกให้ Retina ใช้การแปลงกับแต่ละบรรทัดแยกกัน $บอกให้เรียงลำดับการแข่งขันตามผลลัพธ์ของการเปลี่ยนตัวที่ระบุ

regex ตัวเองเป็นซึ่งอาจตรงกับหลักหรือสิ่งอื่นซึ่งถูกจับในกลุ่ม\d|(.) 1นี้ถูกแทนที่ด้วยซึ่งเป็นหมายเลขของจับของกลุ่ม$#1 1นั่นคือกุญแจสำคัญในการเรียงลำดับสำหรับตัวเลขเป็นและคีย์การเรียงลำดับสำหรับทุกสิ่งอื่นใดคือ0 1เนื่องจากการเรียงลำดับใน Retina มีความเสถียรเพียงย้ายตัวเลขไปทางซ้ายและทุกอย่างอื่นไปทางขวา


9

05AB1E, 14 10 ไบต์

รหัส:

|vyþyyþ-¶J

คำอธิบาย:

|                 # push all lines in input as array of strings
 v                # for each line in array
  yþ              # push only digits from line
    yyþ-          # push line without digits
        ¶         # push newline char
         J        # join as string
                  # end loop and print explicitly

อินพุตตัวอย่าง:

คำสามารถมีข้อความจำนวนเท่าใดก็ได้เช่น 433884
แต่ผู้ที่ต้องย้ายทั้งหมดต้องเลื่อนไปทางซ้าย
แต่ va9lues ที่มีตัวอักษร 6 ตัวจะต้องมี pas46ted ทางด้านขวา
ข้อความอาจรวมถึง chara29cters s2huffled เช่น hlep หรือ dfeintino หรือแม้กระทั่ง
คำที่ไม่มีความหมาย co43mbined togeth81er

ตัวอย่างผลลัพธ์:

คำ 433884A สามารถมีข้อความจำนวนเท่าใดก็ได้เช่นกัน
89 แต่ต้องย้ายตัวเลขทั้งหมดด้านซ้าย
6946 แต่ต้องเรียงตัวอักษรทางด้านขวา
4292 ข้อความอาจมีตัวอักษรสับเหมือน hlep หรือ dfeintino หรือแม้กระทั่ง
4381 คำที่ไม่มีความหมายรวมกัน

ลองออนไลน์


8

Python 3, 64 ไบต์

สามโซลูชั่นที่เทียบเท่า! ฉันเลือกไม่ได้

while 1:print(*sorted(input(),key=lambda x:-x.isdigit()),sep='')
while 1:print(*sorted(input(),key=lambda x:x<'0'or'9'<x),sep='')
while 1:print(*sorted(input(),key=str.isdigit,reverse=1),sep='')

อีกรุ่นที่มีความยาวเท่ากัน:while 1:print(*sorted(input(),key=lambda x:-('/'<x<':')),sep='')
ผู้บัญชาการ Byte

5

Perl, 17 ไบต์

รหัส 16 ไบต์ + 1 สวิตช์

s/\d/!print$&/ge

-pต้องใช้

การใช้

perl -pe 's/\d/!print$&/ge' <<< 'a1b2c3d4e5f6'
123456abcdef

อีกวิธีหนึ่งคือ:

print/\d/g,/\D/g

-nต้องใช้

การใช้

perl -ne 'print/\d/g,/\D/g' <<< 'a1b2c3d4e5f6'
123456abcdef

1
มันยอดเยี่ยมที่จะเห็นว่าภาษาที่ไม่ใช่กอล์ฟมีความสามารถในการแข่งขันแม้แต่กับภาษากอล์ฟ
DJMcMayhem

@DrGreenEggsandHamDJ ฉันดีใจที่คุณชอบ! ฉันไม่ได้เพิ่มคำตอบมากมาย แต่ฉันชอบคำตอบของคนนี้มาก! นอกจากนี้ฉันแน่ใจว่าบางคนจะจัดประเภท Perl เป็นภาษากอล์ฟเนื่องจากมันอธิบายว่าเขียนเท่านั้น !
Dom Hastings

5

ฮุน , 92 83 ไบต์

|*
*
(turn (lore +<) |=(@ `tape`(welp (skid (trip +<) |=(@ !=(~ (rush +< nud)))))))

++loreแยกสายหลายเส้นเป็น a (list cord), (trip +<)เปลี่ยนเป็นเทป ++skidแยกรายการในสองรายการ: ด้านหนึ่งที่ฟังก์ชันส่งคืนใช่ด้านใดด้านหนึ่งซึ่งส่งกลับค่า no ฟังก์ชั่นของเราพยายามแยกวิเคราะห์อักขระด้วย++nud(ตัวเลข) และตรวจสอบว่ามีการวิเคราะห์คำอย่างสมบูรณ์หรือไม่จากนั้นเราเชื่อมสองรายการกลับเข้าด้วยกันเป็นเทป

> %.
  '''
  A word can have any number of text like 433884,
  but all the numb89ers has to be moved left side 
  but alph6abetical va9lues has to be pas46ted on right side.
  The text might con4tain chara29cters s2huffled like hlep or dfeintino or even
  meaningless1 words co43mbined togeth81er.
  '''
  |*
  *
  (turn (lore +<) |=(@ `tape`(welp (skid (trip +<) |=(@ !=(~ (rush +< nud)))))))
<<
  "433884A word can have any number of text like ,"
  "89but all the numbers has to be moved left side "
  "6946but alphabetical values has to be pasted on right side."
  "4292The text might contain characters shuffled like hlep or dfeintino or even"
  "14381meaningless words combined together."
>>

1
พระเจ้าฉันจะไม่ยอมแพ้ Hoon ♥
ลินน์

4

MATL , 13 12 ไบต์

`jt4Y2m&)hDT

ออกโดยมีข้อผิดพลาด (อนุญาตโดยค่าเริ่มต้น) สร้างเอาต์พุตที่ถูกต้อง

ลองออนไลน์!

คำอธิบาย

`          T    % infinite loop
 j              % input one line as a string
  t             % duplicate
   4Y2          % predefined literal: '0123456789'
      m         % true for elements of string that are digits, false for the rest
       &)       % two-output indexing: push digits, then non-digits
         h      % concatenate the two strings
          D     % display

4

V, 12 ไบต์

òí¨Ä©¨ä©/²±
​

V เป็นภาษาตีกอล์ฟแบบสตริงที่ยังไม่เสร็จสมบูรณ์ แม้ว่ามันจะยังไม่เสร็จ แต่โปรแกรมนี้ใช้งานได้เมื่อวันที่45ซึ่งตีพิมพ์เมื่อคืนที่ผ่านมา (คำตอบ V ก่อนหน้าของฉันส่วนใหญ่ไม่ใช่การแข่งขัน)

หมายเหตุจำเป็นต้องขึ้นบรรทัดใหม่ตามท้ายแม้ว่านี่จะเป็นเพราะบั๊ก

ลองออนไลน์!

คำอธิบาย:

ò            #Recursively, do:
 í           #Substitute on every line
  ¨Ä©¨ä©/²±  #The following regex. 

¨Ä©¨ä©/²± ขยายเข้าไปในกลุ่ม regim:

:%s/\(\D\)\(\d\)/\2\1

ซึ่งไม่ใช่ตัวเลข (\D)แล้วตามด้วยตัวเลข(\d)และสลับมัน

เนื่องจากสิ่งนี้เต็มไปด้วยอักขระ unicode ขั้นต้นนี่คือ hexdump ที่ย้อนกลับได้:

00000000: f2ed a8c4 a9a8 e4a9 2fb2 b10a            ......../...

4
ฉันภูมิใจในคำตอบนี้จริงๆ เมื่อทำงานกับภาษาเพิ่มขึ้นสิ่งนี้อาจสั้นลงได้ 4-5 ไบต์ แต่ก็เจ๋งที่เห็นคุณลักษณะที่ฉันใช้งานจริง ๆ แล้วมีประโยชน์ สิ่งนี้จะไม่ได้ผลในหนึ่งวันที่ผ่านมา = D
DJMcMayhem

3

Javascript ES6, 40 ไบต์

a=>a.replace(/\D/g,'')+a.replace(/\d/g,'')

พยายามแก้ไขปัญหาอื่น ๆ แต่ไม่สามารถทำให้เล็กลงกว่านี้
ความพยายามครั้งแรกของฉันคือa=>[...a.match(/\d/g),...a.match(/\D/g)].join``แต่นั่นก็นานกว่า 5 ไบต์

ลองที่นี่



3

PowerShell v2 +, 55 ไบต์

$args[0]-split"`n"|%{($_-replace'\D')+($_-replace'\d')}

เนื่องจากความต้องการที่จะสนับสนุนอินพุตหลายบรรทัดเราจึงต้องห่อหุ้ม-replaceงบของเราด้วยการวนซ้ำและ-splitขึ้นบรรทัดใหม่ มิฉะนั้นพื้นเทียบเท่ากับการแก้ปัญหา JavaScript


3

Pyth - 11 ไบต์

ไม่ชอบการทดสอบการจัดกลุ่มของฉัน ใช้อินพุตเป็นรายการของเส้นบอกฉันว่าไม่เป็นไร

jms_.g}k`MT

ลองมันออนไลน์ได้ที่นี่


3

Pyth, 16 15 ไบต์

1 ไบต์ขอบคุณที่@FryAmTheEggman

jms+@J`MTd-dJ.z

ลองออนไลน์!

ตัวอย่างอินพุต:

A word can have any number of text like 433884,
but all the numb89ers has to be moved left side 
but alph6abetical va9lues has to be pas46ted on right side.
The text might con4tain chara29cters s2huffled like hlep or dfeintino or even
meaningless1 words co43mbined togeth81er.

ตัวอย่างผลลัพธ์:

433884A word can have any number of text like ,
89but all the numbers has to be moved left side 
6946but alphabetical values has to be pasted on right side.
4292The text might contain characters shuffled like hlep or dfeintino or even
14381meaningless words combined together.

มันทำงานอย่างไร

jms+@J`MTd-dJ.z

 m           .z    for each line (d):
         d           yield d (the line)
     J                 assign J to
        T              [0,1,2,3,...,9]
      `M               with each number converted to string
    @                intersect with J
   +                 append:
          -dJ          filter d for characters not in J
  s                  convert to one string
j                  join by newline

คุณไม่จำเป็นต้องใช้Uเพราะแผนที่จะแปลงจำนวนเต็มเป็นช่วงโดยอัตโนมัติ
FryAmTheEggman

โอ้ขอบคุณสำหรับการเตือน!
Leun Nun

2

เรติน่า 16 ไบต์

การจัดเรียงฟองที่มีเสถียรภาพ

%+`(\D)(\d)
$2$1

ตัวอย่างอินพุต:

A word can have any number of text like 433884,
but all the numb89ers has to be moved left side 
but alph6abetical va9lues has to be pas46ted on right side.
The text might con4tain chara29cters s2huffled like hlep or dfeintino or even
meaningless1 words co43mbined togeth81er.

ตัวอย่างผลลัพธ์:

433884A word can have any number of text like ,
89but all the numbers has to be moved left side 
6946but alphabetical values has to be pasted on right side.
4292The text might contain characters shuffled like hlep or dfeintino or even
14381meaningless words combined together.

ลองออนไลน์!


1
โปรดอัปเดตรหัสของคุณ ตัวเลขอาจมาระหว่างคำ หากคุณมีการปรับปรุงแล้วก็ดี
SibiCoder

2

C #, 59 ไบต์

I=>Regex.Replace(I,"[^0-9]","")+Regex.Replace(I,@"\d+","");

ฟังก์ชั่น C # แลมบ์ดาที่เรียบง่ายโดยใช้ regex

ตัวอย่างผลลัพธ์

433884A word can have any number of text like ,
89but all the numbers has to be moved left side
6946but alphabetical values has to be pasted on right side.
4292The text might contain characters shuffled like hlep or dfeintino or even
14381meaningless words combined together.

2

C # (LINQ), 110 ไบต์

s=>string.join("",s.Where(c=>"0123456789".Contains(c).Concat(s.SelectMany(c=>new[]{c}.Except("0123456789"))));

ไม่ใช่ทางออกที่สั้นที่สุด แต่ฉันคิดว่านี่น่าจะเป็นการใช้งาน LINQ ได้ดี


คล้ายกัน แต่สั้นกว่าเล็กน้อย: string.Join ("", s.Where (c => char.IsDigit (c)). Concat (s.Where (c =>! char.IsDigit (c))));
Marc

@Marc ว้าวผมเคยใช้ภาษานี้เป็นเวลา 5 ปีและผมไม่ทราบว่าchar.IsDigitมีอยู่ ...
นิค Mertin

2

ปัจจัยที่ 61

[ "\n"split [ [ digit? ] partition [ write ] bi@ nl ] each ]

มันเป็นวิธีที่ไร้เดียงสา

"\n"splitแยกสตริงที่ด้านบนของสแต็กเป็นบรรทัด จากนั้นสำหรับeachบรรทัด:

  1. [ digit? ] partition แยกแต่ละบรรทัดเป็นตัวเลขเท่านั้นและไม่ใช่ตัวเลขเท่านั้น
  2. [ write ] bi@ส่งออกทั้งสองและnlพิมพ์ขึ้นบรรทัดใหม่

PS:

เป็นคำ 90 ไบต์ (71 หากคุณแทนที่ชื่อ-factorish-long-long ด้วย 1 ตัวอักษร):

: numbers-to-the-front ( s -- ) "\n"split [ [ digit? ] partition [ write ] bi@ nl ] each ;

2

Pyth, 14 ไบต์

FG.zo_:N"\d"0G

ลองออนไลน์!

คำอธิบาย:

FG             : For every G in ...
  .z           : the-list-where-lines-of-input-are-stored ...
               : (implicitly print)
    o        G : sorted G ...
     _N        : where, a negative key is given ...
       :"\d"0  : to the individual character if it is a digit

ตรรกะของการแก้ปัญหาเป็นเช่นเดียวกับในคำตอบของลินน์


2

Java 8, 130 126 86 ไบต์

a->{for(String s:a)System.out.println(s.replaceAll("\\D","")+s.replaceAll("\\d",""));}

-4 ไบต์การแปลง Java 7 เป็น 8 และการลบอักขระที่ไม่ได้ใช้งาน
-40 ไบต์การแปลงโปรแกรมให้ทำงานและเปลี่ยน[^\\d]เป็น\\D

คำอธิบาย:

ลองที่นี่

a->{                             // Method with String-array parameter and no return-type
  for(String s:a)                //  Loop over the array
    System.out.println(          //   Print with a trailing new-line:
      s.replaceAll("\\D","")     //    All digits,
      +s.replaceAll("\\d",""));  //    plus all non-digits

2

GNU Sed, 28

คะแนนรวม +1 สำหรับ-rตัวเลือกในการระงับ

:
s/([^0-9])([0-9])/\2\1/
t

สลับอักขระที่ไม่ใช่ตัวเลขซ้ำหนึ่งตัวแล้วตามด้วยอักขระหมายเลขหนึ่งจนกว่าจะไม่มีการแทนที่เพิ่มเติม

น่าเศร้าที่ regexes ไม่มี\dหรือ\Dดังนั้นเหล่านี้จะต้องเขียนออกมานาน

Ideone


1

อ็อกเทฟ37 37ไบต์

@(s)disp([s(x=s>47&s<58),s(~x)])

ans('The text might con4tain chara29cters s2huffled like hlep or dfeintino or even')
4292The text might contain characters shuffled like hlep or dfeintino or even

อินพุตสามารถเป็นแบบหลายบรรทัดได้ ดู (ปรับปรุง) ความท้าทาย
หลุยส์ Mendo

1

Clojure, 113 ไบต์

(fn[s](map(fn[x](println(apply str(sort-by #(when-not(Character/isDigit %)1)x))))(clojure.string/split-lines s)))

เรียงลำดับตัวเลขไปที่จุดเริ่มต้นของบรรทัด


1

Oracle SQL 11.2, 131 ไบต์

บรรทัดในสตริงอินพุตถูกคั่นด้วย '¤' วิธีนี้ไม่จำเป็นต้องสร้างตารางเพื่อใช้เป็นอินพุต

A word can have any number of text like 433884but all the numb89ers has to be moved left side ¤but alph6abetical va9lues has to be pas46ted on right sideThe text might con4tain chara29cters s2huffled like hlep or dfeintino or even¤meaningless1 words co43mbined togeth81er.

คำค้นหา:

SELECT REGEXP_REPLACE(COLUMN_VALUE,'[^0-9]')||REGEXP_REPLACE(COLUMN_VALUE,'[0-9]')FROM XMLTABLE(('"'||REPLACE(:1,'¤','","')||'"'));

ยกเลิกแข็งแรงเล่นกอล์ฟ

SELECT REGEXP_REPLACE(COLUMN_VALUE,'[^0-9]')||  -- Every number
       REGEXP_REPLACE(COLUMN_VALUE,'[0-9]')     -- Every character not a number   
FROM   XMLTABLE(('"'||REPLACE(:1,'¤','","')||'"'))  -- Split on ¤


1

Haskell, 60 ไบต์

import Data.List;g(n,l)=n++l;f=g.partition(`elem`['0'..'9'])

การใช้

f "A word can have any number of text like 433884,"

1

Sed, 35 ไบต์

h
s/[0-9]//g
x
s/[^0-9]//g
G
s/\n//

สิ่งนี้ทำสำเนาของบรรทัดลบตัวเลขออกจากหนึ่งสำเนาและตัวอักษรจากอีกอันหนึ่งก่อนที่จะรวมอีกครั้ง


1

Bash ขนาด 42 ไบต์

read a&&echo "${a//[^0-9]}${a//[0-9]}"&&$0

ถูกเตือนว่าการใช้งานแบบเรียกซ้ำนี้ทำให้กระบวนการใหม่สำหรับอินพุตแต่ละบรรทัด!



0

Julia 0.6 , 77 bytes

x->(l=r="";for c=x
c=='\n'?(println(l*r);l=r=""):'/'<c<':'?(l*=c):(r*=c)
end)

ฟังก์ชั่นไม่ระบุชื่อการสตริงและการพิมพ์ออก วนรอบอักขระเพิ่มไปทางซ้ายlหรือขวาrบัฟเฟอร์จนกว่าจะพบบรรทัดใหม่จากนั้นจะพิมพ์และล้างบัฟเฟอร์ จำนวนมากสร้างประโยชน์ที่มีศักยภาพชอบsort,filterและการสร้างดัชนีตรรกะ (การจัดทำดัชนีกับอาร์เรย์ของค่าบูลีน) ที่จะไม่ได้ทำงานในสาย

ลองออนไลน์!


0

เป็นกลุ่ม 30 การกดแป้น

qr:%s/\v(\D+)(\d+)/\2\1/<Enter>@rq@r

บันทึกการค้นหาและแทนที่การกระทำที่ย้ายตัวเลขไปทางซ้ายของไม่ใช่ตัวเลข เรียกแมโครนี้ซ้ำจนกว่าจะเกิดข้อยกเว้นโดยไม่พบรูปแบบ (เมื่อไม่มีตัวเลขทางด้านขวาของตัวเลขที่ไม่ใช่ตัวเลข)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.