私は失礼な番号ですか?


72

しばらくの間、指で数えるときに問題に直面していました。具体的には、数が10にしかならないということです。この問題に対する私の解決策は、指を2進数で数えることです。1つは親指、2つは人差し指、3つは親指と人差し指の両方などです。しかし、ナンバー4。具体的には、中指を立てる必要がありますが、これはかなり残念なジェスチャーになりますが、これは通常社会では受け入れられません。このタイプの数は失礼な数です。36で次の失礼な数字になります。2番目の手の親指と1番目の手の中指を上げます。失礼な数の定義は、このカウントのシステムの下で、私たちだけが我慢するような数です任意の手の中指。1023(1人で到達可能な最大数、それぞれ5本の指の2本の手)を超えると、必要に応じて追加の手が追加された3番目の手で続行すると仮定します。

あなたのタスク:

入力を受け取り、その入力が失礼な数であるかどうかに基づいて真実/偽の値を出力するプログラムまたは関数を作成します。

入力:

0〜10 9の整数(両端を含む)。

出力:

入力が失礼な数字であるかどうかを示す真実/偽の値。

テストケース:

Input:    Output:
0   --->  falsy
3   --->  falsy
4   --->  truthy
25  --->  falsy
36  --->  truthy
127 --->  falsy
131 --->  truthy

得点:

これはであるため、バイト単位の最低スコアが優先されます。


43
assume we continue with a third hand、失礼になると、チームワークは夢を実現します。
ベスカ

5
@Veskahは、質問の範囲内で、任意の数を作成するのに必要なのは3人だけであることがわかりました。確かに、古い種類の指を頼りにしています。
グリフォン

12
あなたがイギリス人ならもっと悪い-6も失礼だ!
マシュー

1
10以外のベースで入力を取得しても大丈夫ですか?
wastl

2
5もかなり失礼なようです。わからない誰もが「ああ、彼女は彼女の親指を持っていたが、それは完全に丁寧だ」と言うでしょう
ale10ander

回答:



17

正規表現(ECMAScript)、37バイト

入力は、xsの文字列の長さとして、単項です。

^((?=(x+)(\2{31}x*))\3)*(x{32})*x{4}$

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

^
(
    (?=(x+)(\2{31}x*))    # \2 = floor(tail / 32); \3 = tool to make tail = \2
    \3                    # tail = \2
)*                        # Loop the above as many times as necessary to make
                          # the below match
(x{32})*x{4}$             # Assert that tail % 32 == 4

13
私は正規表現を知っていると思ったが、明らかにそうではなかった。
CTホール



8

ルビー、36 19バイト

->n{n.to_s(32)[?4]}

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

@tshのメソッドで17バイトを保存しました。


これは、のバイナリ表現有し、2207のために真を返す100010011111
無知の実施の形態

@EmbodimentofIgnoranceそれは正しい結果ですよね?秒針は00100です。
ドアノブ

私はRubyを話せません。しかし、なぜ->n{n.to_s(32)=~/4/}ですか?
tsh

1
@tsh、私はあなたほど賢くないので:)
Doorknob

質問を理解していないが、2207の最初の手10001、2番目00111、3 番目の手ではない場合はご容赦ください11。それらのどれも中指だけを持っていません
無知の

8

APL + WIN、10バイト

整数の入力を求める

4∊(6⍴32)⊤⎕

10 ^ 9をベース32表現の6要素のベクトルに変換し、4要素が要素に存在するかどうかを確認するには、6つの手が必要です。




6

x86マシンコード、17バイト

6A 20 59 85 C0 74 09 99 F7 F9 83 FA 04 75 F4 91 C3

上記バイトは入力として数値を取る関数定義EAXレジスタ、ブール値として結果を返すEAXレジスタ(EAX== 0入力された場合ではない。失礼数EAX!= 0の入力があればある失礼数が)。

人間が読み取れるアセンブリニーモニックの場合:

; Determines whether the specified number is a "rude" number.
; Input:    The number to check, in EAX
; Output:   The Boolean result, in EAX (non-zero if rude; zero otherwise)
; Clobbers: ECX, EDX
IsRudeNumber:
    push    32           ; \ standard golfing way to enregister a constant value
    pop     ecx          ; /  (in this case: ECX <= 32)
CheckNext:
    test    eax, eax     ; \ if EAX == 0, jump to the end and return EAX (== 0)
    jz      TheEnd       ; /  otherwise, fall through and keep executing
    cdq                  ; zero-out EDX because EAX is unsigned (shorter than XOR)
    idiv    ecx          ; EAX <= (EAX / 32)
                         ; EDX <= (EAX % 32)
    cmp     edx, 4       ; \ if EDX != 4, jump back to the start of the loop
    jne     CheckNext    ; /  otherwise, fall through and keep executing
    xchg    eax, ecx     ; store ECX (== 32, a non-zero value) in EAX
TheEnd:
    ret                  ; return, with result in EAX

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


