N'aber?


20

Martin , zorluklara verilen cevapların skorunu takip etmek için kullanılabilecek güzel bir snippet yarattı . Bu harika ve hepsi, ama kendiniz takip edebilmeniz daha iyi olmaz mıydı?

Bayt sayılarını bu sorunun yanıtlarının geri kalanıyla karşılaştıran ve "Ben cevap numarası n" olan bir program oluşturun.

Kurallar:

  • Kendi cevabınızdaki bayt sayısı kodda sabit olarak kodlanabilir

  • İşlev url'yi giriş olarak alabilir veya sabit olarak kodlanabilir. URL'nin karakterleri bayt sayısına dahil edilmeyecektir, bu nedenle bir url kısaltıcı kullanmak gerekli değildir.

  • cevapların url adresleri kodlanamaz

  • Yanıtların puanı başlıktan bulunabilir (Martin pasajında ​​olduğu gibi).

  • Yanıt başlığının biçimi doğru olmalıdır (aşağıda açıklanmıştır).

  • Programı çevrimiçi çalıştırmak mümkünse, lütfen çevrimiçi bir derleyicinin bağlantısını (veya yanıttan yürütülebilecek bir kod snippet'ini) paylaşın. Mümkün değilse, lütfen işlevi nasıl arayacağınızı ve kendi derleyicinizden çıktıyı gösterin (cevabı yayınladığınız anda. Tabii ki istemediğiniz sürece güncellemeniz gerekmez).

  • Cevabı aslında bu sorunun diğer cevapları ile karşılaştırmalısınız. I'm answer number 1.Bazı dillerde bir senaryo yazmak yasal değildir.

  • Diğer yanıtlar kendinizle aynı sayıda bayta sahipse, bunlardan en iyisi mi yoksa daha mı kötüsü olmak istediğinizi seçebilirsiniz.

Başlık biçimlendirilmelidir:

# Language Name, N bytes

İhtar vb. Kullanılamaz, bu nedenle kod boyutu değiştirilirse, başlığın altındaki kalın metinle gösterin veya başka bir şekilde belirtin.

Çıktı I'm answer number n., sayının nkonum olduğu yerde olmalıdır (son satırsonu / boşluklar TAMAM). Yani, en kısa cevap çıkacaktır: "Ben 1 numaralı cevabım", ikincisi "Ben 2 numaralı cevabım" olacaktır. vb.

Bu kod golf, bu yüzden bayt en kısa cevap kazanacak.


Diğer yanıtlar kendinizle aynı sayıda bayta sahipse, bunlardan en iyisi mi yoksa daha mı kötüsü olmak istediğinizi seçebilirsiniz. Belki gönderi tarihi bir bağlayıcı olmalıdır, bu nedenle aynı sayı olduğunu iddia eden iki cevabınız yoktur. Ya da, eğer bağlılarsa, her ikisinin de daha yüksek yer için bağlı olduğu standardını kullanabilirsiniz.
mbomb007

2
Bunun işe yarayacağından emin değilim. Çoğu (iyi) çevrimiçi tercüman, diğer web sayfalarının kıvrılmasına izin vermez, ancak meydan okumada, kodun çevrimiçi bir tercüman üzerinde çalışması gerektiğini söyler.
bir

Bunun hakkında konuşalım.
bir

URL çevresindeki alıntıların sayılması gerekiyor mu? Bazı cevaplar şu anda sayıları hariç tutarken, diğerleri bunları içerir.
Hvd

Yanıtlar:


2

Perl, 107 bayt

use LWP;print"I'm answer number ",1+grep($_<107,LWP::UserAgent->new->get('http://codegolf.stackexchange.com/q/60204')->content=~/<h1>.+, (\d+)/g),'.';

Biraz daha az golf:

use LWP;
$agent = new LWP::UserAgent();
$response = $agent->get('http://codegolf.stackexchange.com/q/60204');
@answers = $response->content =~ m/<h1>.+, (\d+)/g;
print "I'm answer number ", 1+grep($_<107, @answers), '.';

Örnek Kullanımı

$ perl my_rank.pl
I'm answer number 1.

7

Python 2, 145 bayt

from requests import*
print"I'm answer number %s."%(sorted([int(a["body"].split(",")[1].split()[0])for a in get('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=activity&site=codegolf&filter=!SWJ_BpAceOT6L*G2Qa').json()["items"]]).index(145)+1)

2015-10-10 17:30:00 UTC saatleri:

I'm answer number 1.

Puanım için herhangi bir URL saymadım, lütfen ne kadar eklemem gerektiği konusunda yorum yapmalıyım. Kendi puanı sabit kodlu, zaten yayınlanmış olduğunu varsayar. 99'dan fazla cevap gönderilirse kırılacaktır.


6

Otomatik, 175 bayt

(URL için 202 bayt - 27)

#include<String.au3>
$0=_StringBetween
$1=1
For $2 In $0(BinaryToString(InetRead("http://q.codegolf.xyz/60204")),'<h1>',' b')
$1+=$0($2,', ','')[0]<175?1:0
Next
ConsoleWrite("I'm answer number "&$1&".")

2015-10-09 17:47:00 UTC çıkışı:

I'm answer number 1.

Autolt'i hiç duymadım, ancak dil adında virgül varsa bunun işe yaramayacağı doğru mu? (Böyle bir dil olup olmadığını bilmiyorum, bu yüzden önemli olup olmadığından emin değilim)
Stewie Griffin

@StewieGriffin Evet, ama içinde virgül bulunan herhangi bir dili hatırlamıyorum ;-). Eğer biri gelirse değiştireceğim.
mınxomaτ

