ย้อนกลับการทำงานในเชิงบวก


22

อินพุต

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

เอาท์พุต

ผลลัพธ์ของคุณจะเป็นรายการอินพุต แต่ด้วยการรันตัวเลขสูงสุดที่ไม่ใช่ศูนย์แต่ละครั้งจะถูกย้อนกลับ

ตัวอย่าง

พิจารณาอินพุต

95883007414830
<--->  <---->

ที่ที่ไม่ใช่ศูนย์วิ่งถูกทำเครื่องหมายด้วยลูกศร ย้อนกลับการทำงานเหล่านี้แต่ละครั้งเราจะได้รับผลลัพธ์

38859003841470

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

ความท้าทายนี้เกี่ยวข้อง แต่มีความซับซ้อนมากกว่าเนื่องจากมีการประมวลผลสตริงเพิ่มเติม

กรณีทดสอบ

4 -> 4
00 -> 00
123 -> 321
0010 -> 0010
12000345 -> 21000543
18161604 -> 61618104
95883007414830 -> 38859003841470
010230456078912 -> 010320654021987
357509902003550 -> 575309902005530
2492882377675046 -> 5767732882942064
03026302053000357099 -> 03036202035000753099

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างกระดานแต้มนำและรายการผู้ชนะตามภาษา เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นให้เริ่มด้วยส่วนหัวของแบบฟอร์ม

## Language, N bytes

คุณสามารถเก็บคะแนนเก่าในส่วนหัวโดยใช้แท็กขีด: <s>57</s>จะปรากฏเป็น57

คำตอบ:



8

IPOS 5 ไบต์

'0!r%

%แยกสตริงอินพุตบนศูนย์ใช้คำสั่งr(ย้อนกลับ) กับทุกสตริงย่อยและรวมผลลัพธ์กลับเป็นศูนย์


7

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

S`0
O%^$`.

¶
0

ลองออนไลน์!(แก้ไขเล็กน้อยเพื่อเรียกใช้กรณีทดสอบทั้งหมดในครั้งเดียว)

คำอธิบาย

S`0

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

O%^$`.

สิ่งนี้จะย้อนกลับแต่ละบรรทัดโดย:

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

สุดท้าย:

¶
0

เปลี่ยน linefeeds กลับเป็น0s



5

Julia 30 ไบต์

s->replace(s,r"[^0]+",reverse)

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งคืนสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

replaceฟังก์ชั่นให้ความสามารถในการเปลี่ยนการแข่งขันของการแสดงออกปกติที่มีผลมาจากฟังก์ชั่นที่ใช้กับการแข่งขันแต่ละครั้ง ในกรณีนี้เราสามารถทำให้ค่าที่ไม่ใช่ศูนย์ใช้[^0]+และแทนที่การรันเหล่านั้นด้วยผลลัพธ์ของreverseฟังก์ชันที่ใช้กับข้อความที่ตรงกัน

ตรวจสอบกรณีทดสอบทั้งหมดออนไลน์!


4

จอประสาทตา 25 24

O^$#`[^0](?=(.*?0)*)
$#1

ลองออนไลน์

บันทึก 1 ไบต์ขอบคุณ Martin!

จัดเรียงตัวเลขที่ไม่ใช่ศูนย์ตามจำนวนศูนย์ที่ตามหลังด้วยลำดับที่กลับกัน

ดูโซลูชันของ Martinสำหรับการใช้โหมดต่อบรรทัดอย่างชาญฉลาดเพื่อรับโปรแกรมที่สั้นลง!


4

Jolf, 8 ไบต์

RΜGi0λ_0

ลองที่นี่!

คำอธิบาย

RΜGi0λ_0
  Gi0     split input on zeroes
 Μ   λ_   map over reversal as a lambda
R      0  join by zeroes

คำอธิบายรหัสดูเหมือนว่าแลมบ์ดาถ้าคุณเหล่

8 ไบต์เทียบเท่าคำตอบ:

RΜGi0΅O0

สิ่งเดียวกัน แต่ใช้΅O(string mirror lambda) แทน


ฉันว่ามันดูเหมือนข้อความบางอย่างในรูปแบบที่ตลกเมื่อฉันมองมัน บางทีฉันควรจะเอากล้องโทรทรรศน์นี้ออกไป
แมว

