ตัดตัวอักษรต่อเนื่องยาวเป็น n


14

ความท้าทาย

รับค่าอินพุตสตริงและเลขจำนวนเต็มn - ตัดส่วนที่เหลือของอักขระที่อยู่ติดกันให้เหลือความยาวสูงสุดn ตัวละครสามารถเป็นอะไรก็ได้รวมถึงตัวละครพิเศษ ฟังก์ชันควรคำนึงถึงขนาดตัวพิมพ์และnสามารถอยู่ในช่วงตั้งแต่ 0 ถึงไม่ จำกัด

ตัวอย่างอินพุต / เอาท์พุต:

f("aaaaaaabbbccCCCcc", 2) //"aabbccCCcc" 
f("aaabbbc", 1) //"abc"
f("abcdefg", 0) //""
f("aaaaaaabccccccccCCCCCC@", 4) //"aaaabccccCCCC@"

เกณฑ์การให้คะแนน

การให้คะแนนขึ้นอยู่กับจำนวนไบต์ที่ใช้ ดังนั้น

function f(s,n){return s.replace(new RegExp("(.)\\1{"+n+",}","g"),function(x){return x.substr(0, n);});}

จะ 104 คะแนน

มีความสุขในการเล่นกอล์ฟ!

แก้ไข: ลบข้อ จำกัด ด้านภาษา แต่ฉันก็ยังอยากเห็นคำตอบจาวาสคริปต์


1
ทำไมไม่อนุญาตให้ ES6
TuxCrafting

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

นำการ จำกัด ภาษาออกและเปลี่ยนกฎการให้คะแนนเป็นผล ฉันยังคงชอบที่จะเห็นรายการจาวาสคริปต์ แต่ฉันคิดว่าฉันสามารถอยู่กับภาษากอล์ฟ 4-5 ตัว
TestSubject06

ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! รหัสความท้าทายกอล์ฟถูกทำคะแนนตามความยาวเป็นไบต์โดยค่าเริ่มต้น ในขณะที่การให้คะแนนโดยความยาวในตัวละครที่เป็นไปได้ที่คุณจะผูกพันจะได้คำตอบบางอย่างเช่นนี้
Dennis

โอ้พระเจ้า. เปลี่ยนเป็นการให้คะแนนแบบไบท์
TestSubject06

คำตอบ:


6

Python 2, 52 ไบต์

lambda s,n:reduce(lambda r,c:r+c*(r[-n:]!=c*n),s,'')

เขียนเป็นโปรแกรม (54 ไบต์):

s,n=input();r=''
for c in s:r+=c*(r[-n:]!=c*n)
print r

วนซ้ำผ่านสตริงอินพุตsต่อท้ายอักขระแต่ละตัวกับสตริงเอาต์พุตrยกเว้นว่าnอักขระตัวสุดท้ายของrเป็นอักขระนั้น

ฉันว่าสิ่งนี้จะล้มเหลวn==0เพราะr[-0:]ไม่ใช่อักขระ 0 ตัวสุดท้าย (สตริงว่าง) แต่เป็นสตริงทั้งหมด แต่มันใช้งานได้เพราะสตริงยังว่างอยู่ดังนั้นมันจะจับคู่กับสตริง 0 อักขระ

ผู้เรียกซ้ำlambdaให้ 56 เนื่องจากการเกิดซ้ำ

f=lambda s,n:s and s[:f(s[1:],n)[:n]!=s[0]*n]+f(s[1:],n)

กลยุทธ์ทางเลือกเพื่อรักษาตัวนับiซ้ำของตัวละครตัวสุดท้ายก็เปิดออกมานานกว่าการตรวจสอบnตัวละครตัวสุดท้ายโดยตรง


6

C, 81 78

แก้ไขสตริงที่เข้ามา

c,a;f(p,n)char*p;{char*s=p;for(;*p;s+=c<n)*s=*p++,a^*s?c=0:++c,a=*s;c=a=*s=0;}

โปรแกรมทดสอบ

ต้องใช้พารามิเตอร์สองตัวตัวแรกคือสตริงที่จะตัดปลายส่วนที่สองคือขีดจำกัดความยาว

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, const char **argv)
{
    char *input=malloc(strlen(argv[1])+1);
    strcpy(input,argv[1]);
    f(input,atoi(argv[2]));
    printf("%s\n",input);
    free(input);
    return 0;
}

คำอธิบาย:

c,a;                 //declare two global integers, initialized to zero.
                     //c is the run length, a is the previous character
