黄色の木に分かれた2つの道路(パート1)


14

これはシリーズの最初であり、2番目は黄色の木で分岐した2つの道路です(パート2)

この課題は、ロバートフロストの有名な詩「The Road Not Taken」に触発されています。

2本の道が黄色い木に分かれていて、
残念ながら私は両方を旅行することはできず
、一人の旅行者であり、長く立っていて、できる限り
1本を見下ろしてい
ました。

それから、もう一方を公平に取りました。
そして、おそらくより良い主張を持って
います。
それについては、そこのパッシングは
本当に同じように着用していましたが、

そして、その朝の両方が平等に
横たわり、黒が踏まれた段差はなかった。
ああ、私は別の日のために最初を保った!
しかし、道が道にどのようにつながるかを知っていたので、
私は戻ってくるべきかどうか疑っていました。

私はこれを
どこか年齢と年齢のため息で告げるつもりです:
2本の道が森の中に分かれていて、
私は旅の少ない道を取りました。
そしてそれがすべての違いを生みました。

最後から2番目の行に注目してくださいI took the one less traveled by,

あなたの実際の挑戦

次のような形式で入力を受け取ります。

#     ##
 #   ##
  # ##
   #
   #
   #

細い道を見つける必要があります。

道路はから始まり#ます。常に一番上の行で終わる他の2つの道路は、調査する必要がある道路です。最も太い道路は最も多くの人が通っているので、あなたが望む通りではありません。もう1つは最も移動が少なく、必要なものです。

出力

プログラム/関数は、2つの異なる値(たとえば、0または1、trueまたはfalse)のうちの1つを出力する必要があります。たとえば、撮影されていない道路が撮影された道路の左側にある場合は0を出力し、そうでない場合は1を出力するか、文字列「left」または「right」、true、falseなどを出力できます。

テストケース:

 ##    #
  ##  #
   ###
    #
    #
    #

「右」を出力する場合があります。

 ##  #   
  ## #  
   ###
    ##
     #
     #
     #

「右」を出力する場合があります。

 ##  #   
  ## #  
   ###
    ##
   # 
  #  
 #   

「右」を出力する場合があります。

 ##   #  
  ## #  
   ###
    #
   # 
  #  
  #  

「右」を出力する場合があります。

 #    ## 
  #  ## 
   ###
    #
   # 
  #  
  #  

「左」を出力する場合があります

 #    ## 
  #  ## 
   ###
    #
     #
     #
     #

「左」を出力する場合があります

ノート

  • これはなので、バイト単位の最短回答が勝ちます
  • 禁止されている標準的な抜け穴
  • 「左」と「右」の出力を指定する必要があり、それらは異なる必要があります
  • 入力は1つの大きな文字列になり、任意の量の行を含めることができます
  • 有効な入力について心配する必要はありません。
  • 道路は常にY字型なので、上を見るだけで済みます。
  • 何か質問がある?以下のコメント:

最も少ないバイト数が勝ちです!


1
はい、常に#と##、水平断面。
Programmer5000

1
私じゃなかった。めっちゃ好きだよ。明確に定義された、良いバックストーリーと明確な例。それはかなり簡単に実行できます。あいまいな言語を招待するという考えは余分なフレーバーを追加するだけで、いくつかの興味深い答えを促すことができると思います。
エルペドロ

1
IBM / Lotus Notesの式言語とAcc !! 回答は、あいまいな言語を簡単な質問に招待することで興味深い結果が得られることを証明しています。
Programmer5000

3
私はちょうど自分自身に言っていた:「あなたは、あなたが考えるときの課題は簡単です知って、 『ねえ、これはで簡単になりますAccの!!』」;)
DLosc

22
@ programmer5000:私はダウンボッターの一人です。それはカメレオンの挑戦のようなものであるため、私は挑戦をダウンボットしました(それは、それが道路を解析するか、そうでなければ道路を測定することのように見えますが、実際には単に「スペースで分割し、最初のセクションを取ります」)、多くの背景が接線方向にあります関連し、課題をさらに曖昧にすること。そして、それは非常に簡単だからです(通常、私に挑戦することを断念させる何か)。また、不完全に指定されています(たとえば、入力の幅を1と2以外にすることはできますか?)