1
@ แมวไม่ไม่เก็บไว้ แต่ดูแลมบ์ดาเมื่อคุณทำ
Conor O'Brien


3

Python 58 58ไบต์

lambda x:"0".join([n[::-1] for n in x.split("0")])

ใช้เวลาในสตริง x และแยกบนศูนย์และย้อนกลับแต่ละองค์ประกอบในการแยกและเพิ่มศูนย์และผลตอบแทนลบนี้เป็นศูนย์สุดท้าย


1
ยินดีต้อนรับสู่ PPCG :) คุณควรจะสามารถทำ"0".joinแล้วปล่อยส่วนเสริมและส่วนแบ่ง
FryAmTheEggman

@FryAmTheEggman ขอบคุณสำหรับเคล็ดลับ
1232

ไม่มีปัญหา :) นอกจากนี้คุณยังสามารถลบช่องว่างระหว่างและ] forคุณสามารถตรวจสอบหน้าเคล็ดลับของเราสำหรับตัวชี้เพิ่มเติมถ้าคุณต้องการ
FryAmTheEggman

7
lambda x:"0".join(n[::-1]for n in x.split("0"))
orlp

3

Mathematica ขนาด 30 ไบต์

Join@@Reverse/@#~SplitBy~Sign&

เช่นJoin@@Reverse/@#~SplitBy~Sign&[{1,2,3,0,0,5,9,0}]={3, 2, 1, 0, 0, 9, 5, 0}


2

PowerShell v2 +, 45 ไบต์

($args-split0|%{-join$_[$_.length..0]})-join0

การดูถูกอย่างไม่เหมาะสมในวันพรุ่งนี้ น่าจะสั้นกว่านี้ไม่ได้เนื่องจากไม่มี builtin สำหรับการย้อนกลับที่สั้นกว่าเคล็ดลับการจัดทำดัชนีนี้

คำอธิบาย

ตัวอย่างของวิธีการทำงานนี้ - สมมติว่าเป็นอินพุท123045 $argsหลังจากที่-splitในท่อจะมีอาร์เรย์0 (123,45)การวนซ้ำครั้งแรกด้วย|%{...}มีองค์ประกอบปัจจุบัน$_เท่ากับ123ซึ่งจากนั้นหล่อโดยปริยายเป็นสตริงจากนั้นกลับด้วย[]ทำดัชนี นั่นทำให้มัน('3','2','1')เป็นแบบอาเรย์ การวนซ้ำนั้น-joinทำให้มันกลับมาเป็นสตริง"321"และทิ้งไว้บนไปป์ไลน์ ถัดไป (ที่ผ่านมา) "54"ห่วงซ้ำฝืนป้อนข้อมูลไปยัง ดังนั้นตอนนี้ท่อของเราคือ,"321" "54"ที่ห่อหุ้มใน parens() -joinกลับมารวมกันด้วยค่าศูนย์เพื่อสร้างสตริงผลลัพธ์ที่ได้ผลลัพธ์"321054". สิ่งที่เหลืออยู่บนไพพ์ไลน์และเอาต์พุตไปยังคอนโซลเป็นค่าปริยาย

หากมีค่าศูนย์ตามมาในอินพุตดั้งเดิมอาร์เรย์จะถูกเติมด้วยองค์ประกอบ null ดังนั้นจึงมีจำนวนศูนย์ที่ถูกต้องบนเอาต์พุต ตัวอย่างเช่น,1230045-split0ผลัดกัน(123,,45)และสิ่งที่ดำเนินการต่อไปดังกล่าวข้างต้น



2

ตัวคูณ 35 ไบต์

ตี Pyfon และ Clojure, booyah!

[ "0"split [ reverse ] map "0"join ]

ฟังก์ชั่นที่ไม่ระบุชื่อนี้เป็นการแปลตัวอักษรของคำตอบ Python นี้อย่างแท้จริง

มันค่อนข้างง่ายเพียงแค่แบ่งสตริงเป็นศูนย์ย้อนกลับทุกองค์ประกอบของอาร์เรย์ผลลัพธ์และเข้าร่วมองค์ประกอบทั้งหมด (รวมถึงสตริงที่มีความยาวเป็นศูนย์) ด้วย "0"กับ