f(char*p,int n){...} //define function f to truncate input
char*s=p;            //copy p to s; p is source, s is destination
for(;*p              //while there is a source character
;s+=c<n)             //increment copied pointer if run is under the limit
*s=*p++,             //copy from source to destination, increment source
a^*s?c=0:++c,        //if previous character != current then run=0 else increment run
a=*s;                //previous character = current source character
c=a=*s=0;            //after loop, terminate destination string with NUL and reset c and a.

สิ่งนี้ทำงานได้เพราะตัวชี้แหล่งที่มาจะเท่ากับหรือมากกว่าตัวชี้ปลายทางเสมอดังนั้นเราจึงสามารถเขียนทับสตริงได้ขณะที่เราแยกวิเคราะห์


นี่มันสุดยอดมากคุณอธิบายได้มั้ย
TestSubject06

@ TestSubject06 - เพิ่มคำอธิบาย
owacoder

สิ่งนี้ใช้ได้กับกรณี n = 0 หรือไม่ ฉันไม่สามารถรวบรวมมันเพื่อทดสอบที่นี่
TestSubject06

ใช่. ฉันเพิ่มโปรแกรมทดสอบเพื่อให้คุณสามารถรวบรวม
owacoder

ยอดเยี่ยมไม่พบตัวอย่างการนับใด ๆ สั้นและใช้งานได้!
TestSubject06


4

Javascript ES6, 60 54 55 43 ไบต์

-12 ไบต์ขอบคุณ @ TestSubject06 และ @Downgoat

(s,n)=>s.replace(/(.)\1*/g,x=>x.slice(0,n))

ตัวอย่างการทำงาน:

f("aaaaaaabbbccCCCcc"      , 2) -> "aabbccCCcc" 
f("aaabbbc"                , 1) -> "abc"
f("abcdefg"                , 0) -> ""
f("aaaaaaabccccccccCCCCCC@", 4) -> "aaaabccccCCCC@"
f("a"                      , 1) -> "a"

f ("a", 1) -> ""
TestSubject06

1
เนื่องจาก RegExp ของคุณไม่ได้ควบคุมแบบไดนามิกในทางใดทางหนึ่งคุณสามารถบันทึกบางไบต์ด้วย RegExp ("(.) \\ 1 *", "g") -> /(.)\1*/g
TestSubject06

1
เปลี่ยนRegExp("(.)\\1*","g")เป็น/(.)\1*/g
Downgoat

1
ฉันไม่เห็นว่าสิ่งนี้จะเล็กลงใน JS เว้นแต่ว่าเราจะมาจากมุมที่แตกต่างอย่างสิ้นเชิง เก่งมาก @Dendrobium!
TestSubject06

1
โกนหนึ่งไบต์ด้วยการเปลี่ยน(s,n)เป็นs=>nและการใช้งานจะกลายเป็นf("aaaaaaabbbccCCCcc")(2)
Patrick Roberts

3

MATL, 9 ไบต์

Y'i2$X<Y"

ลองออนไลน์

คำอธิบาย

        % Implicitly grab input as a string
Y'      % Perform run-length encoding. Pushes the values and the run-lengths to the stack
i       % Explicitly grab the second input
2$X<    % Compute the minimum of the run lengths and the max run-length
Y"      % Perform run-length decoding with these new run lengths
        % Implicitly display the result

'@@@@ bbbbbcccddeegffsassss' 3 คืน '@@@ bbbcccddeegffsass' ซึ่งหายไปรอบสุดท้าย '
TestSubject06

@ TestSubject06 ขอบคุณที่ชี้ให้เห็น
Suever




2

gs2, 6 ไบต์

เข้ารหัสในCP437 :

╠c╨<ΘΣ

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ (บล็อก) ที่คาดว่าจะมีตัวเลขอยู่ด้านบนของสแต็กและสตริงที่อยู่ด้านล่าง

     Σ   Wrap previous five bytes in a block:
╠          Pop number into register A.
 c         Group string.
    Θ      Map previous two bytes over each group:
  ╨<         Take the first A bytes.

ลองออนไลน์ (รหัสที่นี่คือlines, dump, read number, [the answer], run-block)


1

Perl 6 ,  38  36 ไบต์

->$_,$n {S:g/(.)$0**{$n..*}/{$0 x$n}/}
->$_,\n{S:g/(.)$0**{n..*}/{$0 x n}/}

คำอธิบาย:

-> $_, \n { # pointy block lambda
  # regex replace ( return without modifying variant )
  # globally
  S:global /
    # a char
    (.)
    # followed by 「n」 or more identical chars
    $0 ** { n .. * }
  /{
    # repeat char 「n」 times
    $0 x n
  }/
}

ทดสอบ:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &truncate-char-runs-to = ->$_,\n{S:g/(.)$0**{n..*}/{$0 x n}/}