@minxomat Adı bir lyerine sahip gibi görünüyor I, bu yüzden yanlış okudum . Bunu fark etmenin tek nedeni, , bir serif olan Wikipedia makalesini .
mbomb007

Birisinin sadece bu cevabı sabote etmek için içindeki virgülle bir dil icat etmesini bekliyorum ...
Darrel Hoffman

@DarrelHoffman Peki, adında ardışık bir virgül ve boşluk olması gerekir ^^
mınxomaτ

4

JavaScript (ES7), 149 bayt

URL için 283 bayt - 134. Daha önce hiç HTTP isteği kullanmadım, ama işte gidiyor ...

x=z=>alert(`I'm answer number ${[for(y of z.items)y.body.match(/, (\d+)/)[1]].sort().indexOf("149")+1}.`);document.write('<script src="//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T&callback=x">\x3C/script>')

Firefox 41'de başarıyla test edildi.

İlk olarak, bayt sayılarını bulmak için tüm cevapların başlıklarına bakar, daha sonra bayt sayısı 243 149 ile ilk pozisyonu bulur. Şu anda sadece ilk 100 cevabı kontrol etmek için ayarlanmış ve biri 100'ün altına düşerse kırılacaktır. bayt, ama şimdilik çalışıyor. ;)

Çok daha kısa teknik için @GeorgeReith'e teşekkürler . AJAX (243 bayt) kullanan eski sürüm:

x=new XMLHttpRequest,x.onreadystatechange=_=>{if(x.readyState==4&&x.status==200)alert(`I'm answer number ${[for(y of JSON.parse(x.responseText).items)y.body.match(/, (\d+)/)[1]].sort((a,b)=>a-b).indexOf("243")+1}.`)},x.open("GET","//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T",!0),x.send()

İyi görünüyor ... Birisi başka bir 151 bayt cevap
George Reith

@GeorgeReith Nah, olmamalı. OP, bağların her iki şekilde de kırılabileceğini söylüyor ve bu sadece kendini diğerinin önüne geçirecek.
ETHproductions