นี่คือตัวอย่างของการรันในกรณีทดสอบทั้งหมด:

IN: scratchpad auto-use {
        "4"
        "00"
        "123"
        "0010"
        "12000345"
        "18161604"
        "95883007414830"
        "010230456078912"
        "357509902003550"
        "2492882377675046"
        "03026302053000357099"
        }
        [ 
          "0" split [ reverse ] map "0" join
        ]
        map .

{
    "4"
    "00"
    "321"
    "0010"
    "21000543"
    "61618104"
    "38859003841470"
    "010320654021987"
    "575309902005530"
    "5767732882942064"
    "03036202035000753099"
}

"00120"-> { "" "" "12" "" }-> { "" "" "21" "" }->"00210"


2

Haskell, 45 ไบต์

r%(0:t)=r++0:[]%t
r%(h:t)=(h:r)%t
r%_=r
([]%)

สะสมก้อนที่กลับด้านซ้ำแล้วซ้ำอีกเพื่อเตรียมrไว้เมื่อ0ถึง เมื่อสตริงที่เหลืออยู่นั้นว่างเปล่ามันก็จะถูกปล่อยออกมาrมา

สองคนแรกทำซ้ำรหัสบางส่วน แต่ฉันไม่พบวิธีที่สั้นกว่าในการรวมเข้าด้วยกัน (45 และ 47 ไบต์):

r%(h:t)|h<1=r++h:[]%t|1>0=(h:r)%t
r%_=r
([]%)

r%l|0:t<-l=r++0:[]%t|h:t<-l=(h:r)%t
r%_=r
([]%)

ฉันคิดว่าคุณต้องการวงเล็บเพิ่มอีกหนึ่งคู่ในบรรทัด # 2:r%(h:t)=(h:r)%t
nimi


1

JavaScript (ES6), 50 49 ไบต์

รุ่นสตริง:

s=>s.replace(/[^0]+/g,r=>[...r].reverse().join``)

บันทึกเป็นไบต์ด้วย @Kevin Lau!

รุ่นอาร์เรย์ (60 ไบต์):

a=>a.map((n,i)=>n?a[z-i+[...a,0].indexOf(0,i)]:(z=i,0),z=-1)

1

J, 20 18 ไบต์

0}:@;@(<@|.;.1)@,]

ขอบคุณ Zgarb ที่ช่วยเหลือสิ่งนี้! รับรายการที่คั่นด้วยช่องว่างเป็นอาร์กิวเมนต์ที่ถูกต้อง

-2 ไบต์ขอบคุณ Zgarb!


1

Clojure / ClojureScript, 44 ตัวอักษร

#(flatten(map reverse(partition-by pos? %)))

วิธีการแก้ปัญหาเช่นเดียวกับคนอื่น ๆ verbose มากขึ้นขอบคุณชื่อฟังก์ชั่นยาว จะไม่โพสต์เพราะสิ่งนั้น แต่มันก็เป็นคำตอบอื่น ๆ ดังนั้นทำไมไม่

ทำงานบนประเภทลำดับใด ๆ ใน ClojureScript นี้ยังทำงานในสายตั้งแต่สตริง processable เป็นรายชื่อของตัวละครที่มีความจริงเพียง 1 pos?สายยาวซึ่งบีบบังคับให้เป็นตัวเลขสำหรับสิ่งที่ต้องการ


1

Haskell, 46 ไบต์

import Data.Lists
(reverse=<<).split(oneOf"0")

ตัวอย่างการใช้งาน: ->(reverse=<<).split(oneOf"0") $ "0123004500678090""0321005400876090"

น่าเสียดายที่splitฟังก์ชั่นนี้ต้องการการนำเข้าที่มีราคาแพง แยกรายการอินพุตที่ทุก ๆ0เช่นsplit(oneOf"0") "0120030"-> ["","0","12","0","","0","3","0",""]ย้อนกลับแต่ละอันและต่อกันเป็นสตริงเดียว



1

Java, 179 ไบต์ (พร้อมการนำเข้า)

