退屈な数字を見つけるためのゴルフ


22

整数に連続して繰り返される数字/数字のシーケンスが含まれている場合(私が「連続的に」と言った理由は理解できます)、5回以上、「退屈」と呼びます。

たとえば、11111退屈ですが、そうで12345はありません。

説明書

入力として整数を取る

整数が退屈であれば真理値を出力し、整数が退屈でなければ偽値を出力します。

11111=> trueまたは1(1回5回繰り返す)

12345=> falseまたは0

1112111=> falseまたは0

4242424242=> trueまたは1(42回5回繰り返す)

-11111=> trueまたは1

3452514263534543543543543543876514264527473275=> trueまたは1(543回5回繰り返す)

他のタイプの「真」および「偽」を使用する場合は、それを指定します。

ルール

基本的な規則が適用されます。

がんばろう!


されて1112111退屈?
リーキー修道女

1
されて4242424242退屈?
16

4242424242は退屈ですが、1112111は退屈ではありません。

22
今日は誰も好きではない数字の日だと思います。:)
Seims

12
厳密に言えば、すべての数値は任意の数の先行ゼロで書き込むことができるため、すべて退屈です。:
celtschk 16

回答:


13

05AB1E、8バイト

コード:

Œv¹y5×åO

説明:

Œ         # Compute all substrings from the input.
 v        # For each substring.
   y5×    # Repeat the substring 5 times (42 × 5 = 4242424242).
  ¹   å   # Check if it's in the input string.
       O  # Sum up the result. Non-boring numbers should give 0.

Truthyはゼロではなく、falsyはゼロです。CP-1252エンコードを使用します。

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


1
と組み合わせŒて使用すると便利×です。
エミグナ16

1
@Adnan Nice Work!c =

23

網膜、9バイト

(.+)\1{4}

すべてのテストケースを確認してください!(すべてのテストケースを一度に実行するために少し変更されています。)


4
待って、人々はこれを速くやっている?

これを投稿するには遅すぎました。Retinaがこのチャレンジを気に入ってくれることを知っていました:)
エミナ

@Emignaごめんxd
リーキー修道女

1
@LuisMendo同じかどうかに関係なく、5つ以上の何かに一致しませんか?たとえば、一致します12345
エミグナ

4
@LuisMendoはに(.+){5}(.+)(.+)(.+)(.+)(.+)がに(.+)\1{4}展開され(.+)\1\1\1\1ます。
リーキー修道女



4

Lua、35バイト

まあ、私はLuaのパターンをもっと良くする方法がわかりません!nil虚偽の場合の入力および出力としてコマンドライン引数を受け取り、真実のときに繰り返される数。

print((...):match("(%d+)%1%1%1%1"))

4

JavaScript、16バイト

node.js(60バイト)

process.stdin.on('data',t=>console.log(/(.+)\1{4}/.test(t)))

無駄トン入力/出力にバイトを。

JavaScript ES6(33バイト)

alert(/(.+)\1{4}/.test(prompt()))

再び入力/出力のバイトを無駄にします。

できれば、匿名関数として(22バイト)

n=>/(.+)\1{4}/.test(n)