1
idivしかし、使用する興味深いアイデア。これに対する漸進的な改善は見られません。しかし、私の答えを参照しください:MOV / AND / SUB / JZを使用して無作法の低5ビットをチェックするシフトループの場合は14バイト。
ピーターコード

4

ジュリア1.0、25バイト

f(n)=n%32==4||n>0<f(n>>5)

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

ジュリア1.0、26バイト

1文字短いが1バイト長い代替案は、ユニコードで3バイトを必要とします。

n->'4'string(n,base=32)

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


n->n%32...2バイト短い最初の回答に使用できますか?
ジュゼッペ

@Giuseppe、残念ながらいいえ、その関数は再帰的です。
キリルL.


4

カトリコン、4バイト

ǔ?QǑ

数値をbase-256文字列として受け取ります。

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

テストスイート


2
うーん、これが許可されている場合、代わりにベース32の数字を受け入れることができますか?
再帰的

@recursiveあなたには数字を囲むことができます<<し、>>そしてテストスイートに示すように、それは、それらの中に255より大きい数値を可能にします。
Okx

1
これは、チャレンジに関する質問として意図されていましたが、あまり明確ではありませんでした。
再帰的な

4

C#(Visual C#Interactive Compiler)、31バイト

n=>{for(;n>0;n/=n%32==4?0:32);}

例外をスローして出力します。1つの数値を10進数から別の基数に変換する方法は、10進数をその基数で繰り返し除算し、残りを数字として取得することです。それが私たちの仕事であり、base-32のいずれかの数字の値が4であるかどうかを確認します。

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


27?ボーナスとして、それは奇妙な方法で出力しない
ASCIIのみ

1
tplig何も
ASCIIのみ

n>31n>0
@ASCII


1
プログラムが停止するかどうかは、許可された 出力方法ではありません例外による出力は許可されます。
デッドコード


3

R50 48バイト

any(2^(0:4)%*%matrix(scan()%/%2^(0:34)%%2,5)==4)

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

現在、きちんとしたマトリックスベースのアプローチを使用しています(@Giueseppe提供)。5x7のビットマトリックスを生成し、これを一連のベース32整数に変換し、4をチェックします。


@ジュゼッペおっと、それを見逃した。残念ながら19バイト長くなりましたが、今は動作するはずです。strtoiには、ベースRの16進数と8進数以外の逆関数はないと思います
Nick Kennedy

マトリックスマジックを備えた48バイト。私は、ビット変換がより長いと考えていintToBitsたが、その後、私たちはして働くことができるints代わりにrawバイトを保存するまで終了する-インスタンスを参照してこれをintToBits
ジュゼッペ・

@Giuseppeそれは私のものとはまったく異なる(そしてきちんとした)ソリューションです-あなたは私に私のものを更新したいのですか、それともあなた自身のものを投稿しますか?
ニックケネディ

あなたはそれを自由に取ることができます。:-)
ジュゼッペ

1
もちろん、4base-32の数字の存在をテストする多くの回答の1つを移植することは、おお、29バイトです。
ジュゼッペ



2

、6バイト

№⍘N³²4

オンラインでお試しください!リンクは、コードの詳細バージョンです。-数がどれほど失礼であるかに従ってsを出力します。説明:

  N     Input as a number
 ⍘      Convert to base as a string
   ³²   Literal 32
№       Count occurrences of
     4  Literal string `4`

私はのための数値リテラルを分離することを避けるために、文字列ベースの変換を使用32して4




2

Cubix、26バイト

u!@-W14;OIS%/\;;,p;?wO@u/s

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

次のように、辺の長さが3の立方体にラップします

      u ! @
      - W 1
      4 ; O
I S % / \ ; ; , p ; ? w
O @ u / s . . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

実行を見る

かなり基本的な実装であり、リダイレクトを一切行いません。

  • IS 入力と32をスタックにプッシュすることによりプログラムを開始します
  • %4-! 剰余を取得し、減算により4かどうかを確認します
  • 1O@ 4の場合は1を出力し、停止します
  • ;;, スタックをクリーンアップし、整数除算を行います
  • p;? スタックの下部をクリーンアップし、divの結果が0かどうかを確認します
  • O@ divが出力をゼロにして停止した場合
  • s スタックの先頭を交換し、上記のステップ2からやり直します

2

@ルイス私は間違いなくドロップすることができますG(最初にそれを含めた理由はわかりません)が、それはたった1バイトです(見つけてくれてありがとう!)に変更32YA52する32_YA4と、同じバイト数が正しいですか?
Sanchises

あ、はい、数えられません
ルイス・メンド

2
@ルイスカウント?誰があなたができるかを数える必要がある'32_YA4'n'32YA52'n-
Sanchises

2

バッチ、77 45バイト

@cmd/cset/a"m=34636833,n=%1^m*4,(n-m)&~n&m*16

