গ্রেট এপিআই ইস্টার ডিম হান্ট!


15

ইপিআই ইস্টার ডিম শিকার!

Http://easter_egg_hunt.andrewfaraday.com এ একটি এপিআই রয়েছে যা কেবলমাত্র আপনার জন্য একটি বিশেষ ইস্টার ডিম শিকার সরবরাহ করবে ...

আপনি উপরের ঠিকানায় API ডক্স দেখতে পারেন বা এখান থেকে চেষ্টা করে দেখতে পারেন।

এপিআই:

এই এপিআই-এর সমস্ত কল হ'ল জিইটি অনুরোধ, যা একটি জেএসএন স্ট্রিং ফিরিয়ে দেবে।

এই উদাহরণগুলি 5x5 বাগানে রয়েছে, কেবল উদাহরণের জন্য। এপিআই আসলে 100x100 বাগানে পরিচালনা করবে (1 থেকে 100 সূচী থেকে)

/new_game

অভ্যন্তরীণভাবে, API একটি বাগান উত্পাদন করে এবং এতে একটি ডিম লুকায়।

এই উদাহরণে ডিমটি 4, 4 এ থাকে

+----------+
|          |
|          |
|          |
|          |
|   E      |
|          |
|          |
|          |
|          |
|          |
+----------+

কল

/new_game

রিটার্নস

{game_id: 'abcde'}

/guess/:game_id/:x/:y

এপিআই বাগানে দেখায় এবং আপনাকে জানায় যে আপনি কতটা কাছাকাছি আছেন।

যদি আপনি 2 টির ওপরে এবং 8 টি নিচে অনুমান করেন তবে বাগানটি দেখতে এমন দেখাচ্ছে

+----------+
|          |
|          |
|          |
|          |
|   E      |
|          |
|          |
| g        |
|          |
|          |
+----------+

কল

/guess/abcde/2/8

রিটার্নস

{x: 'higher', y: 'lower'}

এর অর্থ: * আপনার এক্স খুব কম (ডিমের অবস্থান বেশি) * আপনার y খুব বেশি (ডিমের অবস্থান কম)

সঠিক কল:

/guess/abcde/4/4

রিটার্নস

{x: 'right', y: 'right', turns: 10}

নিয়ম

একটি এপিআই দিয়ে ইস্টার ডিম খুঁজতে একটি প্রোগ্রাম লিখুন।

  • যে কোনও ভাষা ব্যবহার করুন।
  • সংক্ষিপ্ত, তবে পঠনযোগ্য কোডটি লেখার চেষ্টা করুন।
  • আপনার প্রোগ্রামটি প্রতিবার '/ new_game' কল করতে হবে এবং সমস্ত 'অনুমান' কলগুলিতে ফিরে আসা গেম_আইড ব্যবহার করুন। বাগানে উঁকি মারছে না!
  • সামান্য সংখ্যক কলের সাথে ধারাবাহিকভাবে গেমটি শেষ করার চেষ্টা করুন।
  • এটি কোড গল্ফ নয়।

প্রতিযোগিতামূলক উত্তর?

এখানে জয়ের সুযোগের সাথে থাকতে আমাদের যা জানতে হবে:

  • আপনি কোন কোডটি ব্যবহার করছেন (আপনার উত্তরে, বা কোনও গিথুব লিঙ্কটি যদি আপনার উত্তর দেওয়া পছন্দ হয় তবে তার চেয়ে বড়)।
  • আপনার কোডটি 10 ​​বার চালান এবং গেম_আইডি রেকর্ড করুন এবং প্রতিবার স্কোর করুন।

-গেম_আইডি- : স্কোর-

যেমন

abbbbbb : 10

অবিববিডিডি : 5

(দ্রষ্টব্য: একটি ফলাফল যাচাই করার জন্য গেম_আইডস প্রয়োজন)

স্কোরটি এভাবে গণনা করা হবে:

  • সর্বোচ্চ এবং সর্বনিম্ন দুটি ফলাফল উপেক্ষা করা হবে।
  • বাকি 6 স্কোর একসাথে যুক্ত করা হবে।
  • এটি আপনার স্কোর।
  • সর্বনিম্ন স্কোর জয়।

অভিযোজ্য বস্তু

টিএল, ডাঃ অ্যাপটি কিছুটা কম।

এপিআইটি প্রায় 90 মিনিটের ব্যবধানে লেখা হয়েছিল এবং এটি রাস্পবেরি পাই 2 তে স্থাপন করা হয়েছে দয়া করে আমার এপিআই সার্ভারের সাথে সৌম্য হন। আপনি যদি এই খারাপ জিনিসটি ডিডস করেন তবে আপনি এটি সবার জন্য লুণ্ঠন করতে পারেন।

