この文字列は腕立て側転をしている文字ですか?


35

私がどこかで見たチャレンジのインスピレーションはこれでした:

「修道女」という単語は、nが腕立て側転をしているだけです

あなたの課題は、文字列を取得し、それが腕立て側転を行う最初の文字であるかどうかを判断することです。

ルール

文字列は、次の場合に車輪を動かす文字です。

  • 最初の文字は最後の文字と同じです。(手紙は頭に着くことはできません。)
  • 文字列は、1文字ごとにカートホイール文字を交互に使用します。

側転文字はnand umand wband qです。ことを注意nしてwいる一緒にない文字をcartwheeling、そしてどちらもされているwb

  • 標準の入力メソッドを使用して文字列を取得します。
  • 文字列がカートホイール文字の場合は真偽値を出力し、そうでない場合は偽値を出力します。出力は、標準の出力方法を使用して実行できます。

追加のルール:

  • 小文字の側転文字n/ u/ m/ w/ b/ のみをq処理する必要があります。
  • 入力が空になることはないと想定できます。
  • 1文字の文字列は有効なカートホイールではありません。

テストケース

Input        -> Output
nun          -> truthy
nunun        -> truthy
nunununu     -> falsy
wmw          -> truthy
wmwun        -> falsy
bqbqbqbqbqb  -> truthy
v^v^v        -> falsy
AVAVA        -> falsy
OOO          -> falsy
ununununu    -> truthy
nunwmwnun    -> falsy
nun unun     -> falsy
nunwmw       -> falsy
nnuunnuunnuu -> falsy
nwnwnwnwn    -> falsy
m            -> falsy
nunuuunun    -> falsy

勝者

同じように、(各言語での)最短のコードが勝ち!


29
b転がり込むと思いますqか?dそしてpまた、側転仲間です。それらの鍵は、反転ではなく回転することです。
エンジニアトースト

別のテストケースの提案:uwuwuwuwuwu
Kritixi Lithos

19
なぜbqbではありませんかpdp
アシェプラー

@aschepler台無しに。
MD XF

2
dpdpdp などは機能しないので、テストケースに偽の答えを付けておく必要があると思います。
trlkly

回答:


2

ゼリー、23 バイト

これには、考えられる以上の作業が必要でした!

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ

文字のリストを取り、1(真)または0(偽)を返すモナドリンク。

オンラインでお試しください!またはテストスイートをご覧ください。

どうやって?

1のインデックス付き文字リストで入力の各文字のインデックスを検索しますnmbuwq。この文字列は、有効なカートホイールのインデックスの差分の差がまたはのいずれ[-3,3]かの繰り返しになるため、ペアのインデックスが3つ離れるように配置されます[3,-3]

項目が原子「の指数」によってリストに見つからない場合、iそれを返す0、とunfound文字をペアであろうbような入力を行う、bxbxbtruthy。そのため、有効性をチェックする前に、0sは10他の値から3を超える値に置き換えられます。

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ - Link: list of characters, s
         Ѐ             - map across c in s:
        i               -   first index of c in (1-indexed; 0 if not present)
“nmbuwq”                -   literal "nmbuwq"
            ⁵           - literal 10
           o            - logical or (vectorises - replace any 0s with 10s)
             I          - incremental differences (i.e. deltas)
              A         - absolute value (vectorises)
               s2       - split into chunks of 2 (possibly with a single remainder)
                   3,3  - pair three with three = [3,3]
                 ⁼€     - equals? for €ach (1 if so, otherwise 0 - including a single 3)
                      Ȧ - any and all? (0 if any 0s or if empty, 1 otherwise)

13

sed 4.2.2、30 + 1 -r= 43 31バイト

@Neilのおかげで、最初の行を短くして12バイトを節約しました

/nu|wm|qb/!d
/^((.).)\1*\2$/!d

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

falseyの場合は入力を削除し、そうでない場合は入力に対して何もしません。

説明

-rフラグ、我々は使用する必要はありません\(し、\)グループを捕獲するため、これはバイトを保存します。

/nu|wm|qb/!                # On every line that does not match this regex
           d               # Delete
/^((.).)\1*\2$/!           # On every line that does not math
 ^((.).)                   #  the first two characters at the beginning of the line
        \1*                #  repeated
           \2$             #  with the first character at the end of the line
                d          # Delete

ここに来てsed、ウィザードは...
MD XF