これらのちょっとしたハックに基づいています。説明:サポートが必要な入力の範囲(30ビット)が制限されているため、チェックする必要があるのは6つの針だけです。マジックナンバーm11111132 進数と同等であるため、最初の操作で入力番号の無意味なビットが切り替わります。その後、6つのハンドのどれが現在ゼロであるかを見つけるために残ります。


2

x86マシンコード、14バイト

(同じマシンコードは16ビット、32ビット、および64ビットで動作します。16ビットモードでは、32ビットおよび64ビットモードのEAXおよびEDIの代わりにAXおよびDIを使用します。)

アルゴリズム:で下位5ビットをチェックしx & 31 == 4、次に5ビット右シフトし、シフト結果がゼロ以外の場合は繰り返します。

char isrude(unsigned n);x86-64 System Vの呼び出し規約に従ってCから呼び出し可能。0は真実であり、0以外は偽です(これはC 1ではなくasm です)。

 line   addr    code bytes
  num
     1                             ; input:  number in EDI
     2                             ; output: integer result in AL: 0 -> rude, non-zero non-rude
     3                             ; clobbers: RDI
     4                         isrude:
     5                         .check_low_bitgroup:
     6 00000000 89F8               mov    eax, edi
     7 00000002 241F               and    al, 31          ; isolate low 5 bits
     8 00000004 2C04               sub    al, 4           ; like cmp but leaves AL 0 or non-zero
     9 00000006 7405               jz    .rude            ; if (al & 31 == 4) return 0;
    10                         
    11 00000008 C1EF05             shr    edi, 5
    12 0000000B 75F3               jnz   .check_low_bitgroup
    13                             ;; fall through to here is only possible if AL is non-zero
    14                         .rude:
    15 0000000D C3                 ret


    16          0E             size:  db $ - isrude

これはop al, imm8、ANDおよびSUBの短い形式のエンコードを利用します。私はXOR al,4平等で0を生成することもできましたが、SUBはSandybridgeファミリの単一のサブおよびブランチuopにJZとマクロ融合できるため、より高速です。

楽しい事実:P6ファミリでは、シフトのフラグ結果を1以上使用するのは遅くなります(シフトが終了するまでフロントエンドのストール)が、それは問題ありません。


脚注1:これは、アセンブリ言語の関数である、とx86のasmの両方を持っているjzjnzして、メタあたりとして、私はどちらかの方法を選択することができます。私はこれをCの真実/偽物に一致させるつもりはありません。

EFLAGSの代わりにALで返すのが便利なため、ラッパーなしでCコンパイラーに関数を記述できますが、Cの呼び出し元を使用してテストすることで、真実/偽の選択は制約されません。


2

ES6、31の 30 26バイト

b=>b.toString(32).match`4`

これをさらに減らす方法についてのアイデアがあれば、お気軽にご連絡ください。


PPCGへようこそ!
ライコニ

関数の名前を数える必要はありません。を使用してバイトを保存できると思いますが、数値としてtest照合し、それを文字列に変換してからRegExpに変換することで4、実際に2バイトを保存できmatchます。 。
ニール

1

Retina 0.8.2、31バイト

.+
$*
+`(1+)\1{31}
$1;
\b1111\b

オンラインでお試しください!リンクにはテストケースが含まれます。数値が失礼でない限り、ゼロを出力します。入力を単項に変換し、次に単項エンコードされたベース32に変換4し、結果のs の数をカウントすることにより機能します。




1

Wolfram言語(Mathematica)37バイト 36バイト 29バイト

-2バイト、ジョナサンフレッチ

#~IntegerDigits~32~MemberQ~4&

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

31バイトのソリューション:

MemberQ[IntegerDigits[#,32],4]&

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


こんにちは、PPCGへようこそ。現状では、式は単一のブール値です。完全なプログラムまたは関数(...#...&Mathematicaでよく使用されます)のいずれかに答えを修正してください。
ジョナサンフレッチ

こんにちは。これはあなたの言うことですか?
ライナー・グリューゲ

plsは、W | Aの代わりにtio.run/#mathematicaを使用して、有効な数学コード:Pであることを確認します。[n]最後に必要はありません&。投稿は編集履歴を持っていることからも、それは以前のエントリを残すために罰金だし、昔のスコアのための規則はある<s>40</s> <s>36</s>
ASCIIのみ

はい。これが私が意図したことです。29バイト
ジョナサンフレッチ

関数型プログラミングスタイルに慣れる必要があると思います。
ライナー・グリュージュ

1

Javaの8、28の 22 21バイト

n->n%32==4|n>>5%32==4

@ kevin-cruijssenの回答に触発されました。2ハンドでのみ機能します。

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

説明:

n->                 // Method with int parameter and boolean return-type
  n%32              // Only consider right 5 bytes (fingers)
  ==4               // Middle finger
  | ... n>>5       // Repeat with shifted bits for other hand

答えは両手で働かなければならないと確信しています
無知の体現
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.