製品カタログ


17

この問題は、製品識別子を表す文字列を3つのコンポーネントに分けることです。

  • 最初の部分は、倉庫を表す任意の長さの上下の文字で構成されます。
  • 2番目の部分は、製品番号を表す数字です。この部分も任意の長さです。
  • 最後の部分はサイズと色の修飾子であり、この部分は文字列の最後まで続きます。修飾子は、大文字で始まり、英数字で構成されることが保証されています。

各部分は明確に分けて印刷する必要があります。各部分が空でないことが保証されています。

勝者は、この問題を解決するために最小バイトを使用する人です。

例:
入力: UK7898S14

出力:
UK
7898
S14

ここで、英国は英国、7898は製品コード、S14はサイズ14です。

例2:
入力: cphDK1234CYELLOWS14QGOOD

出力:
cphDK
1234
CYELLOWS14QGOOD

ここで、cphDKはデンマークのコペンハーゲン、1234は製品コード、CYELLOWS14QGOODは黄色、サイズ14、高品質を表します。


2
各部分は空ではありませんか?
カールナップ16年

@KarlNapfはい。各部分は空ではありません。
Highace2

@Emigna追加の例が含まれるようになりました。
Highace2

「最初の部分は大文字と小文字で構成されています」–例の1つに、大文字と小文字が混在している可能性があります。また、2文字ではない国コードもあります。また、修飾子に「Quality★★★☆☆」などの英数字以外の文字を含めることはできますか?
マナトワーク

PPCGへようこそ!
エリックアウトゴルファー16年

回答:


10

Perl、12バイト

コードの11バイト+ -pフラグ用の1バイト。

s/\d+/
$&
/

実行するには:

perl -pe 's/\d+/
$&
/' <<< "CYELLOWS14QGOOD"

2
シンプルさが大好き!:)
ドムヘイスティングス

4

APL、18

{⍵⊂⍨3⌊+\1,2≠/⍵∊⎕D}'UK7898S14'
UK  7898  S14 

文字から数字へ、またはその逆への変更がある最初の2点を検索し、それらを使用して文字列を分割することにより機能します。


4

網膜28 14 10 8バイト

Dom Hastingsのおかげで4バイト節約されました。Martin Enderの
おかげで2バイト節約されました。