回答:



18

JavaScript(ES6)、19 12バイト

編集:

よりゴルフされたバージョンは

a=>a.trim[1]

#右に戻り、左にスペースを返します。

元の:

a=>a.trim()[1]=='#'

説明

アンゴルフド

function(input) {
  return input.trim().charAt(1) === '#';
};

この関数が最初に行うことは、入力の最初と最後の空白を削除することです。これは、最初の文字が常にであることを意味し#ます。次に、そこから2番目の文字(JavaScriptが0から始まる)をチェックし、文字かどうかを確認し#ます。これはブール値を返します。パスがrightそうtrueであるなら、それが残っているなら、それは戻りfalseます。

ゴルフの仕方

ES6には、矢印関数と呼ばれる匿名関数の短縮形があります。これは、ラッパー関数を取得してそれを次のように変換できることを意味します。

input => ...;

矢印関数の規則により、残りのコードが返されます。そこからはお勧めできませんが、より短い方法なので、に変換charAt(1)[1]ました。それから私はそれを取って変えた。この場合は違いますが、問題ではありません。最後に、すべての空白の名前を変更して削除しました。=====inputa

左右に出力

パズルでは実際にプログラムが左右に出力する必要はありませんが、他の出力の例を次に示します。

a=>a.trim()[1]=='#'?'right':'left'

追加された部分はのみです?'right':'left'。これは、三項演算子、凝縮ifステートメントを作成します。これは、(ungolfed)コードが*と等しいことを意味します。

function(input) {
  let output = input.trim().charAt(1) === '#';
  if(output) {
    return 'right';
  } else {
    return 'left'
  }
};

// Function assignment not counted in byte count
let f =
a=>a.trim()[1]=='#'
<textarea placeholder="Put path in here" id="path" rows="10" style="width:100%"></textarea>
<button onclick="document.getElementById('result').textContent = f(document.getElementById('path').value)">Submit</button>
<p id="result"></p>


3
サイトへようこそ!良い説明と抜粋、それは非常に徹底的な最初の答えです。:)
DJMcMayhem

2
ありがとう。私はしばらくの間コードゴルフをサーフィンしてきましたが、最終的にはゴルフを作ることにしました。StackOverflowが私をこすり落としているとします。
デビッドアーチボルド

1
うわー、完全にアウトゴルフ!
Programmer5000

1
それは本当にクールなアプローチです。そのことを考えていませんでした。
エルペドロ

1
@ programmer5000が応答したらすぐに編集します。素晴らしいアイデアです、ありがとう。
デビッドアーチボルド


10

Acc !! 、30バイト

方法のためにAcc !! 入力を受け取り、入力が1行だけ入力された後に出力します。ただし、入力をパイプで入力するか、ファイルからリダイレクトする場合、違いに気付かないはずです。

Count i while 35-N {
}
Write N

stdinから入力を受け取ります。左側の道路があまり走行していない#場合、または右側の道路があまり走行していない場合に出力されます。オンラインでお試しください!

説明

N参照されるたびに標準入力から文字のASCII値を読み取ります。35-N真実である間にループします。つまり、while 35-N != 0またはN != 35です。したがって、ループが終了すると#、行の最初の文字を読み取りました。次に、次の文字が読み取られN、で標準出力に書き戻されWriteます。


うわー!さらに別の曖昧な言語
Programmer5000

7
@ programmer5000あいまいなプログラミング言語が必要な場合は、適切なサイトにアクセスできます。;)
DLosc

Acc !!はどこで実行できますか?GitHubリンク、Tio、またはその他はありますか?
Programmer5000

@ programmer5000 Python 3のソースコードは、ヘッダーでリンクした投稿にありますが、TIOリンクを一緒に作成できるかどうかを確認します。
DLosc

@ programmer5000 TIOリンクを回答に追加しました。
DLosc

8

網膜、5バイト