またはさらに短い(16バイト

/(.+)\1{4}/.test

間違いを指摘してくれた@BusinessCatに感謝します。


1
/(.+)\1{4}/.test(n)代わりにmatch、数バイトを節約できます。また、実際には何も出力されないようです。
ビジネス猫

@BusinessCatあなたは絶対に正しいです、私は質問でそれを見逃したと思います。提案をありがとう。
チャーレッドグラス16

あなたは、関数の引数を使用することができ、標準入力を取る必要はありません

2
Uncaught TypeError: Method RegExp.prototype.test called on incompatible receiver undefined。それが技術的に正しい答えとしてカウントされるかどうかはわかりませんが、それは次のようなものである必要はありません/./.test.bind(/(.+)\1{4}/)か?
パトリックロバーツ

質問は、「5 回以上繰り返される任意の数」は退屈だと述べています。
歯ブラシ

3

Pythonの3.5、49 43バイト:

Martin Enderからのヒントのおかげで-6バイト!

import re;lambda u:re.search(r'(.+)\1{4}',u)

正規表現を使用して、5回以上連続して繰り返される限り、すべての繰り返し文字シーケンスに一致します。一致が真の値として検出され、何もまたは偽の値として検出されない場合、re一致オブジェクト(など<_sre.SRE_Match object; span=(0, 10), match='4242424242'>)を返しますNone

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


3
ああ、万能の正規表現。

2
交換する{4,}ことで{4}
リーキー修道女

@LeakyNunええ、それも動作します。
R.ガプス

\1正規表現グループの後ですか?
スピードプレーン

@speedplaneグループからの一致の後続の発生に一致します。
R.ガプス

2

Perl、17 15バイト

$_=/(.+)\1{4}/

+ pフラグ。

(で実行perl -pe '$_=/(.+)\1{4}/'

(.+)代わりにDom Hastingに感謝し(\d+)ます。

必要に応じて説明: (.+)番号の任意の部分に一致し、\1{4}$連続して4回繰り返されるかどうかを検索します。


良いものですが、より良いゴルファーがいます。それでもまだ良い。

4
Perlがそれ以上うまくいくかどうかはわかりません...そして、私はまだPerlソリューションを提出したかったので、ここにあります。
ダダ

説明を追加できますか?

退屈な$_=/(\d+)\1{4}/ように代わりにあなたが必要かもしれないと思う111112が、これはそれをキャッチしません。/./Retinaの回答に従って使用することもできます。
ドムヘイスティングス

1
うん、あなたは正しいです、私は退屈なものだけで十分だったときに「非常に退屈な数字」と一致しようとしています
ダダ

1

C#-93 38バイト

s=>new Regex(@"(.+)\1{4}").IsMatch(s);

文字列を受け取り、整数を返します。

たくさんのバイトを節約してくれたaloisdgに感謝します!


ただし、引数を文字列として受け取ることができます。これにより、バイトを節約できます。
リーキー修道女

1
ではないでしょう@"(.+)\1{4}"にも正規表現として動作しますか?少なくとも私のC#環境では。
エミグナ16

ラムダを使用できます。許可されています。s=>Syst...
aloisdgは回復モニカ言う

@Emigna-C#環境に関係なく、間違いなく機能します。連続する5文字以上の文字は、連続する5文字に対しても機能します。
チャーレッドグラス16

1
また、s=>new Regex(@"(.+)\1{4}").IsMatch(s);.NET(彼のstdlib)にとどまり、using System.Linq;またはに数えられないので、書くことができるはずだと思いますusing System.Collections.Generic
aloisdgは回復モニカ言う

1

Pyth9 8バイト

Maltysenのおかげで1バイト。

sm} * 5dQ .:
f} * 5TQ .:

真の値は空ではない配列です。

偽の値は[](空の配列)です。

テストスイート。

f}*5TQ.:   input as a string stored in Q
f}*5TQ.:Q  implicit arguments
        Q  input
      .:   all substrings of.
f   T      filter for this condition, keep those returning true:
  *5           repeat five times
 }   Q         in Q? (True/False)

で置き換えmf合計を取り出すことで8バイトを取得します。
マルティセン16

1

Mathematica、46 40 36バイト

b=a__;StringContainsQ[b~~b~~b~~b~~b]

関数。入力および出力として文字列を受け取りますTrueまたはFalsea__~~a__~~a__~~a__~~a__5回繰り返される同じ文字シーケンスを表す式に対して文字列をテストします。参考までに、正規表現を使用した最短のソリューションは45バイト長です。

StringContainsQ@RegularExpression@"(.+)\1{4}"

RegularExpressionを呪ってください!


パターンマッチングの素晴らしい使用法。
マイル

1

PHP、37 33バイト

NoOneIsHereのおかげで、私は忘れていました <?=

PHP <5.4のプログラム、1退屈な数字の印刷、0その他

<?=preg_match('/(.+)\1{4}/U',$n);

使用法:

  • php-cgiに設定register_globals=1php.ini
    から呼び出しますphp-cgi <filename> n=<number>;echo""
  • PHP> = 5.4の場合は$n$_GET[n]

非正規表現ソリューション、152 147 140バイト