Ah bunu düzenledi. Yine de, daha önce posta gönderen ve yanıtlarını düzenleyen birkaç kişiden biri yerine sizinkini bulması daha olası hale getirmek için oluşturma tarihine göre sıralamak daha iyidir.
George Reith

@GeorgeReith If other answers have the same number of bytes as your own, you can choose if you want to be best or worse of them.Bu hala ana yazıda; bir şeyi yanlış mı anlıyorum?
ETHproductions

Hiçbir özür düzenleme geçmişini okuyordu ve karıştı.
George Reith

4

PHP, 158 159 164 bayt

I'm answer number <?for(;$h[]=json_decode(fread(gzopen('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r),1e4),1)[items][+$i++][body];);echo array_sum(preg_filter(~„ÑÕß×£›ÔÖ߆‹šŒÃЗÎÑÕ‚Œš,~ÛÎÃÎÊÇ,$h)),~Ñ;

127 bayt 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'sayılmaz

Golf edilmemiş dizelerle biçimlendirilmiş sürüm:

<?
for(;
    $h[]=json_decode(
        fread(
            gzopen(
                'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r
            ), 1e4
        ), 1
    )[items][+$i++][body];
);
echo"I'm answer number ",
    array_sum(
        preg_filter('{.* (\d+) bytes</h1.*}se','$1<159', $h)
    ),
    ".";
  • JSON yanıtını yükler (@Blackhole sayesinde aslında 5 bayt kaydetmek için yanıt başına bir kez)
  • İçinde cevap organları toplar $h
  • bayt sayısı <= 159 ise tüm metni "1" (true) ile değiştirir, aksi takdirde "" (false)
  • sonuçları özetler

Gibi karakter dizileri ¶Ø’ßž‘Œˆšß‘Š’šßPHP'de geçerli sabit isimlerdir, ancak sabitler mevcut olmadığından dize değişmezi olarak kabul edilir. ~bunları tersine çevirir "I'm answer number "(her biri bir tırnak işareti için bir bayt tasarrufu)

kullanım

php -derror_reporting=0 howareyou.php

Ben 1 numaralı cevabım.


$adeğişken gerçekten gerekli? Neden basitçe yapmıyorsun $h[]=json_decode(…)[items][+$i++][body]? Bu arada tuhaf karakterler neler?
Kara delik

İyi bir nokta. Bu her cevap için yeni bir istekte bulunacaktır ama kimin umurunda :) Garip karakterler bitsel olarak ters çevrilmiş dizelerdir. Onlar mevcut değilse, string değişmezleri olarak kullanılan PHP geçerli sabit adları vardır, bu yüzden tırnak işaretleri kaydedebilirsiniz. Örneğin " "(3 bayt) (2 bayt) azaltılabilir
Fabian Schmengler

Gerçekten, bu cevaba ilişkin açıklamanızı buldum . Bu alışılmadık bir yöntem olduğu için, yazınızı burada tekrar açıklamak iyi bir fikir olabilir :).
Kara delik

Sana atlarsanız daha iyi bir çok şey yapabilir düşünmek json_decodeve sadece splitüzerinde ':': Örneğin falan codepad.org/7rZg06by
primo

İyi fikir, ancak kaynak kodlarında çok sayıda sütun olacağından güvenilmez olabileceğinden korkuyorum. Açılış PHP etiketi önce "Ben cevap numarası" koymak en az iki bayt kaydeder, bunun için teşekkürler!
Fabian Schmengler

3

Javascript (ES6), 186 bayt

(URL için 335 - 149 bayt)

a=d=>alert(`I'm answer number ${d.items.map(q=>(y=[q.body.match(/, (\d+)/)[1],(x=q.owner.user_id==11182)])&&x?z=y:y).sort().indexOf(z)+1}.`)
document.write(`<script src="https://api.stackexchange.com/questions/60204/answers?pagesize=100&order=desc&sort=activity&site=codegolf&filter=!)Q2B_A19OPkd2j8JforD00f5&callback=a">\x3C/script>`)