এছাড়াও, এটি একটি স্থির আইপি ঠিকানা অনুকরণ করার জন্য এনওআইপি দিয়ে প্রয়োগ করা হয়েছে, তবে কখনও কখনও এটি অল্প সময়ের জন্য বাদ পড়বে। এটি আমি শূন্য বাজেটের ওয়েব হোস্টিংয়ের জন্য ব্যবহারের জন্য পেয়েছি।

কেবল গিগলসের জন্য, এখানে খেলানো গেমগুলির একটি সহজ পরিসংখ্যান বিশ্লেষণ ... http://easter_egg_hunt.andrewfaraday.com/stats


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

উত্তর:


3

APL + + জয়

কেন্দ্র থেকে শুরু করে কাজ করে এবং উপরের বা নিম্ন সীমাটি সর্বশেষ মানটিতে সেট করে এবং প্রতিটি পুনরাবৃত্তির শেষ অনুমানের উপযুক্ত সীমাতে অর্ধেক পার্থক্য যোগ বা বিয়োগ করে লোকেশনটিতে রূপান্তর করে।

API                                                                               
id←¯20↑¯2↓GetUrl 'http://easter_egg_hunt.andrewfaraday.com/new_game'              
xh←yh←100 ⋄ xl←yl←0 ⋄ x←50 ⋄ y←50 ⋄ c←0                                           
:repeat                                                                           
    xy←GetUrl 'http://easter_egg_hunt.andrewfaraday.com/guess/',id,'/',(⍕x),'/',⍕y
    xy←(('higher'⍷xy)+(¯1×'lower'⍷xy)+2×'right'⍷xy)~0                             
    :if xy[1]=1 ⋄ xl←x ⋄ x←x+⌈(xh-x)÷2 ⋄ :endif                                   
    :if xy[1]=¯1 ⋄ xh←x ⋄ x←x-⌈(x-xl)÷2 ⋄ :endif                                  
    :if xy[2]=1 ⋄ yl←y ⋄ y←y+⌈(yh-y)÷2 ⋄ :endif                                   
    :if xy[2]=¯1 ⋄ yh←y ⋄ y←y-⌈(y-yl)÷2 ⋄ :endif                                  
    c←c+1                                                                         
:until 4=+/2↑xy                                                                   
'id:',id,' x:',(⍕x),' y:',(⍕y),' count:',⍕c 

এই ফাংশনটি API কলগুলি করতে নিম্নলিখিত ফাংশনটি ব্যবহার করে:

r←GetUrl url                                     
⎕wself←'HTTP' ⎕wi 'Create' 'MSXML2.ServerXMLHTTP'
⎕wi 'XOpen' 'GET' url 0                          
⎕wi 'XSend'                                      
r←⎕wi 'xresponseText'

10 চেষ্টার ফলাফল ছিল:

id:rbgprkxrqzzhwdfsbszn x:36 y:52 count:7      
id:nmpcxdqsdzhgrbtlcpbp x:35 y:49 count:6      
id:qqnsbpwnlbptxxblywnz x:99 y:22 count:6      
id:nsytnvcgnsyrgzvjcysc x:45 y:28 count:6      
id:yfkpfhphjpqxtqnwpmhv x:95 y:40 count:7      
id:kxhszzrhxqlnvwvwjgnm x:49 y:6 count:6       
id:rwnwfgdpzcjpzzfmgcfn x:93 y:34 count:7      
id:tcvhtpqlfrwngybsyzqh x:95 y:94 count:6      
id:pmlmqnprwcjggjfhttmy x:20 y:41 count:6      
id:kpsmmhfhxxrrlvbbgzkv x:9 y:28 count:5                   

2

রুবি (+ জেএসএন, HTTParty) - স্কোর: 40 (6 + 7 + 7 + 7 + 7 + 6)

এটি একটি মজার চ্যালেঞ্জ ছিল। আমি ডিমটি খুঁজতে বাইনারি অনুসন্ধান ব্যবহার করেছি এবং এই ফলাফলগুলি পেয়েছি:

[{:x=>34, :y=>17, :game_id=>"mgpbmdqbnklcqrdjpyrr", :count=>7},
 {:x=>99, :y=>17, :game_id=>"mhrsqfzmrrlcqxtcfgnw", :count=>7},
 {:x=>23, :y=>86, :game_id=>"zgmsrjpqvdtmqmmglstn", :count=>6},
 {:x=>24, :y=>55, :game_id=>"vkpjffyyltplztwhdsft", :count=>7},
 {:x=>12, :y=>94, :game_id=>"pxrzjvqfjrjsptvtvnfw", :count=>4},
 {:x=>83, :y=>59, :game_id=>"bdxljxkcnqmsqgnvggql", :count=>7},
 {:x=>45, :y=>40, :game_id=>"mqrsbrhbldcqwgbnmymc", :count=>7},
 {:x=>13, :y=> 9, :game_id=>"bphxkdgfcyyrvwxnfvkx", :count=>6},
 {:x=> 8, :y=>80, :game_id=>"qzdstksdwnwrhxqrczpc", :count=>7},
 {:x=>56, :y=>92, :game_id=>"ypqkfvmvwrcvvmjccvxg", :count=>6}]

কোডটি এখানে :

require 'rspec/autorun'
require 'json'
require 'httparty'
require 'pp'

GuessResult = Struct.new :x, :y, :count

class FakeGame
  def initialize(x=random_num, y=random_num)
    @x = x
    @y = y
    @count = 0
  end

  @@results = [:right, :higher, :lower]

  def guess(x, y)
    @count += 1
    GuessResult.new(@@results[@x <=> x], @@results[@y <=> y], @count)
  end

  def id
    :fake
  end

  def random_num
    rand(100) + 1
  end
end

class RealGame
  def initialize
    response = HTTParty.get('http://easter_egg_hunt.andrewfaraday.com/new_game')
    j = JSON.parse(response.body)
    @id = j['game_id']
  end

  def guess(x, y)
    response = HTTParty.get("http://easter_egg_hunt.andrewfaraday.com/guess/#{id}/#{x}/#{y}")
    j = JSON.parse(response.body)
    x_result = j['x'].to_sym
    y_result = j['y'].to_sym
    count = (j['turns']||0).to_i
    GuessResult.new(x_result, y_result, count)
  end

  def id
    @id
  end
end


class BinarySearch
  def initialize(min, max)
    @min = min
    @max = max
    @guessed = false
    update_next_guess
  end

  attr_reader :next_guess, :guessed

  def go(result)
    return if @guessed
    case result
    when :right
      @guessed = true
    when :lower
      @max = @next_guess - 1
      update_next_guess
    when :higher
      @min = @next_guess + 1
      update_next_guess
    end
  end

  private

  def update_next_guess
    @next_guess = (@max + @min) / 2
  end

end

def play(game)
  x_search = BinarySearch.new(1, 100)
  y_search = BinarySearch.new(1, 100)

  until x_search.guessed && y_search.guessed
    puts ?.
    result = game.guess(x_search.next_guess, y_search.next_guess)
    x_search.go(result.x)
    y_search.go(result.y)
  end

  {
    x: x_search.next_guess,
    y: y_search.next_guess,
    game_id: game.id,
    count: result.count
  }
end


def game_controller(game_constructor, game_count)
  (1..game_count).map do |i|
    game = game_constructor.call
    puts "Starting game #{game.id}..."
    play(game)
  end
end


def main
  # pp game_controller(->{ FakeGame.new }, 10)
  pp game_controller(->{ RealGame.new }, 10)
end

main


# tests

describe :FakeGame do

  it "returns right results" do
    game = FakeGame.new 4, 4

    result = game.guess(2, 5)
    expect(result.x).to eql :higher
    expect(result.y).to eql :lower
    expect(result.count).to eql 1

    result = game.guess(5, 3)
    expect(result.x).to eql :lower
    expect(result.y).to eql :higher
    expect(result.count).to eql 2

    result = game.guess(4, 4)
    expect(result.x).to eql :right
    expect(result.y).to eql :right
    expect(result.count).to eql 3

  end

end

describe :binary_search do
  let(:search) { BinarySearch.new 1, 100 }

  it "makes optimal guesses" do
    # aiming for 34
    expect(search.next_guess).to eql 50
    expect(search.guessed).to be_falsey
    search.go(:lower)
    expect(search.next_guess).to eql 25
    search.go(:higher)
    expect(search.next_guess).to eql 37
    search.go(:lower)
    expect(search.next_guess).to eql 31
    search.go(:higher)
    expect(search.next_guess).to eql 34
    search.go(:right)
    expect(search.next_guess).to eql 34
    expect(search.guessed).to be_truthy
  end

end

describe :fake_game do

  it "correctly responds to guesses" do
    game = FakeGame.new(34, 77)
    result = play(game)
    expect(result.y).to eql :lower
    expect(result.count).to eql 1

    result = game.guess(5, 3)
    expect(result.x).to eql :lower
    expect(result.y).to eql :higher
    expect(result.count).to eql 2

    result = game.guess(4, 4)
    expect(result.x).to eql :right
    expect(result.y).to eql :right
    expect(result.count).to eql 3

  end