<?for($e=$n+1;--$e;)for($f=$e;$f--;)for($a=str_split(substr($n,$f),$e),$k=$c='';strlen($v=array_pop($a));)$c-$v?$k=0&$c=$v:($k++<3?:die(1));
  • 退屈な数字のために戻って終了コード1、そうでなければ0を
    置き換えるdie(1)die(print 1)し、追加echo 0;の代わりに印刷するには
  • 上記と同じ使用法short_open_tags=1ですが、無効の場合も設定されます
  • アウターループは、ゴルフで不合理な開始値を取得しました。テスト用に置き換え$n+1られます。ceil(strlen($n)/5)+1strlen($n)

1
<?=preg_match...いくつかの文字短いです
NoOneIsHere

1

ハスケル、80(63?)

importステートメントがない場合は63になります。

import Data.List
f x=or$tail[isInfixOf(concat$replicate 5 b)x|b<-subsequences x]

使用法

f "11111211"
f "11111"
f "12345" 
f "1112111"
f "4242424242"
f "-11111"
f "3452514263534543543543543543876514264527473275"

ちなみに、連続連続よりも理にかなっています

(すみません、まだコメントできません。)


1
私が賛成票を投じてコメントできるようになったことを願っています。

0

MATLAB、26または13バイト

s=int2str(i);all(s==s(1))

これは整数変数「i」を取ります。文字列は最後の部分です。

all(s==s(1))

改行を文字としてカウントしました。


たとえば、入力を指定する必要があります。それをi=input('')使用するか、全体を機能にします(例:)@(i)...。ところで、私はそれが既に文字列として整数をとるにはあまりにもストレッチだとは思わない。PS最後のテストケースで失敗するだけでなく、簡単だと思います211111
パジョン16

質問を編集した人:しないでください。OPがしばらくしてから応答しない場合(明日など)、編集を試みることができます。また、競合しないものとして保持するのではなく、削除する必要があります。
Rɪᴋᴇʀ

0

TSQL、151バイト

ゴルフ:

DECLARE @t varchar(99)='11111'

,@z bit=0,@a INT=1,@ INT=1WHILE @a<LEN(@t)SELECT @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),@=IIF(@=20,1,@+1),@a+=IIF(@=1,1,0)PRINT @z

ゴルフをしていない:

DECLARE @t varchar(99)='11111'

,@z bit=0,
@a INT=1,
@ INT=1
WHILE @a<LEN(@t)
  SELECT
    @z=IIF(@t LIKE'%'+replicate(SUBSTRING(@t,@a,@),5)+'%',1,@z),
    @=IIF(@=20,1,@+1),
    @a+=IIF(@=1,1,0)

PRINT @z

フィドル


0

PowerShell、26バイト

$args[0]-match"(.+)\1{4}"

私は決して正規表現マスターではないので、そのための他の答えを信用してください。


0

Clojure、24バイト

#(re-find #"(.+)\1{4}"%)

clojureのfalseの値をnil/に使用し、false他のすべてにtrueの値を使用します。具体的にnilは、falseに一致するものが見つからない[]場合、11111のように一致する場合にtrueの配列["11111" "1"]はtrueです。


0

正規表現のないJS、166

b=s=>{for(let i=0;i<s.length-4;i++){for(let n=1;n<=Math.floor((s.length-i)/5);n++){if([1,2,3,4].every(k=>s.slice(i,i+n)==s.slice(i+n*k,i+n*(k+1))))return 1}}return 0}

非縮小:

// test any start pos, and length
var b = s => {
    for (let i = 0; i <= s.length - 5; i++) {
        for (let n = 1; n <= Math.floor((s.length - i) / 5); n++) {
            // test if s is boring at position i, with length n
            if ([1, 2, 3, 4].every(k => s.slice(i, i + n) === s.slice(i + n * k, i + n * (k + 1)))) {
                return 1;
            }
        }
    }
    return 0;
};

console.log(b('11111'));
console.log(b('12345'));
console.log(b('1112111'));
console.log(b('-11111'));
console.log(b('3452514263534543543543543543876514264527473275'));

1
こんにちは、PPCGへようこそ!しかし、これは本当にもっとゴルフすることができます。余分な空白だけを削除して、はるかに短いコードにすることができます。もっとゴルフするか削除してください。
Rɪᴋᴇʀ

正規表現を避けるアイデアが好きです。Replace(['boring'、 'let'、 'false'、 'true'] ['b'、 ''、 '0'、 '1']; 20文字をカットする
Coomie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.