my @tests = (
  ("aaaaaaabbbccCCCcc", 2) => "aabbccCCcc",
  ("aaabbbc", 1) => "abc",
  ("abcdefg", 0) => "",
  ("aaaaaaabccccccccCCCCCC@", 4) => "aaaabccccCCCC@",
);

plan +@tests;

for @tests -> $_ ( :key(@input), :value($expected) ) {
  is truncate-char-runs-to(|@input), $expected, qq'("@input[0]", @input[1]) => "$expected"';
}
1..4
ok 1 - ("aaaaaaabbbccCCCcc", 2) => "aabbccCCcc"
ok 2 - ("aaabbbc", 1) => "abc"
ok 3 - ("abcdefg", 0) => ""
ok 4 - ("aaaaaaabccccccccCCCCCC@", 4) => "aaaabccccCCCC@"

0

Javascript ES5, 73

function f(s,n){return s.replace(RegExp("(.)(\\1{"+n+"})\\1*","g"),"$2")}

Re-ใช้ regex ลินน์จากเธอตอบหลาม


รหัสของคุณไม่ได้รับการจัดการกรณีที่ n เป็นศูนย์เพียงแค่ส่งกลับสตริงเดิมทั้งหมด
TestSubject06

ใช่ใน Firefox คุณสามารถดร็อปคำสั่ง braces และ returnแม้ว่าไวยากรณ์นั้น (เศร้า) เลิกใช้แล้วและจะถูกลบออก (จริงๆแล้วมันหายไปสองสามเวอร์ชันกลับมา
Dendrobium

นอกจากนี้คุณยังสามารถวางnewคำหลักสำหรับ -4 ไบต์
Dendrobium

@ TestSubject06 ขอบคุณฉันได้แก้ไขคำตอบของฉันและฉันเชื่อว่ามันผ่านกรณีทดสอบในขณะนี้
FryAmTheEggman

0

Perl 5, 50 ไบต์

รหัส 46 ไบต์ + 3 สำหรับ-iและ 1 สำหรับ-p

-iนำหมายเลขที่ตัดผ่านทาง

s!(.)\1+!$&=~s/(.{$^I}).+/$1/r!ge

การใช้

perl -i4 -pe 's!(.)\1+!$&=~s/(.{$^I}).+/$1/r!ge' <<< 'aaaaaaabccccccccCCCCCC@'
aaaabccccCCCC@

ทำไมถึงมี-pเพียงหนึ่งไบต์
someonewpcpc

@someonewithpc เมื่อสามารถรวมกับ-eตัวเลือกเหล่านี้จะใช้ 1 ไบต์เท่านั้น หากต้องเรียกใช้สคริปต์จากไฟล์จะมีค่าใช้จ่าย 3 สำหรับพื้นที่และเขาตั้งค่าสถานะเอง มีเมตาโพสต์ฉันจะพยายามค้นหา แต่ตอนนี้ฉันอยู่บนมือถือ
Dom Hastings


0

Bash 46 ไบต์

read c;sed -r ":l;s/(.)(\1{$c})(.*)/\2\3/;t l"

การใช้งาน: ป้อนจำนวนอักขระที่จะ จำกัด กด Enter และป้อนสตริง Ctrl+ Dเพื่อออกsed(ส่ง EOF)


0

Java 7, 107 106 ไบต์

String c(String s,int i){String x="";for(int i=-1;++i<j;)x+="$1";return s.replaceAll("(.)\\1{"+i+",}",x);}

ทางเลือกก่อนหน้าแบบอินไลน์สำหรับลูปสำหรับการต่อข้อมูลสตริง (ซึ่งมากกว่า 1 ไบต์String s="";for(int i=-1;++i<j;)s+="$1";น่าเสียดาย):

String c(String s,int i){return s.replaceAll("(.)\\1{"+i+",}",new String(new char[i]).replace("\0","$1")));}

กรณีที่ไม่ได้รับการทดสอบ &:

ลองที่นี่

class Main {
  static String c(String s, int i){
    String x="";
    for(int j = -1; ++j < i;){
      x += "$1";
    }
    return s.replaceAll("(.)\\1{"+i+",}", x);
  }

  public static void main(String[] a){
    System.out.println(c("aaaaaaabbbccCCCcc", 2));
    System.out.println(c("aaabbbc", 1));
    System.out.println(c("abcdefg", 0));
    System.out.println(c("aaaaaaabccccccccCCCCCC@", 4));
    System.out.println(c("@@@@@bbbbbcccddeegffsassss", 5));
  }
}

เอาท์พุท:

aabbccCCcc
abc