import java.util.*;static void r(String s){StringJoiner x= new StringJoiner("0");for(String a:s.split("0",s.length())){x.add(new StringBuilder(a).reverse());}System.out.print(x);}

ใช้เวลาในการป้อนสตริงและแยกตัวละครเป็นศูนย์แล้วเพิ่มพวกเขากลับมาโดยการเรียกวิธีการเพิ่มในคลาส StringJoiner


1

Oracle SQL 11.2, 131 123 ไบต์

ใช้งาน XML ในทางที่ผิด

SELECT LISTAGG(REVERSE(COLUMN_VALUE||''))WITHIN GROUP(ORDER BY rownum)FROM XMLTABLE(('"'||REPLACE(:1,'0','","0","')||'"'));

1

Perl, 22 ไบต์

รวม +1 สำหรับ-pตัวเลือก:

s/[^0]+/reverse$&/eg

นี่เป็นการทดแทนที่ไม่สำคัญ - ขอโทษที่น่าเบื่อ โปรดทราบว่าหากการป้อนข้อมูลของคุณถูกยกเลิกการขึ้นบรรทัดใหม่ (เช่นใช้perl -pe 's/[^0]+/reverse$&/eg' <<<21000543ใน Bash) มันจะจับขึ้นบรรทัดใหม่ด้วยตัวเลข - ใช้echo -nหรือprintfเพื่อหลีกเลี่ยง หรืออีกทางหนึ่งสำหรับค่าใช้จ่ายของไบต์เพิ่มเติมให้เปลี่ยนคลาสอักขระเป็น[1-9]และคุณสามารถระบุอินพุตจำนวนมากหนึ่งรายการต่อบรรทัด


1

C, 105 ไบต์

#define x(o)for(p=s;*s&&'0'o*s;++s);for(r=s;r-->p;putchar(*r));
f(s,p,r)char*s,*p,*r;{x(^)x(==)*s&&f(s);}

เรียกfด้วยรายการตัวเลขเป็นสตริงที่ถูกยกเลิกด้วย nul และจะพิมพ์เอาต์พุตที่ถูกต้อง

Ungolfed และอธิบาย:

f(s,p,r)
char*s,*p,*r; // K&R style to avoid repeating `char`
{

    // x(^)x(==) expands to...

    // Find the next zero digit
    for(p = s; *s && '0' ^ *s; ++s)
        ;

    // Print that run backwards
    for(r = s; r-- > p; putchar(*r))
        ;

    // Find the next non-zero digit
    for(p = s; *s && '0' == *s; ++s)
        ;

    // Print that run backwards (no difference, it's all zeros)
    for(r = s; r-- > p; putchar(*r))
        ;

    // If there's more string, recurse
    *s && f(s);
}

ดูมันสดบน Coliru


0

Perl 5, 52 ไบต์

รูทีนย่อย:

{$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r}

-aไม่ทำงาน (ในสตรอเบอร์รี่อย่างน้อย) เมื่อปลายสายป้อนใน0ตั้งแต่split/\b/รวมกับ$/ 0
msh210

0

จริงแล้ว 22 ไบต์

k"a%sa"%'0@s♂R'0j#pXdX

นี่ทำให้ฉันสังเกตเห็นว่ามีข้อผิดพลาดในคำสั่ง split - มันไม่แยกส่วนที่ว่างเปล่าไว้ ในฐานะวิธีแก้ปัญหาฉันล้อมรอบสตริงอินพุตด้วยas ก่อนทำการแยกย้อนกลับและเข้าร่วมจากนั้นลบas ที่ท้าย อินพุตถูกใช้เป็นสตริงเอาต์พุตเป็นรายการของสตริงอักขระเดี่ยว

ลองออนไลน์

คำอธิบาย:

k"a%sa"%'0@s♂R'0j#pXdX
k"a%sa"%                surround input with "a" characters
        '0@s            split on 0
            ♂R          reverse each piece
              '0j       join on 0
                 #pXdX  listify, remove first and last element (the "a"s)

0

C #, 131 ไบต์ ##

การแก้ปัญหาข้อบกพร่อง!