end

describe '#play' do

  it "guesses correctly" do
    game = FakeGame.new(34, 77)
    result = play(game)
    expect(result[:x]).to eql 34
    expect(result[:y]).to eql 77
    expect(result[:count]).to eql 7
    expect(result[:game_id]).to eql :fake
  end

end

দেখে মনে হচ্ছে আমি এখানে গোলযোগ পেয়েছি। ইস্টার_এগজি_হান্ট.আ্যান্ড্রুফারাডে ডটকম / স্ট্যাটাস জানিয়েছে যে অ্যাপটির ইতিহাসে কেবল 12 টি গেমস সম্পন্ন হয়েছে। আমি নিশ্চিত যে গতকাল কমপক্ষে 6 টি সম্পন্ন হয়েছে। যদিও 160 দীর্ঘতম। আমি এটি দেখতে হবে।
এজেফারাডে

সমস্যাটি রিয়েলগেম # অনুমান হিসাবে উপস্থিত বলে মনে হচ্ছে, যেখানে আপনি গেম_আইড "বিএসডব্লিউডডভিএফডিজেপডিটিফেকজবিজ" দিয়ে গেমটিকে হার্ডকড করেছেন। আরও সঠিক ফলাফল সেট পেতে এটি # {@ আইডি with দিয়ে প্রতিস্থাপন করুন।
এজেফারাডে

আসলে, আমি এক লাইনে সংশোধন করেছি এবং আপনার ফলাফল সেটটি বেশ ভাল। বরং ধারাবাহিকভাবে 6 এবং 7 এর। দুর্দান্ত কাজ: ডি
এজেফেরাদে

@ এজেফারাডে ওফস আমার খারাপ! ঠিক করার জন্য ধন্যবাদ! এবং এই মজা চ্যালেঞ্জ করার জন্য ধন্যবাদ!
ক্রিশ্চিয়ান লুপাস্কু

আপনি সেখানে এক মিনিটের জন্য আমাকে চিন্তিত করেছিলেন;)
এজেফারাদে

2

পাইথন 3 (+ অনুরোধ), 39 পয়েন্ট