Bu şekilde yapabileceğine dair hiçbir fikrim yoktu! Neden \x3Cyerine kullandığını sorabilir miyim <?
ETHproductions

@ETHproductions Tarayıcı kapanış komut dosyası etiketini hemen aradığından ve komut dosyasını başka şekilde yürütmediğinden, yazı ekleme işlemine kadar komut dosyası etiketinin kapanmasını engeller. JSONP bir geri arama ile kullanır ve onu desteklese de neyse ki stackexchange API'ye bağlıdır. Dürüst olmak gerekirse, bunun nedenini tam olarak anlamıyorum ama bu meşru bir konudur.
George Reith

1

Awk, 153 bayt

BEGIN{if(u){print"I\047m answer number "system("curl -s "u"|awk -f a")".";exit}FS="1>.*,|es<\/h"}NF==3{r+=($2+0)<153?1:0}END{exit(r<1?1:r)}

Bu bir dosyaya kaydedilmeli ave şu şekilde çalıştırılmalıdır:

awk -v u=http://codegolf.stackexchange.com/questions/60204/how-are-you-doing -f a

Ben 68 bayt çıkarma http://codegolf.stackexchange.com/questions/60204/how-are-you-doingve önyükleme için koda 13 ekleyerek awk -v u=ve-f a .

Daha az golf, bu daha da kısa olabilir:

curl -s http://codegolf.stackexchange.com/questions/60204/how-are-you-doing | awk -F"1>.*,|es<\/h" 'NF==3{r+=(0+$2)<103?1:0}END{print"I\047m answer number "(r<1?1:0)"."}'

Kendini daima bağlarda tercih eder. Bayt sayısı her birinde sabit olarak kodlanmıştır.

Daha golfçü bir sürüm kendini çağırır ve çıkış değerini sistem üzerinden çıkarır. Her durumda, yalnızca sabit kodlanmış değer artışından daha düşük sayılır r; bu, daha sonra 1önde olup olmadığına göre ayarlanmalıdır .

bytesVe arasında boşluk varsa, baytları doğru bir şekilde bulamaz.</h1> muhtemelen diğer durumlarda bir dizi ben karar vermemişlerdir.

İtibariyle Sun Oct 11 05:17:51 UTC 2015, bu verir:

I'm answer number 3.

Bu benim ilk kez golf yaptığım için, herhangi bir kuralı, boşlukları, sayıları vb.
n0741337

Sanırım "Ben numarayım" yerine "Ben cevap numarasıyım" yazmanız gerekiyor.
lirtosiast

@ThomasKwa Hah! Gerçek olamayacak kadar güzel olduğunu biliyordum. Teşekkürler ve düzeltildi. Bayt geri ekleme, ihtar gerektiriyor mu?
n0741337

Bir bayrağa ihtiyacınız yok, tıpkı baytlarda golf yaparken üstü çizilmeye ihtiyacınız yok gibi.
lirtosiast

1

GNU Awk, 156 bayt

(Esinlenerek n0741337 sitesindeki awk çözeltisi ).

Bu, harici komut çalıştırmadan hepsini kendisi yapar.

BEGIN{d="/inet/tcp/0/"h"/80"
print"GET "p" HTTP/1.1\nHost:"h"\n"|&d
while(d|&getline)n+=match($0,/1>.*, ([0-9]+)/,m)&&m[1]<156
print"I'm answer number",n+1}

Ana bilgisayar adını ve yolunu ayrı değerler olarak bekler. Ücretsiz olarak mevcut oldukları göz önüne alındığında, umarım bu kuralları ihlal etmez.

Örnek çalışma:

bash-4.3$ awk -v h=codegolf.stackexchange.com -v p=/questions/60204/how-are-you-doing -f number.awk 
I'm answer number 4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.