S1`(\d+)

オンラインでお試しください!


ダダの答え@と同じメカニズムを使用して、別の4バイト保存することができます:retina.tryitonline.net/...(TBH、おそらく多く、それがすべてだ私は!救うことができる:))
ドムヘイスティングス

@DomHastings。ああ、交換に行くのはいいアイデアです!
エミグナ

3

Haskell、36バイト(正規表現なし)

d c='/'<c&&c<':'
(span d<$>).break d

これにより、形式で結果が得られます("UK",("7898","S14"))。アイデアは、最初の桁で分割し、残りを最初の非数字で分割することです。 Ideoneで試してみてください


タプルでのfmapの素晴らしい使用。
-xnor


3

JavaScript(ES6)、 28 26バイト

s=>s.replace(/\d+/,`
$&
`)

@Graxのおかげで2バイト節約


置換で$&を使用し、括弧を削除することにより、さらに2文字減らすことができます。 s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema、17 12文字

DadaPerlソリューションから明確に恥知らずに借用された国コードを処理しないトリック。そこで感謝を表明する必要があります。)

<D>*=\n$1\n*

サンプル実行:

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

2

Python 2、40バイト

私は正規表現をあまり知りませんが、ありがたいことに、この問題は十分に単純です:)入力文字列を各部分を含む長さ3のリストに分離します。

import re
lambda k:re.split('(\d+)',k,1)

2

05AB1E39 37 16バイト

Emignaのおかげで多くのバイトを節約できました。

CP-1252エンコードを使用します。

TvDSdykF¬?¦}¶?}?

T                push "10"
 v               for each element (i.e., 1 and 0). Element is stored in 'y'
  DS             split string (input during the first iteration)
    d            for each character, 1 if digit or 0 otherwise
     yk          get index of the first occurrence of 'y'
       F         for 0 <= i < string.firstIndexOf(y)
        ¬?       print the first character of the string
          ¦      remove it from the string
           }     end inner for
            ¶?   display a newline
              }  end outer for
               ? display the remaining string

オンラインでお試しください!

(これが私の最初の投稿です!)


文字の代わりに数字をチェックすることで、少なくとも14バイトを保存できます。そして、これはおそらくもっとゴルフすることができます。
エミグナ

また、PPCGへようこそ:)
Emigna

ありがとう!そして、あなたは正しいです、実際、私はこれについて文字通り左から右へとすべて素朴に行きました。また.páà¬、最初の部分を取得するために掘ろうとしましたが、一見すると残りの部分には役に立たないようです。
-Osable

私のコードであなたの答えを自由に更新してください(そして、できればさらにゴルフをしてください)。私はそれがそれ自身の答えであることを保証するほど十分に違うとは感じません。
エミグナ

ループに入れる方法を見つけたので、それからやろう。あまり洗練されたものはありませんが、少なくとも16バイトになります。ありがとうございました!(今、説明を更新する必要があります...しかし、説明するバイト数が少なくなっています)
-Osable


1

Javaの7、200の 185 174 167バイト

import java.util.regex.*;String c(String s){Matcher m=Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);s="";for(int i=0;i<3;)if(m.matches())s+=m.group(++i)+" ";return s;}

未ゴルフ&テストコード:

ここで試してみてください。

import java.util.regex.*;
class M{
  static String c(String s){
    Matcher m = Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);
    s = "";
    for(int i = 0; i < 3;){
      if(m.matches()){
        s += m.group(++i) + " ";
      }
    }
    return s;
  }

  public static void main(String[] a){
    System.out.println(c("UK7898S14"));
    System.out.println(c("cphDK1234CYELLOWS14QGOOD"));
  }
}

出力:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C#、191 177バイト

ゴルフ:

void F(string s){var a=s.ToList();int i=a.FindIndex(char.IsDigit);int n=a.FindIndex(i,char.IsUpper);Console.Write($"{s.Substring(0,i)}\n{s.Substring(i,n-i)}\n{s.Substring(n)}");

ゴルフをしていない:

    void F(string s)
    {
        var a = s.ToList();
        int i = a.FindIndex(char.IsDigit);
        int n = a.FindIndex(i, char.IsUpper);

        Console.Write($"{s.Substring(0, i)}\n{s.Substring(i, n - i)}\n{s.Substring(n)}");
    }

EDIT1:@Link Ngは14バイトを保存しました。


ToCharArray()は必要ありません。文字列はすでにIEnumerable <char>です
リンクNg

もちろん、私はこれに気付かなかったとは信じられません。
-paldir

1

PHP、48バイト

print_r(preg_split('/(\D+|\d+)\K/',$argv[1],3));

そのでは$limit、パラメータ、および素晴らしく便利な\Kpreg_split()この挑戦に最適です。


1

MATLAB、81 73バイト

function y=f(x)
[~,~,~,m,~,~,s]=regexp(x,'(?<=^\D+)\d+');y=[s(1) m s(2)];

文字列を受け入れ、3つの文字列のセル配列を返す関数。バージョンR20105bでテスト済み。

使用例:

>> f('UK7898S14')
ans = 
    'UK'    '7898'    'S14'

>> f('cphDK1234CYELLOWS14QGOOD')
ans = 
    'cphDK'    '1234'    'CYELLOWS14QGOOD'

説明

正規表現(?<=^\D+)\d+')は、文字列の先頭から非数字が先行する数字のグループに一致します。後者は一致の一部ではありません。

の4番目の出力regexp'match';です。7番目の出力は'split'、つまり、一致の前後の文字列の2つの部分です。


1

ルビー、28バイト

->s{puts s.sub(/\d+/,"\n\\&\n")}

これは、数字の最初のクラスターを改行で囲みます。


0

jq、47文字

(43文字のコード+ 4文字のコマンドラインオプション。)

match("(\\D+)(\\d+)(.+)").captures[].string

(昔の話に戻ります:最初はかなりエレガントで、それから痛々しいほど冗長になります。)

サンプル実行:

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

オンラインテスト-rURLの受け渡しはサポートされていません-自分でRaw出力を確認してください。)


0

PHP、61 59 56 55バイト

preg_match('/(\D+)(\d+)(.+)/',$argv[1],$a);print_r($a);

これにより、初期コードも出力されます。

Array
(
    [0] => cphDK1234CYELLOWS14QGOOD
    [1] => cphDK
    [2] => 1234
    [3] => CYELLOWS14QGOOD
)

編集

私の
ために数バイトを保存してくれた@manatworkに感謝します。さらに数バイトを保存してくれた@RomanGräfに感謝します。


1
[\d]?:o \dで十分です。
マナトワーク

@manatworkありがとう。私は正規表現を十分に使用せず(おそらく良いことです)、\ dを思い出す前に[0-9] +ルートを開始しました
gabe3886

1
で置き換え[a-z]てみません\Dか?
ローマングラフ

1
noになった[a-z]ので、iフラグも必要ありません。
マナトワーク

正規表現の作業にもっと時間をかける必要があります。
gabe3886

0

正規表現のないJavaScript、84 81 79バイト

p=>{for(i=n=o='';i<p.length;){if(n==isNaN(c=p[i++])){o+=' ';n++}o+=c}return o}


2
すべての初期化を1つの場所に置くことができます:o=n=i=''
マナトワーク

そして、cへの割り当てを最初の使用法に移動しますisNaN(c=p[i++])
マナトワーク

p=>{for(i=n=o=0;i<p.length;){c=p[i++];if(n++==c<59){o+=' '}o+=c}return o}
ローマングラフ

@RomanGräf、''結果が連結されるoのため、初期化はそのままにしておく必要があります。しかし、悲しいことにあなたのコードは私のために機能していません、nは条件付きでインクリメントする必要があります。
マナトワーク

p=>{for(i=n=0,o='';i<p.length;){c=p[i++];if(n==c<59){o+=' ';n++}o+=c}return o}
ローマングラフ

0

Mathematica、39バイト

StringSplit[#,a:DigitCharacter..:>a,2]&

匿名関数。入力として文字列を受け取り、出力として文字列のリストを返します。


0

ラケット274バイト

(let((g 0)(j'())(k'())(l'())(m list->string)(r reverse)(n char-numeric?)(c cons))(for((i(string->list s)))
(when(and(= g 0)(n i))(set! g 1))(when(and(= g 1)(not(n i)))(set! g 2))(match g[0(set! j(c i j))]
[1(set! k(c i k))][2(set! l(c i l))]))(list(m(r j))(m(r k))(m(r l))))

ゴルフをしていない:

(define (f s)
  (let ((g 0)
        (j '())
        (k '())
        (l '())
        (m list->string)
        (r reverse)
        (n char-numeric?)
        (c cons))
    (for ((i (string->list s)))
      (when (and (= g 0) (n i)) (set! g 1)  )
      (when (and (= g 1) (not (n i))) (set! g 2) )
      (match g
        [0 (set! j (c i j))]
        [1 (set! k (c i k))]
        [2 (set! l (c i l))]))
    (list (m (r j)) (m (r k)) (m (r l)))))

テスト:

(f "UK7898S14")
(f "cphDK1234CYELLOWS14QGOOD")

出力:

'("UK" "7898" "S14")
'("cphDK" "1234" "CYELLOWS14QGOOD")

0

R、63 52バイト

編集:@JDLのおかげで大量のバイトを保存しました

stdinから入力を受け取り、stdoutに出力します。

gsub("([a-z]+)(\\d+)(.+)","\\1 \\2 \\3",scan(,""),T)

出力例:

[1] "UK 7898 S1"
[1] "cphDK 1234 CYELLOWS14QGOOD"

gsub (...,"\\1 \\2 \\3")より効率的ではないでしょうか?
JDL

@JDL私が従うかどうかわかりません。手間をかけたり、例を挙げたりしますか?
ビリーウォブ

のようなものですがgsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan())、おそらく最初の引数はそれよりも小さいものとして表現できます
...-JDL

@JDL非常に賢いですが、私は"\\1 \\2 \\3"置換がどのように機能するかわかりません。また、正規表現パターンを少し更新して使用しますignore.case = TRUE
ビリーウォブ

彼らは単に「の第一/第二/第3の対に捕捉されたどのような出力を意味する()ブラケット。
JDL

0

ゼリー、14 バイト

O<65ITḣ2‘ṬœṗµY

TryItOnline!

どうやって?

O<65ITḣ2‘ṬœṗµY - Main link: productIdentifier   e.g. "UK7898S14"
O              - cast to ordinals               e.g. [85,75,55,56,57,56,83,49,52]
 <65           - less than 65?                  e.g. [ 0, 0, 1, 1, 1, 1, 0, 1, 1]
    I          - incremental difference         e.g. [ 0, 1, 0, 0, 0,-1, 1, 0]
     T         - truthy indexes                 e.g. [2, 6, 7]
      ḣ2       - head to 2                      e.g. [2, 6]
        ‘      - increment                      e.g. [3, 7]
         Ṭ     - set truthy indexes             e.g. [0, 0, 1, 0, 0, 0, 1]
          œṗ   - split y at truthy indexes of x e.g. ["UK", "7898", "S14"]
            µ  - monadic chain separation
             Y - join with line feeds

0

C、107バイト

#define p(x) printf("%c",x);
f(char*s){for(;*s>64;s++)p(*s)p(10)for(;*s<58;s++)p(*s)p(10)for(;*s;s++)p(*s)}

で呼び出す:

int main()
{
   f("UK7898S14");
   return 0;
}

0

Python 2、103 94 88バイト

正規表現を使用しないソリューション

a,b=input(),""
for f in a:
 if ord(f)<58:b+=f
 elif b"":c,d=a.split(b);print c,b,d;break

単に中央から数字を抽出し、その数字をインデックスとして使用して入力をスライスします。入力を引用符で囲む必要がありますが、引用符が許可されない場所は見当たりませんでした。

-9中央の数字でaを分割し、中央のbでコンポーネントを印刷します

-6 @Shebangに感謝

テストケース

D:\>python codes.py
"UK7898S14"
UK 7898 S14

D:\>python codes.py
"cphDK1234CYELLOWS14QGOOD"
cphDK 1234 CYELLOWS14QGOOD

b!="" -> b>""c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,d5バイトを節約します。
ケード

@Shebangの非常に良いヒント。ありがとう
-ElPedro

ああ、私は空の文字列が偽物であることを忘れていました。作成するだけでさらに3バイト節約できますelif b:;)
ケイド

0

C#、74バイト

v=>new System.Text.RegularExpressions.Regex("\\d+").Replace(v,"\n$&\n",1);

Johan KarlssonがJavaScriptに対して行ったように、最初の数字セットをキャリッジリターン、数字セット、および別のキャリッジリターンに置き換えます。

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