aaaabccccCCCC@
@@@@@bbbbbcccddeegffsassss

0

Javascript (ใช้ไลบรารีภายนอก) (115 ไบต์)

(s,r)=>_.From(s).Aggregate((c,n)=>{if(c.a!=n){c.c=1;c.a=n}else{c.c++}if(c.c<=r){c.b+=n}return c},{a:"",b:"",c:0}).b

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable

คำอธิบายรหัส: โหลดสตริงลงในห้องสมุดซึ่งแยกวิเคราะห์ภายในเป็นอาร์เรย์ถ่าน ใช้แอคคูเลเตอร์ในลำดับผ่านในวัตถุที่กำหนดเองเป็นค่าเมล็ด คุณสมบัติ a คือองค์ประกอบปัจจุบัน b คือสตริงสะสมและ c คือการนับตามลำดับขององค์ประกอบปัจจุบัน ตัวสะสมจะตรวจสอบว่าค่าการวนซ้ำในปัจจุบัน, n, เท่ากับค่าองค์ประกอบสุดท้ายหรือไม่ถ้าไม่ใช่เราจะรีเซ็ตการนับเป็น 1 และตั้งค่าองค์ประกอบปัจจุบัน หากจำนวนองค์ประกอบปัจจุบันน้อยกว่าหรือเท่ากับความยาวที่ต้องการเราจะรวมเข้ากับสตริงส่งคืน สุดท้ายเราส่งคืนคุณสมบัติ b ซึ่งเป็นสตริงสะสม ไม่ใช่รหัส golfiest แต่มีความสุขฉันได้ทางออกที่ทำงาน ...

enter image description here


0

J, 31 30 ไบต์

((<.#@>)#{.@>@])]<;.1~1,2~:/\]

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

การใช้

   f =: ((<.#@>)#{.@>@])]<;.1~1,2~:/\]
   2 f 'aaaaaaabbbccCCCcc'
aabbccCCcc
   1 f 'aaabbbc'
abc
   0 f 'abcdefg'

   4 f 'aaaaaaabccccccccCCCCCC@'
aaaabccccCCCC@

คำอธิบาย

((<.#@>)#{.@>@])]<;.1~1,2~:/\]  Input: k on LHS, s on RHS
                             ]  Get s
                        2~:/\   Test if each pair of consecutive chars are not equal
                      1,        Prepend a 1
                ]               Get s
                 <;.1~          Chop s where a 1 occurs to get the runs in s
    #@>                         Get the length of each run
  <.                            Take the min of the length and k
         {.@>@]                 Get the head of each run
        #                       Copy the head of each run min(k, len(run)) times
                                Return that string as the result

0

Dyalog APL , 22 20 ไบต์

(∊⊢↑¨⍨⎕⌊⍴¨)⊢⊂⍨1,2≠/⊢

พร้อมต์สำหรับnและรับสตริงอินพุตเป็นอาร์กิวเมนต์

(ฟังก์ชั่นโดยปริยาย ...
    แบน
    ⊢↑¨⍨แต่ละองค์ประกอบของอาร์กิวเมนต์ (เช่นแต่ละพาร์ติชัน) ถูกตัดให้
    ⎕⌊⍴¨เหลือน้อยที่สุดของอินพุตตัวเลขและความยาวปัจจุบัน
)[สิ้นสุดฟังก์ชัน tacit] นำไปใช้กับ
⊢⊂⍨อินพุตพาร์ติชันที่ᴛʀᴜᴇ s ของ
1, ᴛʀᴜᴇที่เตรียมไว้ ( อักขระตัวแรกไม่เท่ากับรุ่นก่อนที่ไม่ได้มีอยู่)
2≠/⊢คู่ที่ไม่ฉลาดเท่ากับตัวอักขระในอินพุต



-1

ทีซีซี, 7 5 ไบต์

$~(;)

อินพุตเป็นสตริงและตัวเลขคั่นด้วยช่องว่าง

ลองออนไลน์!

       | Printing is implicit
$~     | Limit occurence
  (;   | First part of input
    )  | Second part of input

1
การแก้ไขคำตอบของคุณจะไม่ทำงานกับtcc.luaไฟล์ด้วยการประทับเวลา 16-07-25 16:57 UTC ซึ่งไม่มีความสามารถในการอ่านอินพุตหลายรายการพร้อมกัน หากคำตอบของคุณต้องการเวอร์ชันของภาษาที่โพสต์ความท้าทายนั้นคุณจะต้องติดป้ายกำกับว่าไม่ใช่การแข่งขันในส่วนหัว ฉันจะลบ downvote ของฉันเมื่อคุณทำ
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.