1右の0場合、左の場合に出力します。

^ *##

オンラインで試す


肯定的な結果の値が明確である必要がない場合(5バイト):

右の場合は正の整数を出力し、左の場合はゼロを出力します。

## +#

オンラインで試す


1
うわー!どのように機能しますか?答えを編集して説明しますか?
Programmer5000

1
@ programmer5000入力を正規表現と照合して一致をテストするだけです。
mbomb007

6

IBM / Lotus Notes式言語、 37 35 26バイト

編集私はいつも@Likeワイルドカードを使用すると、よりも2バイト安いことを忘れます@Contains

編集2は、実際に必要としない@if、それだけで印刷物として、1または0かどうかの式の結果に依存@True@False

@Like(@Left(a;"##");"%#%")

計算フィールド式。##フィールド内で最初に見つかったものの左側のすべてを取得し、aその#中にある場合1は左に出力し、そうでない場合0は右に出力します。

enter image description here

enter image description here

@DavidArchibaldのおかげで、22バイトのソリューションがあります。Davidsのソリューションに対する敬意から、私はそれを主な回答として投稿しません。

@Left(@Trim(a);2)="##"

これは1、右と0左に出力します。


うわー!かなりあいまいな言語です!より良い答えがすぐに来ない場合は受け入れられるかもしれません...
Programmer5000

1
以前は、私が若いプログラマーだった古き良き時代にはそれほどあいまいではありませんでした;-)
ElPedro

4

ピップ8 6バイト

a~`#+`

入力をコマンドライン引数として受け取ります(実際のコマンドラインから実行する場合は、引用符で囲み、改行をエスケープする必要があります)。#左側の道路の移動量が少なく##、右側の道路の移動量が少ない場合に出力されます。オンラインでお試しください!

説明

これは、Pipの最近追加された正規表現の最初の一致演算子を使用します。

a         First cmdline arg
 ~        Regex match the first instance of...
  `#+`    ...one or more #s (i.e. a cross-section of the left-hand road)
          Print (implicit)

簡単な正規表現ソリューション(mbomb007のRetinaアンサーのポート)は9バイトです:

`^ +##`Na

バイトカウントでコマンドライン引数をカウントしましたか?
Programmer5000

@ programmer5000コマンドライン引数を介した入力の取得は、デフォルト許可されている入力メソッドです(Pipが入力を取得する通常の方法です)。バイトペナルティは、この送信では使用していない非標準のコマンドラインフラグに適用されます。とはいえ、この特定のケースでaをaに変更し、q代わりにstdinから入力を取得できます。
DLosc

ああ。分かりませんでした。
Programmer5000

4

チップ、7バイト

AZ~S
at

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

0x0左と0x1右の出力。(TIOにはフラグ-vが含まれているため、stderrでバイナリ値を確認e*fできます。ASCIIで出力を確認するには、最初の行の最後に追加できます。)

チップは、バイトストリーム内の個々のビットで動作するため、実際にはこの特定の問題に非常に適しています。

Aは入力バイトの最下位ビットで、「#」はこのビットが設定されている入力の唯一の文字です。このビットが最初に検出されると、最初の行の最初の「#」に到達しています。

Z そのシグナルを1サイクル遅らせて、次のキャラクターを見ているようにします。

tこれで、このサイクルが完了した後に実行を終了することを意味します。最初の道路の幅よりも先を見る必要はありません。

~S最後のサイクルを除くすべてのサイクルの出力を抑制します。これがここになければ、サイクルごとに出力が得られます。

a近隣の現在の値(Aこの場合のみ)を出力バイトの最下位ビットに設定します。

これはすべて0x1、最初の「#」の直後に別の「#」が続く場合にaを取得することを意味し0x0ます。


4

C、35バイト

f(char*s){while(35^*s++);return*s;}

PragmaticProgrammerの答えと同じ考えです。最初のを見つけて、「右」と「左」の#後に続くものを出力します。#<space>

C(抜け穴)、16バイト

テストケースによると、左の道路は常に左マージンからちょうど1スペース離れているように見えます。そう...

