Membalikkan gerakan positif

22

Memasukkan

Input Anda adalah daftar angka satu digit dalam format wajar apa pun, termasuk serangkaian digit. Masukan tidak akan kosong.

Keluaran

Output Anda akan menjadi daftar input, tetapi dengan setiap berjalan maksimal digit bukan nol dibalik.

Contoh

Pertimbangkan inputnya

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

di mana bukan nol berjalan telah ditandai dengan panah. Membalik masing-masing proses ini, kami memperoleh output

38859003841470

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Tantangan ini terkait, tetapi jauh lebih kompleks, karena mencakup pemrosesan string tambahan.

Uji kasus

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

Papan peringkat

Berikut Cuplikan Stack untuk menghasilkan papan peringkat dan daftar pemenang berdasarkan bahasa. Untuk memastikan jawaban Anda muncul, mulailah dengan tajuk formulir

## Language, N bytes

Anda dapat menyimpan skor lama di header dengan menggunakan tag dicoret: <s>57</s>akan muncul sebagai 57 .

Zgarb
sumber

Jawaban:

11

Pyth, 8

j0_Mcz\0

Membagi nol, mundur dan bergabung kembali pada nol.

Test Suite

FryAmTheEggman
sumber
8

IPOS , 5 byte

'0!r%

%memisahkan string input pada nol, menerapkan perintah r(mundur) untuk setiap substring dan menggabungkan hasilnya kembali pada nol.

Denker
sumber
7

Retina , 15 byte

S`0
O%^$`.

¶
0

Cobalah online! (Sedikit dimodifikasi untuk menjalankan semua test case sekaligus.)

Penjelasan

S`0

Membagi input di sekitar 0s, yaitu menempatkan masing-masing (mungkin kosong) angka yang tidak nol pada barisnya sendiri.

O%^$`.

Ini membalikkan setiap baris, dengan:

  • Menerapkan panggung ke setiap baris secara individual dengan %.
  • Mencocokkan setiap karakter secara individual dengan ..
  • Mengurutkannya berdasarkan hasil substitusi ( $) dengan string kosong (baris kedua kosong). Yaitu tidak mengurutkan sama sekali, karena semua nilai sortir identik.
  • Kemudian membalik urutan karakter yang diurutkan.

Akhirnya:

¶
0

Ubah umpan baris kembali menjadi 0s.

Martin Ender
sumber
5

05AB1E , 6 byte

Kode:

0¡€R0ý

Penjelasan:

0¡      # Split on zeros
  €R    # For each item in the array, reverse it
    0ý  # Join by zeros

Menggunakan pengodean CP-1252 . Cobalah online! .

Adnan
sumber
5

Julia, 30 byte

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

Ini adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

The replacefungsi menyediakan kemampuan untuk menggantikan pertandingan ekspresi reguler dengan hasil fungsi diterapkan pada setiap pertandingan. Dalam hal ini kita bisa menggunakan nonzero [^0]+dan mengganti proses tersebut dengan hasil dari reversefungsi yang diterapkan pada teks yang cocok.

Verifikasi semua test case online!

Alex A.
sumber
4

Retina, 25 24

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

Cobalah online

Disimpan 1 byte berkat Martin!

Urutkan digit bukan nol dengan jumlah nol yang mengikuti digit, dalam urutan terbalik.

Lihat solusi Martin untuk penggunaan mode per-line yang cerdas untuk mendapatkan program yang lebih pendek!

FryAmTheEggman
sumber
4

Jolf, 8 byte

RΜGi0λ_0

Coba di sini!

Penjelasan

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

Penjelasan kode terlihat seperti lambda jika Anda menyipitkan mata.

Jawaban 8 byte yang setara:

RΜGi0΅O0

Hal yang sama, tetapi menggunakan ΅O(string mirror lambda) sebagai gantinya.

Conor O'Brien
sumber
Saya akan mengatakan itu lebih mirip beberapa teks dalam bentuk lucu ketika saya menyipit. Mungkin aku harus menyingkirkan teleskop ini.
kucing
1
@ kucing Tidak, tidak, simpan, tapi lihat lambda ketika Anda melakukannya.
Conor O'Brien
3

Ruby, 29 byte

->x{x.gsub /[^0]*/,&:reverse}
Gagang pintu
sumber
3

Python, 58 50 byte

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

