リバースポジティブラン


22

入力

入力は、数字の文字列を含む、妥当な形式の1桁の数字のリストです。入力は空になりません。

出力

出力は入力リストになりますが、ゼロ以外の数字の最大実行ごとに反転されます。

入力を検討する

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

入力を0sで分割します。つまり、ゼロ以外の数字の各(空の場合もある)実行を独自の行に配置します。

O%^$`.

これにより、各行が逆になります。

  • で各行に個別にステージを適用し%ます。
  • 各文字を個別に一致させ.ます。
  • $空の文字列(空の2行目)を使用した置換()の結果で並べ替えます。つまり、すべてのソート値は同一であるため、ソートはまったく行われません。
  • 次に、ソートされた文字の順序を逆にします。

最後に:

¶
0

改行を0sに戻します。



5

ジュリア、30バイト

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

これは、文字列を受け入れて文字列を返す匿名関数です。呼び出すには、変数に割り当てます。

このreplace関数は、正規表現の一致を各一致に適用された関数の結果で置き換える機能を提供します。この場合[^0]+、これらの実行を使用して非ゼロを取得reverseし、一致したテキストに適用された関数の結果に置き換えることができます。

すべてのテストケースをオンラインで検証してください!



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
@catいいえ、いいえ、それを保持しますが、実行するときにラムダを見てください。
コナーオブライエン


3

Python、58 50バイト

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

文字列xを受け取り、ゼロで分割し、分割内の各要素を反転し、ゼロを追加して、this-last last zeroを返します。


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

明日がないように暗黙のキャストを乱用します。このインデックス作成のトリックよりも短いリバース用のビルトインはないため、それほど短くすることはできません。

説明

これがどのように機能するかの例- 123045入力があったとします$args-splitonの後、0パイプラインには配列が含まれます(123,45)。の最初のループ|%{...}の現在の要素はに$_等しく123、これは暗黙的に文字列としてキャストされ、[]インデックス付けで反転されます。それは('3','2','1')文字配列としてそれを作ります。ループはそれを-join文字列に戻し"321"、パイプラインに残します。次の(最後の)ループ反復は、への入力を逆にします"54"。だから今私たちのパイプラインがあります"321""54"。それは括弧にカプセル化されている()ので、配列に再形成され、-joinゼロで一緒に戻されて、結果の出力文字列が生成されます"321054"。これはパイプラインに残り、コンソールへの出力は暗黙的です。

元の入力に後続のゼロがある場合、配列にはnull要素が入力されるため、出力には正しい数のゼロがあります。たとえば、上記のよう1230045-split0(123,,45)なり、物事は続きます。



2

ファクター、35バイト

PyfonとClojureを打ち負かす

[ "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ます。

最初の2つはいくつかのコードを繰り返しますが、それらを組み合わせるより短い方法(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にもう1組の括弧が必要だと思いますr%(h:t)=(h:r)%t
。– nimi


1

JavaScript(ES6)、50 49バイト

文字列バージョン:

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

@Kevin Lauのおかげで1バイト節約できました!

配列バージョン(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に感謝します!スペースで区切られたリストを正しい引数として受け取ります。

-Zbyteのおかげで2バイト!


1

Clojure / ClojureScript、44文字

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

他のソリューションと同じソリューション、長い関数名のおかげでより冗長になりました。そのために投稿するつもりはありませんでしたが、他の回答よりも優れているので、なぜそうではないのですか?

任意のシーケンスタイプで動作します。ClojureScriptでは、文字列は文字のリストとして処理可能であるため、文字列でも機能します。文字列は実際には長さ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クラスのaddメソッドを呼び出して文字を追加します。


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バイト

-pオプションに+1を含める:

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

これはかなり些細な代替です-とても退屈して申し訳ありません。あなたの入力は改行で終了する(例えば使用している場合は、その注意perl -pe 's/[^0]+/reverse$&/eg' <<<21000543使用を- Bashの中で)、それは数字で改行をキャッチするecho -nか、printfそれを避けるために。または、1バイトの追加コストで、文字クラスをに変更し、[1-9]1行に1つずつ多くの入力を提供できます。


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数字のリストをヌル文字で終了する文字列として呼び出すと、正しい出力が出力されます。

ゴルフをしていないと説明:

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コマンドにバグがあることに気付きました。空のスプリットは保持されません。回避策として、a分割、反転、結合を行う前に入力文字列をsで囲み、次に削除しますa、最後にsをます。入力は文字列として取得され、出力は単一文字の文字列のリストです。

オンラインで試す

説明:

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

なし:

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メソッドが、最初の文字列のすべての出現を2番目の文字列に置き換えるためです。このバグは、反転したときに1つのパターンが表示される(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;}

非ゴルフ

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はすでにここ2バイトで自分のコードを打つC#のためのソリューションを、掲載していたことに気づいた...(それは....もっとすることができます)
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);}

and でs先頭の変数を宣言する場合、forループでの型宣言を省略できますか?rt[]s
チョイス

いいえ、私はチェックしましたが、拡張forループには新しく宣言された変数が必要です。
願わくば

ハァッ それは変だ。まあ
チョイス

0

Clojure、37バイト

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

#{0}代わりにpos?(で連結して1バイトを保存%)およびのmapcat代わりに使用します(flatten(mapFactorよりもまだ長い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.