@MDXF私はまだ魔法使いではありませんが、まだ初心者です:)
Kritixi Lithos

すべてがsed私にとって魔法のように見えます。:P
MD XF

1
両方の文字ペアの半分を含むかどうかを確認するだけでよく、たとえば、both unununcontains nuの2行目で、残りの文字がこれら2つと一致することを確認します。
ニール

8

JavaScript(ES6)、82 78 77バイト

ThePirateBayとMD XFが示唆するように、2つの偽の値を使用して1バイトを保存しました。

([c,...s],S='bqwmun')=>s.reduceRight((r,a)=>r&a==S[S.search(c)^++k&1],k=s>'')

テストケース


&&代わりに離れる理由は&何ですか?

@ThePirateBayさて、唯一の理由は返された偽の値の一貫性ですが、それはこのチャレンジの要件ではないようです。(使用すると、&いずれか生じるであろうfalse0。)
アルノー

@Arnauld 2番目は削除でき&ます。一貫性のない偽の値が許可されることをいつか(チャットで)指定しました。
MD XF

5

Python 3、111バイト

-Xcoder氏のおかげで2バイト。

lambda s:s[0]==s[-1]and any(any({*s[::2]}=={i[j]}and{*s[1::2]}=={i[j<1]}for j in[0,1])for i in['nu','mw','bq'])

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


2
あなたが再び担当者に私を渡すとため息
MD XF

あなたは私のバイト数に再び到達しようとしているので、これについては気分が良くありませんが、-2バイトです。
ミスターXcoder

ところで、私のソリューションが最初にあったように、ソリューションは無効です。失敗しnunununuます。
ミスターXcoder

多くのバイトを犠牲にして修正。;-;
完全に人間

5

Python 2、63バイト

lambda s:s[:3]in'ununqbqbwmwm'and s==s[:2]*max(len(s)/2,1)+s[0]

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


いい答え、サイトへようこそ!いくつかのヒント:"nu un nm mn bp pb".split()4バイトを節約することができ、いくつかの空白を削除できます。75バイト:lambda s:any(s==c[-1]+c*max(len(s)/2,1)for c in"nu un nm mn bp pb".split())
DJMcMayhem

s[0]代わりにを実行すると、1バイト節約できますc[-1]
DJMcMayhem

61バイトの答えは、unmnuとに対してTrueを返しますunmwnu(s==s[::-1])+len(set(s))が4の場合、偽陽性を返します。これは強制的に簡単です。わずか4文字でも、Trueを返します。
アーノルドパーマー

59バイトは、単一の文字入力で中断します。これを選んで申し訳ありませんが、私はPythonが好きです:)
アーノルドパーマー

例外は偽物ではありませんか?その休憩は意図的です
ハリケール

5

Python 3、71バイト

lambda n:''.join(sorted({*n[1::2]}|{*n[::2]}))in"nu,mw,bq"*(n==n[::-1])

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

-1 @HyperNeutrinoに感謝、-13に@ovsに感謝

上記のいずれかがテストケースで失敗することが判明した場合は、別の方法があります。

lambda n:(sorted(list({*n[1::2]}.union({*n[::2]})))in[[*'nu'],[*'mw'],[*'bq']])*n[0]==n[-1]

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


説明

  • ''.join(sorted(list({*n[1::2]}).union({*n[::2]})))) -奇数インデックスの文字と偶数インデックスの文字を取得し、それらを重複排除し、それらの結合によって形成されたリストをソートします。

  • in'nu,mw,bq' -それらが有効なカートと文字の組み合わせであるかどうかを確認します。

  • n[0]==n[-1] -最初の文字が最後の文字と同じかどうかを確認します。


テストケースに不合格、良い仕事+1
MD XF

@MDXFああありがとう!私はとても安心しました...> _ <
Xcoder氏17

1
uwuwuwuwuwu結果は真です
Kritixi Lithos

1
無効:nunuuunun
Harrichael

1
nuuun -> True。これは正しくないです。
再帰的

5

JavaScript(ES6)、40バイト

s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1])

入力文字列の2番目の文字と連結された入力文字列が、同じ側転文字のペアの繰り返し文字列かどうかを確認します。

テスト:

[
  "nun",
  "nunun",
  "nunununu",
  "wmw",
  "wmwun",
  "bqbqbqbqbqb",
  "v^v^v",
  "AVAVA",
  "OOO",
  "ununununu",
  "nunwmwnun",
  "nun unun",
  "nunwmw",
  "nnuunnuunnuu",
  "nwnwnwnwn",
  "m",
  "nunuuunun"
].forEach( x=>console.log( x, (s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1]))(x) ) )


ここのロジックは本当に大好きです!最後にキャラクターを追加してテストすることは考えもしなかったでしょう。ゴルフをしていても、きれいできれいなコードです。
trlkly

4

Clojure、156バイト

(fn[w](let[s["nu""wm""bq"]c #(= 1(count(set %)))e #(take-nth 2 %)r #(and(c(e %))(c(e(drop 1 %))))](and(=(first w)(last w))(r w)(some #(=(set w)(set %))s))))

これは一見困難でした!私はそれを3つのサブ問題に分けなければなりませんでした:

  • 最初の文字は最後の文字と同じですか?
  • 文字は繰り返されますか?
  • すべての文字は有効なセットの一部ですか?

私は確かに勝ちませんでしたが、これはおはよう運動でした!以下の完全な説明:

(defn cartwheel? [word]
  (let [; Valid Character Sets
        cs ["nu" "wm" "bq"]

        ; Is the list composed of only a single character?
        count-1? #(= 1 (count (set %)))

        ; Grabs every other element of the list
        every-other #(take-nth 2 %)

        ; Do the characters repeat? Works by checking if every other element is the same, then drops the first letter
        ; to check all the odd indexed characters
        repeating? #(and (count-1? (every-other %))
                         (count-1? (every-other (drop 1 %))))]

    ; Do all the predicates hold?
    (and (= (first word) (last word))
         (repeating? word)
         ; Is the set of letters in the word part of some set of the valid characters?
         (some #(= (set word) (set %)) cs))))

4

Haskell、80 78バイト

f s|l<-length s=odd l&&l>1&&any((==s).take l.cycle)(words"un nu mw wm bq qb")

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

使い方:

l<-length s        -- let l be the length of the input string

f s         =      -- return True, if
    odd l          -- l is odd and
    l > 1          -- l is greater than 1 and 
    any            -- any of the following is also True
      (     )(words "  ...  ")
                   -- apply the function to each of the words "un", "nu" ... "qb"
           cycle   --  infinitely repeat the word
      take l       --  take the first l characters
     (==s)         --  and compare to s

4

Python 2、45バイト

lambda s:s[2:]+s[1:3]==s>s[:2]in'bqbunuwmw'

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

文字列のスペースはDEL文字です。


|u|は車輪として解釈されます。
ハリケール

@Harrichael明確にするためにDEL文字を入れました。
-xnor

ただし、DEL文字は引き続き入力文字にすることができます。私はあなたの解決策が好きですが、あなたは私の答えからトリックを借りる必要があります:s[:3]in'bqbqnunuwmwm'
-Harrichael

4

網膜、24バイト

G`nu|mw|bq
^((.).)\1*\2$

真実の場合は1、偽の場合は0を出力します。

ポート・オブ・カウズの答え。

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


新しいバージョンはnunwmwnun(それがfalseである必要がある場合)の真実を出力し\1*ます。
Kritixi Lithos

@Cowsquack Ahなるほど。
Okx

最初の行は、することができG`nu|mw|bp、すべてのtruthy文字列は、それらの文字のペアのいずれかが含まれ、2行目は、文字列の残りのすべてがあまりにもこれらの文字が含まれていることを確認しますので、...
ニール

@Neilそれはテストケースに失敗しましたununununu
Okx

@Okx Neilの提案はまだそのテストケースで機能しているようです。オンラインで試してみてください!
Kritixiリソス

3

グライム、28バイト

e`..-#!"nu\|bq\|mw"oTv&..v+.

オンラインでお試しください! プリント1truthy入力用と0falsyもののために。

説明

グライム構文は正規表現に似ており、グライムプログラムは文字の長方形と一致する場合と一致しない場合があるパターンを指定します。

e`..-#!"nu\|bq\|mw"oTv&..v+.
e`                            Match input against pattern:
      !                       Does not
     #                        contain
  ..                          a 2-character substring
    -                         which is not
       "nu\|bq\|mw"           any of these strings
                   oT         potentially reversed,
                     v&       AND
                       ..     two characters
                         v+   one or more times
                           .  then one more character.

これを短縮するのに役立つGrimeのいくつかの機能:

  • 通常、文字リテラルはバックスラッシュでエスケープする必要がありますが、これを""変更します。構文要素はエスケープされますが、リテラルはエスケープされません。引用符がないと、文字のペアを列挙する部分は次のようになります(\n\u|\b\p|\m\w)oT
  • 二項演算子(ここでは-)に続く単項演算子は、その結果に基づいて動作します:..-#!"…"oTはと同等(..-"…"oT)#!です。
  • vsがそれに続く構文要素の優先順位を下げます。単独の&優先順位はの場合よりも高くなりますが-v&低くなります。同様に、..+はとして解析されます.(.+)が、..v+と同等(..)+です。



2

ゼリー、27バイト

Ḋm2Qµ³m2Q;Ṣe“nu“mw“bq”ȧ³⁼U¤

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

使い方

Ḋm2Qµ³m2Q;µṢe“nu“mw“bq”ȧ³⁼U¤  Main link; z is the argument
Ḋ                             z[1:]
 m2                           z[1::2]
   Q                          deduplicate(z[1::2])
    µ                         New Chain
     ³                        z
      m2                      z[::2]
        Q                     deduplicate(z[::2])
         ;                    deduplicate(z[1::2]) + deduplicate(z[::2])
          Ṣ                  Sort the result
           e                 Is it an element of the following?
            “nu“mw“bq”       ["nu", "mw", "bq"]
                      ȧ      It has the correct characters and:
                       ³  ¤  Nilad followed by links as nilad
                       ³     z
                        ⁼      == 
                         U        z[::-1]
                          ¤  [End chain]

ゼリー... Pythより長い?!
ミスターXcoder

@ Mr.Xcoder shhhh私はそれに取り組んでいます... xD
HyperNeutrino




1

Python 3、88バイト

lambda x:[len(x)%2,x[:2]in'nu,un,bq,qb,mw,wm',len(set(x[::2])),len(set(x[1::2]))]==[1]*4

len(x)%2:偶数長の文字列は最初の文字で終了できません

x[:2] in:6つの有効な開始ペアのいずれかを確認します

len(set()):0,2,4 ...および1,3,5 ...の文字セットの長さを取得します

True評価のリストが[1,1,1,1]またはelseに等しいかどうかを返しますFalse

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


1

Perl 5、55 + 1(-p)= 56バイト

$c={"nuunmwwmbppb"=~/./g}->{$l=chop};$_=/^($l$c)+$/&&$c

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

最初の文字の「逆さま」バージョンをtrueに対して出力し、falseに対しては何も出力しません。


しっかりした18バイトで私を打ち負かしてください いい答えだ!
シルヴィオマヨロ

それほど多くはありません。オリジナルは、すべて同じ文字の文字列に対してtrueを返していました。
-Xcali

1

PHP、59 + 1バイト

<?=preg_match('#^(nu|un|mw|wm|bq|qb)\1+$#',$argn.$argn[1]);

でパイプとして実行し-Fます。

部分正規表現ソリューション、101 + 1バイト:

for($s=$argn;$c=$s[$i++];$p=$c)$c!=$p||die;echo$i%2<1&&preg_match("#^(nu|mw|bq)#",count_chars($s,3));

偽の出力は空です。でパイプとして実行し-nRます。



1

MATL、25バイト

'nuwmbq'&mq2&\d~wdts~Gnqv

ouputを非空の数値列ベクトルであるtruthyは、すべてのエントリがゼロでない場合、及びfalsyさもなければ。オンラインでお試しください!

すべてのテストケース検証するにはifブランチは文字列で任意のtruthy値を置き換えフッターに追加され'truthy'た文字列によって、または任意のfalsy値'falsy'、およびその文字列を表示します。

説明

'nuwmbq'  % Push this string
&m        % Implicit input. For each char, push index of membership in the above
          %  string, or 0 if not member
q         % Subtract 1
2         % Push 2
&\        % Divmod. Pushes remainders, then quotients
d~        % Consecutive differences negated. Gives an array of ones iff all
          % quotients were equal
w         % Swap. Moves remainders to top
d         % Consecutive differences. Gives nonzeros iff no consecutive
          % remainders were equal
ts~       % Duplicate, sum, negate. Gives true iff sum was 0. For unequal
          % consecutive differences of remainders, this corresponds to an odd
          % number of remainders
Gnq       % Push input, length, subtract 1. True iff input longer than 1
v         % Concatenate into column vector. Truthy iff all entries are nonzero


0

Clojure、115バイト

(apply some-fn(map(fn[r]#(re-matches r %))(map(fn[[x y]](re-pattern(str x"("y x")+")))["nu""un""mw""wm""bq""qb"])))

各文字のペアから正規表現を構築し、入力が一致するかどうかを確認します。これらのすべての部分を行うためのよりエレガントな方法がたくさんありますが、それらはすべてより冗長です。これがClojureゴルフのある生活です。


0

Perl 5、68 + 1 = 69バイト

if(/../&&$&=~/nu|un|bq|qb|mw|wm/){s/^($&)*//;$&=~/./;print if/^$&$/}

で実行し-nます。

説明:

# Match the first two characters, and if they exist, then...
if (/../ &&
 # Make sure they are a pair of compatible cartwheel characters.
 $&=~/nu|un|bq|qb|mw|wm/) {
  # If that's true, then eliminate as many of that pair of characters
  # from the beginning of the string as possible.
  s/^($&)*//;
  # Then get the first character out of the match (the first character
  # of the original string).
  $&=~/./;
  # Print the text (which is truthy since it's nonempty) if the original
  # first character matches exactly the remaining string.
  print if/^$&$/
  # Otherwise, print nothing (the empty string in Perl is falsy).
}

0

TXR Lisp、50バイト

(f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)

実行:

1> (f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)
#<intrinsic fun: 1 param>
2> [*1 "nun"]
"nun"
3> [*1 "nuns"]
nil
4> [*1 "mwm"]
"mwm"
5> [*1 "wmw"]
"wmw"
6> [*1 "abc"]
nil

f^$は、正規表現オブジェクトを受け取り、その正規表現に一致する関数をアンカーされた方法で返すコンビネータです。(正規表現オブジェクト自体は、文字列を取得し、それ自体を検索する関数呼び出し可能なオブジェクトです。)



0

TXR78 74バイト

@{x 2}@(rep :gap 0)@x@(end)@y
@(bind(x y)(#"nu un mw wm bq qb"@[x 0..1]))

システムプロンプトから実行します。プロンプトの番号は終了ステータスです:0 =成功、1 =失敗:

0:$ ./txr cart.txr 
nun
0:$ ./txr cart.txr 
abc
1:$ ./txr cart.txr 
bab
1:$ ./txr cart.txr 
mwm
1:$ ./txr cart.txr 
nununununun
0:$

説明:

  • @{x 2}:2文字に一致し、x変数にバインドします。
  • @(rep :gap 0)@x@(end):スキップされたギャップなしの繰り返し一致:0回以上の出現 x、以前に一致した有向グラフ。
  • @y:一致する行の残り、にキャプチャ yます。
  • @(bind(x y)(foo bar)):バインドxfoo、yにbarxyは既にバインドされているので、それらは一致する必要がfooあり、bar、または他の障害があります。
  • foo#"nu un mw wm bq qb"、単語リストリテラル、Lispリストの構文糖衣です("nu" "un" ... "qb")。Abind変数と変数が要素と一致する必要があり、リスト手段との間の一致。
  • baris @[x 0..1]x最初からの1文字の部分文字列。とのbind一致yにより、行の最後の文字が最初の文字に一致するように強制されます。

0

C ++、268バイト

#include<map>
#include<string>
std::map<char,char>c{{'n','u'},{'m','w'},{98,'q'},{'w','m'},{'u','n'},{'q',98}};
int w(std::string s){if(s[0]!=s[s.size()-1]||c.find(s[0])==c.end()||s.size()<3)return 0;for(int i=0;i<s.size()-1;i+=2)if(s[i+1]!=c[s[i]])return 0;return 1;}

2文字だけでなく、すべての文字にASCII値を使用して10バイト節約します。
MD XF

@MDXF n= 110、u= 117、m= 109、w= 119、q=113。したがって、ASCII値を使用しても、c(99)を超える文字には関係ありません
-HatsuPointerKun

0

JavaScript(ES6)、63バイト

s=>/bq|wm|un/.test(s)&s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

1またはを返します0

説明

すべてのカートホイール文字列には、bqwm、またはunの 1つ以上が含まれます。以下についてテストします。

/bq|wm|un/.test(s)

カートホイール文字列の最初の2文字のすべてのインスタンスを何も置き換えない場合、文字列の最初の文字が残ります。以下についてテストします。

s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

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