Mengambil dalam string x dan membelah pada nol dan membalikkan setiap elemen dalam split dan menambahkan nol dan mengembalikan minus terakhir ini.

1232
sumber
1
Selamat datang di PPCG :) Anda harus dapat melakukan "0".joindan kemudian menjatuhkan tambahan dan slice.
FryAmTheEggman
@FryAmTheEggman terima kasih atas tipnya
1232
Tidak masalah :) Anda juga dapat menghapus ruang antara ]dan for. Anda dapat memeriksa halaman tips kami untuk petunjuk lebih lanjut, jika Anda mau.
FryAmTheEggman
7
lambda x:"0".join(n[::-1]for n in x.split("0"))
orlp
3

Mathematica, 30 byte

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

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

feersum
sumber
2

PowerShell v2 +, 45 byte

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

Menyalahgunakan casting implisit seperti tidak ada hari esok. Kemungkinan tidak bisa jauh lebih pendek, karena tidak ada builtin untuk mundur yang lebih pendek dari trik pengindeksan ini.

Penjelasan

Contoh cara kerjanya - anggaplah 123045input $args. Setelah -spliton 0, pipeline akan berisi array (123,45). Loop pertama dengan |%{...}elemen saat ini $_sama dengan 123, yang kemudian secara implisit dilemparkan sebagai string, kemudian dibalik dengan []pengindeksan. Itu menjadikannya ('3','2','1')sebagai char-array. Lingkaran -joinmenempatkan itu kembali ke string "321"dan meninggalkannya di pipa. Iterasi loop (terakhir) berikutnya membalikkan input ke "54". Jadi sekarang pipa kami adalah "321", "54". Itu dirangkum dalam parens ()sehingga direformasi menjadi array, dan -joindiedit kembali bersama dengan nol untuk menghasilkan string output yang dihasilkan"321054". Yang tertinggal di pipeline dan output ke konsol tersirat.

Jika ada nol berikutnya dalam input asli, array akan diisi dengan elemen nol, jadi ada jumlah nol yang benar pada output. Misalnya, 1230045-split0berubah menjadi (123,,45)dan hal-hal berlanjut seperti di atas.

AdmBorkBork
sumber
2

Jelly, 5 byte

ṣ0Uj0

Cobalah online!

Dennis
sumber
2

Faktor, 35 byte

Mengalahkan Pyfon dan Clojure, booyah!

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

Fungsi anonim ini adalah terjemahan literal dari jawaban Python ini .

Ini cukup sederhana, cukup pisahkan string pada nol, balikkan setiap elemen dari array yang dihasilkan, dan gabungkan semua elemen (termasuk string panjang nol) dengan "0".

Berikut ini contohnya yang berjalan pada semua kasus uji:

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"

kucing
sumber
2

Haskell, 45 byte

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

Secara terakumulasi mengakumulasi potongan terbalik sejauh ini r, menambahkannya ketika 0tercapai. Ketika string yang tersisa kosong, itu juga dibuang r.

Dua yang pertama mengulang beberapa kode, tetapi saya tidak menemukan cara yang lebih pendek untuk menggabungkannya (45 dan 47 byte):

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
([]%)
Tidak
sumber
Saya pikir Anda perlu sepasang kurung lagi di baris # 2:r%(h:t)=(h:r)%t
nimi
1

Pyke, 8 byte

\0cm_\0J

Penjelasan:

\0c      -   input().split("0")
   m_    -  map(reversed, ^)
     \0J - "0".join(^)

Coba di sini!

Biru
sumber
1

JavaScript (ES6), 50 49 byte

Versi string:

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

Menyimpan satu byte berkat @Kevin Lau!

Versi array (60 byte):

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

J, 20 18 byte

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

Terima kasih kepada Zgarb karena telah membantu ini! Mengambil daftar yang dipisahkan oleh ruang sebagai argumen yang benar.

-2 byte terima kasih kepada Zgarb!

Conor O'Brien
sumber
1

Clojure / ClojureScript, 44 karakter

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

Solusi yang sama seperti yang lain, hanya lebih banyak berkat berkat nama fungsi yang panjang. Tidak akan memposting karena itu, tetapi mengalahkan beberapa jawaban lain jadi mengapa tidak?

Bekerja pada semua jenis urutan. Di ClojureScript, ini juga berfungsi pada string karena string dapat diproses sebagai daftar karakter, yang sebenarnya hanya string 1-panjang, yang memaksa angka untuk hal-hal seperti pos?.