string j(string i){foreach(var s in i.Split('0'))if(s!="")i=i.Replace(s,new string(s.ToCharArray().Reverse().ToArray()));return i;}

ungolfed:

string j(string input)
    {

        string[] a = input.Split('0');

        foreach (string s in a)
        {
            if (s!="")
            input=input.Replace(s, new string(s.ToCharArray().Reverse().ToArray()));
        }

        return input;
    }

1
ฉันเชื่อว่าวิธีนี้มีข้อผิดพลาดเมื่อหนึ่งสายที่จะกลับเป็นชุดย่อยของอีก หากได้รับการป้อนข้อมูลนี้จะกลับมา01201230 02102130นี่คือการได้เนื่องจากการ String.Replace วิธีแทนที่เกิดขึ้นทั้งหมดของสายอักขระแรกด้วยที่สอง ข้อผิดพลาดนี้ก็จะเกิดขึ้นหากรูปแบบหนึ่งปรากฏขึ้นเมื่อกลับรายการ ( 0120210จะกลับมา0120120)
Xynariz

ฉันไม่ได้คิดอย่างนั้น ..
downrep_nation

0

C #, 133 ไบต์


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

String m(String s){for(int i=0,p=i;i<s.Length;i++){if(s[i]=='0'){p=i+1;}else{s=s.Insert(p,s[i].ToString()).Remove(i+1,1);}}return s;}

Ungolfed

String m( String s ) {
    // i = Index on the String
    // p = Pointer of the last '0' found
    for (int i = 0, p = i; i < s.Length; i++) {
        if (s[ i ] == '0') {
            // Move the 'p' pointer to the index after this '0'
            p = i + 1;
        } else {
            // Insert the Char at the Index location to the Pointer location 
            //    and remove the one at the Index Location + 1,
            //    since the String was incremented by one char due to the 'Insert()'.
            s = s.Insert( p, s[ i ].ToString() )
                 .Remove( i + 1, 1 );
        }
    }

    return s;
}

รหัสเต็ม

using System;
using System.Collections.Generic;

namespace Namespace {
    class Program {
        static void Main( String[] args ) {
            List<String> ls = new List<String>() {
                "4",
                "00",
                "123",
                "0010",
                "12000345",
                "18161604",
                "95883007414830",
                "010230456078912",
                "357509902003550",
                "2492882377675046",
                "03026302053000357099"
            };

            foreach (String s in ls) {
                String f = m( s );

                Console.WriteLine( String.Format( "{0,30}", s.Replace( "0", "0 " ) ) );
                Console.WriteLine( String.Format( "{0,30}", f.Replace( "0", "0 " ) ) );
                Console.WriteLine( "" );
            }

            Console.ReadLine();
        }

        static String m( String s ) {
            for (Int32 i = 0, p = i; i < s.Length; i++) {
                if (s[ i ] == '0') {
                    p = i + 1;
                } else {
                    s = s.Insert( p, s[ i ].ToString() ).Remove( i + 1, 1 );
                }
            }

            return s;
        }
    }
}

เพิ่งสังเกตเห็นว่า @downrep_nation ได้โพสต์ที่นี่แล้ววิธีแก้ปัญหาสำหรับ C # ที่เต้นรหัสของฉันโดย 2 ไบต์ ... (มันอาจจะมากขึ้น .... )
auhmaan

0

Java, 126

a->{String r="",t[]=a.split("0");for(String s:t){r+=new StringBuilder(s).reverse()+"0";}return r.substring(0, r.length()-1);}

หากคุณประกาศsตัวแปรที่ด้านหน้าด้วยrและt[]คุณสามารถละเว้นการประกาศชนิดของsใน for for loop ได้หรือไม่?
Cyoce

ไม่ฉันตรวจสอบแล้วปรับปรุงสำหรับลูปต้องการตัวแปรที่ประกาศใหม่
หวังว่า

ฮะ. แปลก. โอ้ดี
Cyoce

0

Clojure, 37 ไบต์

#(mapcat reverse(partition-by #{0}%))

ใช้#{0}แทนpos?(บันทึก 1 ไบต์โดยเชื่อมโยงกับ%) และการใช้แทนmapcat (flatten(mapยังคงนานกว่าปัจจัย

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