#define f(s)2[s]

抜け穴は意図されたものではなく、それらのテストケースは不正確でした。しかし、あなたのCの答えは印象的です!
Programmer5000

3

バッチ、46バイト

@set/ps=
@for %%a in (%s%)do @echo %%a&exit/b

STDINから1行を読み取り、スペースで分割し、最初の単語を出力する#ため、左と##右に出力します。引用符で囲まれたコマンドラインパラメーターの配列が許容される場合、36バイトの場合:

@for %%a in (%~1)do @echo %%a&exit/b

最初の引数を引用符で囲まずにスペースで分割し、最初の単語を出力します。




3

Haskell、21バイト

f n=snd$span(==' ')n!!1

またはポイントフリースタイルで:

(!!1).snd.span(' '==)

「#」は右を意味し、「」は左を意味します

関数は文字列を取得し、先頭のスペースを削除してから、2番目の文字(左が細い場合はスペース、左が太い場合は#)を使用します

編集:ライコニとニミのおかげで3バイトを節約しました!


匿名関数も受け入れられるので、(!!2).dropWhile(' '==)答えとしては十分です。
ライコニ

それはだ!!1第二の要素のために。テストをに短縮でき<'!'ます。pointfreeのバージョンでは、置き換えることができますdropWhileによってsnd.span
-nimi

2

Brainfuck、32バイト

+[>,>+++++[<------>-]<--[,.>>]<]

ゴルフをしていない:

+[                       while 1
>,>+++++[<------>-]<--     3 if hash; 0 if space
[,.>>]                     print next char and break iff current char is hash
<]

#左右に印刷します。

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


2

Perl 5、8 + 1 = 9バイト

die$F[0]

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

で実行 -a(1バイトのペナルティ)で。

左の道路があまり通行されていない場合の出力は(filenameはスクリプトのファイル名です)、または# at filename line 1, <> line 1## at filename line 1, <> line 1場合右の道路の。

説明

この-aオプションは、入力を自動的に読み取り、空白の前後の列に分割し、先頭の空白を無視します。そのため、入力の最初のデータは必要なものです。こと$F[0]。また、プログラムを暗黙のループに入れますが、これは望ましくありません。ただし、を使用するとdie、文字列を出力し、暗黙的なループを同時に終了できます(say文字列を印刷するより一般的な方法である、より多くの文字は使用しません)。


素晴らしい創造性と少ないバイト数!残念ながら、すでに2バイトの回答があります。あなたは試みることに興味を持っているこのシリーズでは第三の課題を
Programmer5000

2
@ programmer5000:Perlに2バイトの答えがあるとは思いません(実際、これは現在ゴルフ以外の言語では最短の答えです)。通常、私たちは各言語で/各アプローチを介して最適なソリューションを見つけることを目指しています。そうでなければ、ゴルフ言語以外のものを使用しても意味がありません。

2

C 54バイト

char*strchr();char c(char*s){return*(strchr(s,35)+1);}

C ++ 58バイト

#include<cstring>
char c(char*s){return*(strchr(s,35)+1);}

OPが指定したので、「プログラム/関数」である可能性があるため、文字を保存する関数を作成することにしました。ただし、関数のコンパイルに必要なため、文字カウントに「#include」ステートメントとそれに伴う改行を含めました。

出力

" "左を示すスペース文字、または"#"右を示すハッシュ文字を返します。

説明

strchr()関数は、指定された文字列をウォークし、指定された文字が最初に現れる場所へのポインターを返します。1文字を保存するcharとは対照的に、整数を2番目の引数として受け入れるオーバーロードがあります。たとえば、「#」は35に置き換えることができます。次に、関数から返されたポインターに1を追加して、直後の文字を取得し、それを逆参照して、結果のcharを返します。

注意

また、この機会に、ゴルフをしようとしているときにコードを自動フォーマットするVisual Studioでの不快感を正式に表現したいと思います(╯°□°)╯︵┻━┻。

編集: CとC ++の違いと、文字を保存できる場所<3を指摘してくれたRayに感謝します。


C / C ++は言語ではありません。CとC ++には異なる意味を持つ式があります。たとえば、C ++では、関数に空のパラメーターリストがある場合、引数を取らないことを意味します。一方、Cでは、パラメーターが指定されていないことを意味します。したがって、これがCプログラムであると判断した場合、完全に合法でありながら6バイトに置き換え#include <string.h>\nchar*strchr();保存できます。(そして、何らかの理由でC ++を好む場合は、1バイトに置き換え#include <string.h>#include <cstring>保存できます。)
Ray

興味深いことに、私はそれを知りませんでした。回答を更新しました、ありがとう。
PragmaticProgrammer

1

JavaScript(ES6)、37バイト

p=s=>/^ *#( |$)/.test(s.split("\n")[0])

説明:

p を返す関数です true走行距離の少ない道路が左側にある場合に、そうでない場合にfalse。これはこのサイトでの私の最初の回答であるため、おそらくもっとゴルフをすることができます(おそらく正規表現)。

入力の先頭行を取得し、正規表現/^ *#( |$)/(文字列の先頭、任意のスペース、#、スペースまたは文字列の末尾)に一致するかどうかを確認することで機能します。

これは、人々に形式について明確にし、アイデアを生み出すためのものです。私はそれがさらに打たれ、さらにゴルフできると確信しています。ハッピーゴルフ!

p=s=>/^ *#[^#]/.test(s.split("\n")[0])
<textarea rows = "8" cols = "8" oninput = "console.log(p(this.value))"></textarea>


私はあなたがスペースの代わりに持つことができると思います[^#]
KritixiのLithos

正規表現の問題を修正しました。
Programmer5000



1

Excel、17バイト

=left(trim(A1),2)

cellの入力を想定していますA1

##右側を返し、左側を##およびスペース)を返します。


1

Dyvil、12バイト

s=>s.trim[1]

説明:

s=>          // lambda expression
   s.trim    // removes leading (and trailing) whitespace
         [1] // gets the second character

使用法:

let f: String -> char = s=>s.trim[1]
print f('...')

左と#右に(空白)を返します。


1

Java 7、166 66 63 52 43バイト

int c(String s){return s.trim().charAt(1);}

35右と32左の出力。@ClashsoftのDyvilの回答に
基づいています

説明:

int c(String s){   // Method with String parameter and integer return-type
  return s.trim()  //  Remove leading and trailing whitspaces
   .charAt(1);     //  and return the second character (as int value)
}                  // End of method

テストコード:

class M{
  static int c(String s){return s.trim().charAt(1);}

  public static void main(String[] a){
    System.out.println(c(" ##    #\n  ##  #\n   ###\n    #\n    #\n    #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n     #\n     #\n     #"));
    System.out.println(c(" ##  #   \n  ## #  \n   ###\n    ##\n   # \n  #  \n #   "));
    System.out.println(c(" ##   #  \n  ## #  \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n   # \n  #  \n  #  "));
    System.out.println(c(" #    ## \n  #  ## \n   ###\n    #\n     #\n     #\n     #"));
  }
}

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

出力:

35
35
35
35
32
32

0

Befunge 98、11バイト

-!jv~'
@.~<

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

32左と35右の両方に1つの末尾スペースを付けて印刷します。

説明

-!jv      This is a no-op the first time through, but used later

    ~'    Pushes the ASCII value of the next character, and pushes 32
-!        Subtracts the 2, and nots. If the character was a space, the top will be 1
  jv      Goes to the second line if the character was not a space

  ~<      Pushes the next characer's ASCII value
 .        Prints it (32 for " " and 35 for "#")
@         Ends the program

私が使用した1つのトリック-!jvは、何もしませんでしたが、最初のものを置くことでした。これにより、後のスペースを取り除き、'パディングを節約できました。この最後で、コードは次のようになります

~' -!jv
   @.~<

15バイト。


0

ルビー、20バイト

->r{r.strip[1]==' '}

左の場合はtrue、右の場合はfalseを返します。

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