MattPutnam
sumber
1

Haskell, 46 byte

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

Contoh penggunaan: (reverse=<<).split(oneOf"0") $ "0123004500678090"-> "0321005400876090".

Sayangnya splitfungsi ini membutuhkan impor yang mahal. Membagi daftar input di setiap 0, misalnya split(oneOf"0") "0120030"-> ["","0","12","0","","0","3","0",""], membalikkan setiap chunk dan menyatukan menjadi satu string.

nimi
sumber
1

F #, 103 byte

let f x=x="";x.Split '0'|>Array.map(fun s->System.String(s|>Seq.toArray|>Array.rev))|>String.concat "0"
David Conrad
sumber
1

Java, 179 byte (dengan impor)

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);}

Mengambil input string dan membagi karakter dengan nol kemudian menambahkannya kembali dengan memanggil metode add pada kelas StringJoiner.

1232
sumber
1

Oracle SQL 11.2, 131 123 byte

Menyalahgunakan fungsi XML.

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

Perl, 22 byte

Termasuk +1 untuk -popsi:

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

Ini adalah substitusi yang cukup sepele - maaf membosankan. Perhatikan bahwa jika input Anda diakhiri baris baru (misalnya menggunakan perl -pe 's/[^0]+/reverse$&/eg' <<<21000543dalam Bash), itu akan menangkap baris baru dengan digit - gunakan echo -natau printfuntuk menghindarinya. Atau, dengan biaya satu byte tambahan, ubah kelas karakter menjadi [1-9], dan Anda dapat memberikan banyak input, satu byte per baris.

Toby Speight
sumber
1

C, 105 byte

#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);}

Panggil fdengan daftar digit sebagai string yang diakhiri nul, dan itu akan mencetak output yang benar.

Tidak digabungkan dan dijelaskan:

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);
}

Lihat langsung di Coliru

Quentin
sumber
0

Perl 5, 52 byte

Subrutin:

{$_=pop;y/0/ /;map$i.=reverse,split/\b/;$i=~y/ /0/r}
msh210
sumber
-atidak berfungsi (setidaknya dalam Strawberry) ketika string input berakhir 0, karena split/\b/termasuk $/dengan 0.
msh210
0

Sebenarnya, 22 byte

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

Ini benar-benar membuat saya memperhatikan bahwa ada bug dalam perintah split - tidak menyimpan pemisahan kosong. Sebagai solusinya, saya mengelilingi string input dengan as sebelum melakukan split, membalikkan, dan bergabung, lalu lepaskan as di akhir. Input diambil sebagai string, output adalah daftar string karakter tunggal.

Cobalah online

Penjelasan:

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)
Mego
sumber
0

C #, 131 byte ##

solusi cacat!

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;
    }
downrep_nation
sumber
1
Saya percaya metode ini memiliki bug ketika satu string yang akan dibalik adalah bagian dari yang lain. Jika diberi input 01201230, ini akan kembali 02102130. Ini karena metode String.Replace menggantikan semua kemunculan string pertama dengan yang kedua. Bug ini juga akan disebabkan jika satu pola muncul ketika terbalik ( 0120210akan kembali 0120120).
Xynariz
Aku bahkan tidak memikirkan itu ..
downrep_nation
0

C #, 133 byte


Golf

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;}

Tidak disatukan

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;
}

Kode lengkap

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;
        }
    }
}
auhmaan
sumber
Hanya perhatikan sekarang bahwa @downrep_nation telah memposting di sini solusi untuk C #, yang mengalahkan kode saya dengan 2 byte ... (Itu bisa lebih ....)
auhmaan
0

Jawa, 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);}
Semoga Membantu
sumber
Jika Anda mendeklarasikan svariabel di depan dengan rdan t[], dapatkah Anda menghilangkan deklarasi tipe sdalam for for?
Cyoce
Tidak, saya memeriksanya, ditingkatkan untuk loop membutuhkan variabel yang baru dinyatakan.
Semoga
Hah. Itu aneh. Oh well
Cyoce
0

Clojure, 37 byte

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

Menggunakan #{0}alih-alih pos?(simpan 1 byte dengan menyatu dengan %) dan menggunakan mapcatalih-alih (flatten(map. Masih lebih lama dari Factor .

NikoNyrh
sumber