http://easter_egg_hunt.andrewfaraday.com/guess/dbxqfgldhryxymljthkx/13/82
{"turns": 7, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/kfmgrdqlyxfknbgycfwm/6/52
{"turns": 7, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/gnykwddprlfwwkrybkmc/34/91
{"turns": 6, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/xhwrqdgtdyrwrvdqqcpk/92/54
{"turns": 7, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/hmbgrnxjfgqcxhbfkztm/44/48
{"turns": 7, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/mhbchhbkppqqyxzqvrnb/62/38
{"turns": 7, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/pbrkghynqybmkmctncmr/73/25
{"turns": 6, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/sspxcsfblrnmhflgtggn/89/73
{"turns": 6, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/rlvdstmpsthktzkqbynn/4/71
{"turns": 6, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}
http://easter_egg_hunt.andrewfaraday.com/guess/wknwwcrdrmjsqxnqbvhm/50/67
{"turns": 6, "url": "http://easter_egg_hunt.andrewfaraday.com/surprise", "x": "right", "y": "right"}

স্কোর 39 (7 + 7 + 7 + 6 + 6 + 6 - 7-7-6-6)

সূত্র:

import requests
import json
url='http://easter_egg_hunt.andrewfaraday.com/guess/{id}/{x}/{y}'
start='http://easter_egg_hunt.andrewfaraday.com/new_game'
gid = requests.get(start).json()['game_id']
x=y=50
step=25
lx=lr=''
def get_new(old,value):
        if value == 'higher':
                return old+step
        elif value == 'lower':
                return old-step
        else:#right
                return old
while True:
        res = requests.get(url.format(id=gid,x=x,y=y)).json()
        if res['x'] == 'right' and res['y'] == 'right':
                print(url.format(id=gid,x=x,y=y))
                print(json.dumps(res, sort_keys=True))
                break
        x=get_new(x,res['x'])
        y=get_new(y,res['y'])
        step=step // 2 or 1

ফলাফলটিতে কোনও গেমিড নেই কেবল লক্ষ্য করেছি, আমি এটি পুনরায় চালু করব এবং গেম আইডিটি কিছুটা যোগ করব
রিক রঞ্জেন

আপনি নিজের চেয়েও বেশি রান করেছেন। আমরা সর্বোচ্চ দুটি এবং সর্বনিম্ন দুটি ফলাফল ছাড় করছি। যোগফলের জন্য মাত্র 6 রেখে যাচ্ছেন ... আপনি সর্বদা স্কোরকেও শিরোনামে রাখতে পারেন।
এজেফারাডে

ওহ আমি ভুল লিখেছি, আমি কেবল প্রথম এবং শেষটিকে সরাতে ভেবেছিলাম। আমি তখন এটি সংশোধন করব :)
রিক রনজেন

2

পিএইচপি

<?php

error_reporting(E_ALL);

$url = 'http://easter_egg_hunt.andrewfaraday.com';
extract(json_decode(file_get_contents("$url/new_game"), true));

$i = $j = 51;
$step = 50;
$right = false;

while(!$right) {
  extract(json_decode(file_get_contents(sprintf("$url/guess/$game_id/%d/%d", $i, $j)), true));
  $lower = -$higher = $step /= 2;
  $i += $$x;
  $j += $$y;
  $right = !($$x || $$y);
}

printf('{game_id: %s; x: %2d; y: %2d; turns: %d}', $game_id, $i, $j, $turns);

File_get_contents এবং json_decode ব্যবহার করা হচ্ছে

যতদূর আমি বলতে পারি , সর্বোত্তম কৌশলটির সর্বাধিক 7 পদক্ষেপ প্রয়োজন, একটি অক্ষের উপর গড়ে 5.8 চাল এবং দুটি অক্ষের উপর গড়ে 6.4786 চাল।


10 এর নমুনা

{game_id: pfmyldcsltlbtmcfjtqr; x: 76; y: 51; turns: 6}
{game_id: jnmshsfvstcmksdcdrnj; x: 40; y:  5; turns: 7}
{game_id: wsrptrymycxjfxwvdvlh; x: 55; y: 35; turns: 7}
{game_id: fxpxtqwnxstwcxbsqtwc; x: 73; y: 93; turns: 6}
{game_id: zppntvjxnjpnlmpfzcfj; x: 71; y: 76; turns: 6}
{game_id: fzvlxqgrxcvtbbydgrpj; x: 48; y: 51; turns: 6}
{game_id: hqytpzjxkfhqhhwwfryd; x: 23; y: 87; turns: 6}
{game_id: ldsbfgcqbqpxgdhtkxsm; x: 90; y: 81; turns: 5}
{game_id: shypwsmjljyqdvwcwnxv; x: 19; y: 57; turns: 7}
{game_id: bsfrhhrvmpqfvyhjxcwh; x: 82; y: 85; turns: 6}

স্কোর: 6 + 6 + 6 + 6 + 6 + 7 = 37


গল্ফড, 245 বাইট

<?$e="extract(json_decode(file_get_contents('http://easter_egg_hunt.andrewfaraday.com";eval("$e/new_game".$f="'),1));");
for($i=$j=$h=50;!$url;$l=-$h/=2)eval("$e/guess/$game_id/".-~($i+=$$x[0]).'/'.-~($j+=$$y[0]).$f);
echo$game_id,~$i,~$j,-$turns;

নমুনা আউটপুট

$ php egg-hunt.php
hgzqmqyrznglsdwfwcft-9-86-7

2

হাস্কেল, মোট স্কোর 66 40

(সম্পাদনা করুন: স্কোরিংয়ের সর্বোচ্চ এবং সর্বনিম্ন ফলাফল বাদ দেওয়ার অংশটি মিস করেছেন)

আমি কেবল বাইনারি অনুসন্ধান ব্যবহার করছি। নিশ্চিত না যে প্রতারণা না করে গড়ে প্রতি চেষ্টা 6.5 এর চেয়েও ভাল পাওয়ার উপায় আছে (আমি মনে করি আমি আরও ভাল স্কোর না পাওয়া পর্যন্ত 10 এর সেট চালিয়ে যেতে পারতাম, তবে তাতে মজাটা কোথায়?)।

আহ, যাইহোক খুব মজা চ্যালেঞ্জ। সবার অন্তর্ভুক্ত হওয়ার জন্য ধারণাটি যথেষ্ট সহজ, এবং আমি আমার দিনের চাকরিতে সাধারণত ওয়েব এপিআইগুলির সাথে চুক্তি করি না এবং চেষ্টা করার অজুহাতে আমি চুলকানি করছিলাম servant, তাই তার জন্য ধন্যবাদ :) সম্ভবত আপনি এতটা দুর্দান্ত না যদি আপনি ' প্রতিযোগিতার প্রত্যাশা করছি, তবে আমি মনে করি এর মতো চ্যালেঞ্জগুলি শুরু এবং এটির মতো জিনিসের জন্য কোডের নমুনা সংগ্রহ করতে ব্যবহার করা যেতে পারে।

এক্সিকিউটেবল স্ক্রিপ্ট (একটি গেম চালায় এবং গেম আইড এবং স্কোরের প্রতিবেদন করে):

#!/usr/bin/env stack
{- stack
   --resolver lts-11.2
   script
   --package servant
   --package servant-client
   --package http-client
   --package aeson
   --package text
-}

-- the above comments allow this to be run as a script if haskell-stack is installed.
-- Actual source starts here.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

import Data.Aeson
import Servant.API
import Servant.Client
import qualified Network.HTTP.Client as HttpClient
import Data.Proxy
import Data.Text(Text)
import Text.Printf
import System.IO(stderr)

newtype GameID = GameID Text deriving (PrintfArg, ToHttpApiData)

instance FromJSON GameID where
  parseJSON = withObject "GameID" $ \o ->
    fmap GameID (o .: "game_id")

data Accuracy = Lower | Higher | Correct

readAccuracy :: Text -> Accuracy
readAccuracy t
  | t == "lower" = Lower
  | t == "higher" = Higher
  | t == "right" = Correct
  | otherwise = error $ printf "Unexpected accuracy text: \"%s\"" t

data GuessResult = GuessResult { xAccuracy :: Accuracy, yAccuracy :: Accuracy, turnCount :: Maybe Int }

instance FromJSON GuessResult where
  parseJSON = withObject "GuessResult" $ \o ->
    GuessResult
      <$> fmap readAccuracy (o .: "x")
      <*> fmap readAccuracy (o .: "y")
      <*> o .:? "turns"

type EggAPI =    "new_game" :> Get '[JSON] GameID
            :<|> "guess"
              :> Capture "game_id" GameID
              :> Capture "x" Int
              :> Capture "y" Int
              :> Get '[JSON] GuessResult

getNewGame :: ClientM GameID
makeGuess :: GameID -> Int -> Int -> ClientM GuessResult
getNewGame :<|> makeGuess = client (Proxy :: Proxy EggAPI)

data CoordinateRange = CoordinateRange { lowerBound :: Int, higherBound :: Int }

middleOfRange :: CoordinateRange -> Int
middleOfRange rng = lowerBound rng + (higherBound rng - lowerBound rng) `div` 2

adjustCoordinateRange :: Accuracy -> CoordinateRange -> CoordinateRange
adjustCoordinateRange Lower rng = CoordinateRange (lowerBound rng) (middleOfRange rng)
adjustCoordinateRange Higher rng = CoordinateRange (middleOfRange rng) (higherBound rng)
adjustCoordinateRange Correct rng = rng

searchForEggs :: ClientM (GameID, Int)
searchForEggs = do
  game <- getNewGame
  let initialRange = CoordinateRange 1 100
  score <- loop game initialRange initialRange
  return (game, score) where
    loop gId xRange yRange = do
      guessResult <- makeGuess gId (middleOfRange xRange) (middleOfRange yRange)
      let newXRange = adjustCoordinateRange (xAccuracy guessResult) xRange
          newYRange = adjustCoordinateRange (yAccuracy guessResult) yRange
      maybe (loop gId newXRange newYRange) return $ turnCount guessResult

main :: IO ()
main = do
  manager' <- HttpClient.newManager HttpClient.defaultManagerSettings
  let clientEnv = mkClientEnv manager' (BaseUrl Http "easter_egg_hunt.andrewfaraday.com" 80 "")
  result <- runClientM searchForEggs clientEnv
  case result of
    Left err -> hPrintf stderr  "Error: %s\n" (show err)
    Right (game, score) -> printf "GameID: %s | Score: %d\n" game score

ফলাফল

GameID               |  Score
---------------------+-------
fdcbwwxkvhkfskqlpgnh |  7
cdgjnksfnrhgjjsdbnhd |  7
lbjjqgkvfzzprnrxcpsx |  6
rtbngkdlwdfmhdyggnjd |  6
rcphvxzzgblfnzxdqlyh |  6
gyfjbjmplkrfnqjptygl |  7
bkdnbqhsbhwwvgtcfhjb |  6
knjdxdmvttwgltjdpvtv |  7
zqpstnhjgsykkwxnxcbv |  7
rccpmsbfxqvsmzxckhcs |  7

2

জাভাস্ক্রিপ্ট, 35 পয়েন্ট

অবহেলিত কোড পোস্ট করা আমার সাথে ভাল বসে না ! : ডি

(async _=>{
    url=`https://crossorigin.me/http://easter_egg_hunt.andrewfaraday.com/`
    promise=await fetch(url+`new_game`)
    json=await promise.json()
    id=json.game_id
    max={x:100,y:100}
    min={x:0,y:0}
    (guess=async (x,y)=>{
        promise=await fetch(url+`guess/${id}/${x|=0}/${y|=0}`)
        json=await promise.json()
        turns=json.turns
        if(turns)
            console.log(`{game:"${id}",turns:${turns},x:${x},y:${y}}`)
        else{
            switch(json.x){
                case`higher`:
                    min.x=x
                    x+=max.x
                    x/=2
                    break
                case`lower`:
                    max.x=x
                    x+=min.x
                    x/=2
            }
            switch(json.y){
                case`higher`:
                    min.y=y
                    y+=max.y
                    y/=2
                    break
                case`lower`:
                    max.y=y
                    y+=min.y
                    y/=2
            }
            guess(x,y)
        }
    })(50,50)
})()

স্কোরিং: 5 + 6 + 6 + 6 + 6 + 6 = 35

খুব ভাগ্যবান হয়েছে, পোস্টের আগে আমার শেষ পরীক্ষায় এই স্কোরটি 3!

{game:"bjzkjzxwmksmbsbxtdzp",turns:3,x:75,y:12}
{game:"bvmhssnmzhlnykgxdkww",turns:5,x:93,y:71}
{game:"mcydbttxhcxwqymksgbg",turns:5,x:71,y:37}
{game:"xdynxrkxgsyltsfrqzll",turns:6,x:54,y:88}
{game:"wjdkclsqksnvdnwbspxq",turns:6,x:90,y:13}
{game:"mgvlssfgjcgtylwqpvhq",turns:6,x:26,y:68}
{game:"rgjvbkrlzqvpdfphqxtq",turns:6,x:19,y:81}
{game:"hgrscvfzgrkzzjvkjjwb",turns:6,x:41,y:19}
{game:"lrfrblmmkggghntshnkj",turns:7,x:86,y:32}
{game:"ldsndvjsbvgvbhbtfckp",turns:7,x:24,y:7}

চেষ্টা করে দেখুন

উপরের কোডটির কিছুটা গল্ফড সংস্করণ ব্যবহার করে !


এটি আসলে কোড গল্ফ নয়, আপনি যদি চান তবে আপনি স্পষ্টতার জন্য কিছুটা প্রসারিত করতে পারেন
কিউবিক

@ কিউবিক, আপনি ঠিক বলেছেন, আমারও সম্ভবত হওয়া উচিত! : ডিআই কোডস -গল্ফ না হলেও, এখানে বাইটস এর চূর্ণবিচূর্ণ না করা অবিশ্বাস্যরকম কঠিন !
শেগি

1

মরিচা

যেমনটি ঘটে, জাস্টটির একটি দুর্দান্ত ডিসরিওলাইজেশন লাইব্রেরি রয়েছে serdeযা এই প্রোগ্রামটির সাথে অনেক সহায়তা করেছিল। একবারের জন্য xএবং একবারের জন্য একবার চালানো ব্যতীত অ্যালগরিদম নিজেই একটি বরং সরল বাইনারি অনুসন্ধান y

ইউআরএল ম্যাক্রোর কোনও বিন্যাসের স্ট্রিংয়ের জন্য একটি নির্দিষ্ট কেস রয়েছে কারণ এটি বেশ নিখরচায় করা যেতে পারে, এবং ফর্ম্যাট না করার সময় স্ট্যাটিক স্টোরেজে সংরক্ষণ করা হবে।

Cargo.toml

[package]
name = "easter-egg-hunt"
version = "0.1.0"
authors = ["Konrad Borowski"]

[dependencies]
reqwest = "0.8.5"
serde = "1.0.36"
serde_derive = "1.0.36"

main.rs

extern crate reqwest;
extern crate serde;
#[macro_use]
extern crate serde_derive;

use reqwest::Client;

#[derive(Deserialize)]
struct NewGame {
    game_id: String,
}

#[derive(Deserialize)]
struct Guess {
    x: GuessStatus,
    y: GuessStatus,
    turns: Option<u32>,
}

#[derive(Deserialize)]
#[serde(rename_all = "lowercase")]
enum GuessStatus {
    Lower,
    Right,
    Higher,
}

macro_rules! url {
    ($path:expr) => {
        concat!("http://easter_egg_hunt.andrewfaraday.com", $path)
    };
    ($path:expr $(, $part:expr)*) => {
        &format!(url!($path) $(, $part)*)
    };
}

struct BinarySearch {
    low: u8,
    high: u8,
}

impl BinarySearch {
    fn new() -> Self {
        BinarySearch { low: 1, high: 100 }
    }

    fn current_guess(&self) -> u8 {
        (self.low + self.high) / 2
    }

    fn update(&mut self, guess_status: GuessStatus) {
        let current_guess = self.current_guess();
        match guess_status {
            GuessStatus::Lower => self.high = current_guess - 1,
            GuessStatus::Higher => self.low = current_guess + 1,
            GuessStatus::Right => {
                self.high = current_guess;
                self.low = current_guess;
            }
        }
    }
}

fn run_game(client: &Client) -> reqwest::Result<()> {
    let NewGame { game_id } = client.get(url!("/new_game")).send()?.json()?;
    let mut x_search = BinarySearch::new();
    let mut y_search = BinarySearch::new();
    loop {
        let x_guess = x_search.current_guess();
        let y_guess = y_search.current_guess();
        let response = client
            .get(url!("/guess/{}/{}/{}", game_id, x_guess, y_guess))
            .send()?
            .json()?;
        match response {
            Guess { x, y, turns: None } => {
                x_search.update(x);
                y_search.update(y);
            }
            Guess {
                turns: Some(turns), ..
            } => {
                println!("id:{} x:{} y:{} count:{}", game_id, x_guess, y_guess, turns);
                return Ok(());
            }
        }
    }
}

fn main() {
    let client = Client::new();
    for _ in 0..10 {
        run_game(&client).unwrap();
    }
}

সারসংক্ষেপ

id:tlxjnjtslnsnbdxyzlvn x:97 y:22 count:7
id:bbzpyhhflrdjzylwxtbr x:21 y:6 count:5
id:kcjdkfvddgxckmprxwtw x:81 y:99 count:6
id:tnzryxpkblqrqbqrqkby x:30 y:25 count:7
id:pbzkdrmjrvwmkgmlvwcb x:79 y:20 count:7
id:qxvcbcslkdmjxnffsxfb x:36 y:94 count:7
id:hqfgpdmktyfwqtbrvvly x:94 y:71 count:5
id:ytgsnssvlpnhzqzgvygw x:1 y:83 count:7
id:gjhglmkbhvswqwgrynft x:65 y:94 count:5
id:rzghpypysxtwkclgpbkx x:55 y:96 count:7

5 + 6 + 7 + 7 + 7 + 7 = 39


1

পাইথন 2

গল্ফড ভেসারিওন - 276 বাইট

from requests import*
u='http://easter_egg_hunt.andrewfaraday.com'
i=get('%s/new_game'%u).json()['game_id']
x=y=50;s=25;o={}
while not'turns'in o:o=get('%s/guess/%s/%d/%d'%(u,i,x,y)).json();exec("%s+=s*'rh'.rfind(o['%s'][0]);"*2)%tuple('xxyy');s=s%2+s/2
print i,x,y,o['turns']

আরও পঠনযোগ্য সংস্করণ + মন্তব্য

from requests import*
u='http://easter_egg_hunt.andrewfaraday.com'
i=get('%s/new_game'%u).json()['game_id'] # get game id
x=y=50    # initial central position
s=25      # step of binary search
o={}      # initialize o to further store returns
while not'turns'in o:    # cycle until 'turns' occurs in return
    o=get('%s/guess/%s/%d/%d'%(u,i,x,y)).json()
    exec("%s+=s*'rh'.rfind(o['%s'][0]);"*2)%tuple('xxyy');s=s%2+s/2
    # this exec is used to shorten two similar lines for x and y:
    #  x += s * (... o['x'] ...); 
    #  s*'rh'.rfind(o['%s'][0]) - look at first letter of return and use its position in string 'rh' to map multipliers for step: 
    #                             -1 for lower, +1 for higher and 0 for right 
    #                             rfind() will return -1 for not finding l
    s=s%2+s/2    # divide step in two, rounding up
print i,x,y,o['turns']

ফলাফল

vjwqvbydwmbvbrhwrxqz 19 95 4
svkdvszghjzfbvqxsprt 5 12 4
dvbpnxjdgrydwffcndnt 81 67 6
qqwgsctqhdcrbywwrcxf 21 49 6
zrgqqtzjjrrsqbgvkbsm 37 12 6
trzjngljbwbwxycxpcbk 91 2 7
kysjwfzsrdjsybrchnzg 76 45 7
kcjtxqfmcgszrwkyhlkm 68 48 7
wykbjvthqmcyzscxnsxt 68 41 7
kldrfccjdphzqnqcmdgz 88 14 7

সারসংক্ষেপ

কিছুটা প্রত্যাশিত: ডি
6 + 6 + 6 + 7 + 7 + 7 = 39


2
গল্ফাররা গল্ফ;)
এজেফারাডে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.