Paul ile tavuk yemek için beş arkadaş bul


15

Paul, Belçikalı tanıdıklarınızdan biridir ve aşağıdaki beş dizeden en az birini çıkaran bir program oluşturmanızı istiyor :

12496=>14288=>15472=>14536=>14264

14264=>12496=>14288=>15472=>14536

14536=>14264=>12496=>14288=>15472

15472=>14536=>14264=>12496=>14288

14288=>15472=>14536=>14264=>12496

En gurur duyduğu arkadaşları temsil eder ve onlarla yemek yemek ister. Paul ayrıca 6 sayısının mükemmel olduğunu ve kullanmaya değer olan tek sayı olduğunu düşünüyor. Bu nedenle kodunuzda "6" dışında bir rakam kullanamazsınız (0 ila 5 ve 7 ila 9 yasaktır). Programınız herhangi bir girdi alamaz. Çıktı dizeden önce ve / veya sonra çöp içerebilir, ancak yukarıdaki dizelerden en az birini içermelidir.

Örneğin, bu geçerli bir çıktıdır:

220frefze
f**14288=>15472=>14536=>14264=>12496**fczfe fz**15472=>14536=>14264=>12496=>14288**zfe
fzehth

Soruda "hafifçe" bunun nasıl çözülmesini beklediğimi ima ettim, ama nasıl biliyor? Belki daha iyi bir yol var ... Umarım eğlenirsiniz.

Bu kod golf: bayt en düşük puan kazanır.


3
İlgili OEIS dizisi.
Emigna

5
Paul veya tavukların bununla ne ilgisi olduğunu anlayamıyorum.
Sihirli Ahtapot Urn

6
@carusocomputing: Sosyal zincir '12496 => 14288 => 15472 => 14536 => 14264 " Paul Poulet tarafından 1918'de (Belçikalı bir matematikçi) bulundu." Poulet "Fransızcada" tavuk "anlamına da geliyor.
bölücüsünün

8
Bekle, yani bir manchicken 1918'de bir sayı dizisi buldu ... ve biz sayı dizisine Paul adlı matematiksel manchicken'dan daha mı önem veriyoruz?
Sihirli Ahtapot Urn

1
@Dennis, peki bu doğru, ben bir bruteforce 4 bayt cevap beklemiyordum, her zaman bir sürprizsin: p Bu kuralı ekledim çünkü birisi tamsayılar üzerinde yineleniyorsa ve bulunan tüm sosyal ağları çıkarıyorsa bir kenar vermeyi umuyordum önce karmaşık bir sayı kodlaması olmayan zincirler. Ama sonunda, golf dışı dilde bile büyük ölçüde taban dönüşümünü ve karakter dönüşümünü destekliyor gibi görünüyor. Bence soru tasarlamak çok zor! Yine de, Enigma çıktının mülkünü kullandı ve şu ana kadar en yüksek puana sahip :)
Jylo

Yanıtlar:


12

05AB1E , 18 17 bayt

•w[•Y·FDѨO})„=>ý

Çevrimiçi deneyin!

açıklama

•w[•                # base 214 encoding of 12496
    Y·F             # loop 2*2 times
       D            # duplicate top of stack
        Ñ           # push divisors
         ¨          # remove the last element (itself)
          O         # sum
           }        # end loop
            )       # wrap in list
             „=>ý   # join list on "=>"

Kısacası, her sayıyı şu şekilde hesaplıyoruz: f(n+1) = sum(divisors(f(n)) - f(n)


5

Pyke, 16 bayt

wヰw$VDlsh)J"=>

Burada deneyin!

wヰ             -  12496
  w$            -   4
    V    )      -  repeat ^:
     D          -   duplicate(^)
      l         -     factors(^)
       s        -    sum(^)
        h       -   ^ + 1
          J     - v.join(^)
           "=>  -  "=>"

Bir dizgi değişmezi bir programın sonunda olduğunda, bunu hemen önce jetonla değiştirir ve bu gibi durumlarda 1 bayt tasarrufu sağlar. Pyke factorsişlevi sayının kendisini veya 1'i içermez. Sayılara izin verildiyse, 1 bayt değiştirilerek kaydedilebilirw$ ile4

Pyke, 21 bayt

uバ㟐㱰㣈㞸J"=>

Burada deneyin!

Gerekli numaraların bir listesini oluşturun ve birleştirin. Dizeleri ile hile dışında çok ilginç değil.


4

MATLAB, 44 bayt

['','=>@EBIJ=@>DDIJ=A@C>IJ=@A?BIJ=@>B@'-6-6]

Çevrimiçi deneyin!

Sayılarda bir desen bulamadım (ve sayıları kullanamadığım için zaten bir şey kullanmak zor olurdu), bu yüzden sadece naif yaklaşıma gideceğim.

'=>@EBIJ=@>DDIJ=A@C>IJ=@A?BIJ=@>B@''12496=>14288=>15472=>14536=>14264'ASCII değerlerine 12 eklendiğinde dizedir . Şimdi, karakter dizisine dönüştürmek 6+6için boş dizeyi girin '', çıkartın ve bitiştirin .


Evet, özür dilerim, sayının zor kodlanmasını önlemek istedim, ama 'golf' diline bir son vereceğinden eminim. Her sayı bir öncekinin bölücüsünün toplamı olmasına rağmen bir desen yoktur.
Jylo

1
Kodlanmış dizenin hala içerdiği yolu seviyorum =>.
Neil

3

JavaScript (ES6), 57 bayt / 47 (UTF-8) karakter

10 B tasarruf için user5090812 sayesinde

_=>[...'バ㟐㱰㣈㞸'].map(a=>a.charCodeAt()).join`=>`

açıklama

İlk önce bir dizi oluştururuz ve dizideki karakterlerle doldururuz バ㟐㱰㣈㞸. Sonra dize üzerinde döngü ( ageçerli öğenin değeri vardır) ve karakteri karakter koduna değiştiririz. Sonra dizideki tüm değerleri=> .

Eski: 67 bayt

_=>[6,6,6,6,6].map((_,a)=>`バ㟐㱰㣈㞸`.charCodeAt(a)).join`=>`

açıklama

Önce 5 uzunluğunda bir dizi oluştururuz. Sonra dizede aynı dizindeki karakterin karakter kodu için dizinin değerlerini değiştiririz バ㟐㱰㣈㞸. Bunu elde ettiğimizde, diziye birlikte katılıyoruz ve =>ayırıcı olarak kullanıyoruz .

kullanım

Kullanmak için şunu çalıştırın:

f=_=>[...'バ㟐㱰㣈㞸'].map(a=>a.charCodeAt()).join`=>`;alert(f())

Çıktı

12496=>14288=>15472=>14536=>14264

_ => [... 'バ 㟐 㱰 㣈 㞸'] hakkında .map (s => s.charCodeAt ()). Katıl `=>`
user5090812 13:17

@ user5090812 Öneri için teşekkürler!
Luke

3

Ruby, 36 bayt (26 karakter)

p"バ㟐㱰㣈㞸".unpack("U*")*"=>"

Çünkü neden olmasın. Cehennem kadar sıkıcı.

eski sürüm - 53 bayt

p %w(jol mld oim n6b mke).map{|x|x.to_i ~-6*~-6}*'=>'

Açıklama: 25 tabanındaki sayıları kodlamak 5 altı serbest dizeyi verir, bunları çözmek için sadece 6'yı kullanarak sadece 25 sayısını temsil etmem gerekir: (6-1) (6-1) => ~ -6 ~ -6


UTF8 ile 36 bayt sayıyorum, 26 değil.
Sml

1
Sanırım karakterleri saydı, baytları değil. Bu siteyi her zaman bayt sayımı için kullanıyorum .
Luke

Şimdi düzeltildi.
GB

3

Perl 6 , 63 59 bayt

{$/=6;$/--;join "=>",<JOL MLD OIM N6B MKE>».parse-base($/*$/)}

{join "=>",<JOL MLD OIM N6B MKE>».parse-base(--($_=6)*$_)}

Taban 25'teki sayıların kodunu çözer, çünkü .parse-basehiçbirinin geçersiz basamak içermediği (2 ila 36) tarafından desteklenen tek taban budur .

Neil'e -3 bayt için teşekkürler.

Perl 6 , 82 75 bayt

{my \a="BXS".parse-base(6*6);join "=>",(a,{sum grep $_%%*,^$_}...^{$_==a if $++})}

{my \a="BXS".parse-base(6*6);join "=>",({$/=$_//a;sum grep $/%%*,^$/}...a)}

15472Taban 36'daki sayının kodunu çözer ve daha sonra her bir sayıyı bir önceki sayının uygun bölenlerinin toplamı olarak hesaplayarak sekansı üretir.

Perl 6 , 69 bayt (47 karakter) - rakipsiz

{"{١٢۴۹6}=>{١۴۲۸۸}=>{١۵۴۷۲}=>{١۴۵۳6}=>{١۴۲6۴}"}

Yasak ASCII basamaklarının hiçbirini kullanmaz, bunun yerine Arapça-Hintçe bloktaki Unicode basamaklarını kullanır (her biri 2 bayt)! { }Dize interpolasyonları onlar Perl 6 sayı hazır bilgi olarak çözümlenen ve ardından ASCII temsilciliklerine dizgelenmiş emin olun.

Tamam, bu hile yapıyor - bu yüzden ana cevabım olarak kullanmadım ... :)


Bir Perl 6 çevirmenine kolayca erişemediğim için yazmak işe yarıyor --$/*$/mu?
Neil

@Neil: Öyle. Teşekkürler! Aslında, ödevi sıraya koyarsam bile çalışır --($/=6)*$/).
smls

3

Jöle , 5 4 bayt

ȷṗȷỌ

Beş dizenin tümünü yazdırır. "Çöp" çıktısına izin verilir ve beş dizeyi gömür 10 3003'te gömür karakterlik çıktıya .

Nasıl çalışır

ȷṗȷỌ  Main link. No arguments.

ȷ     Set the return value to 1000.
 ṗȷ   Cartesian power; form all arrays of length 1000 that consist of integers in
      [1, ..., 1000].
   Ọ  Unordinal; convert all integers to characters.

Çıktı içinde gerekli dizenin bayt uzaklığı nedir?
Neil

Gerekli dizelerden herhangi birinin gerçekten yazdırıldığını destekleyen herhangi bir kanıt var mı?
Outgolfer Erik

1
@Neil Karakter uzaklığı 48049051056053060061048051049055055060061048052051054049060061048051052050053060061048051049053051000 . Baytlardan emin değilim.
Dennis

@EriktheOutgolfer Eğer aslında makul zaman ve hafıza kısıtlamalarıyla kastediyorsanız, hayır. Zorluk yine de herhangi bir sınır belirlemez ve varsayılan olarak sınırsızdır.
Dennis

@Dennis Hayır, demek istediğim. Tabii ki yakında işini bitirmeyeceği ima ediliyor. Kodlara bakılırsa, bu dizelerden herhangi birini yazdırmanın pek mümkün olmadığını düşünüyorum. Sonra, yine, makul bir kanıt düşündüm ...
Outgolfer Erik

2

C, 94 84 77 Bayt

Çok basit. Özel teşekkürler @Neil

g(){char*m="!mnpuryzmpnttyzmqpsnyzmpqoryzmpnrp";for(;*++m;)putchar(*m-66+6);}

f () {printf ("% d =>% d =>% d =>% d =>% d", '~' 'r' - 'd', '~' 'd' - 's', ' ~ ' ' r '-' L ',' ~ ' ' z '+' d ',' ~ '*' t '-' P ');}


En azından ideone'de, bir bayt kaydetmek için char*miçerisini hareket ettirebilirsiniz for()ve ayrıca işlevi yeniden kullanılabilir hale getirir (işlevlerin gerekli koşulu). Ayrıca, bir boş null çıktı; *++mbunu düzeltir. Ayrıca, 66: yerine 60 çıkararak bazı baytlar kaydedebilirsiniz g(){for(char*m="!mnpuryzmpnttyzmqpsnyzmpqoryzmpnrp";*++m;)putchar(*m-66+6);}.
Neil

Ya da yaklaşımı, başka bir bayt kaydedecek olan MATLAB cevabından kopyalayabilirsiniz.
Neil

@ Ne derleyici benim for döngüsü içinde bildirmeme izin vermez initial declaration used outside C99 modeama putchar basitleştirmek için mutluyum. Teşekkürler!
cleblanc

1

PHP, 73 63 60 bayt

for(;$c="|`*X6H-$*@"[$i];)echo!!$i&++$i?"=>".!!6:"",ord($c);

İle çalıştırın -nr.

daha az tembel biraz: listesi olarak dize aldı =>1(ascii)(ascii)
yani: 124, 96, =>1, 42, 88, =>1, 54, 72, =>1, 45, 36, =>1, 42, 64; dize dizinine göre
yazdır =>1, ascii kodunu ekle

Yıkmak

            # loop through string with index $i
for(;$c="|`*X6H-$*@"[$i];)echo
            # string ascii values: 124,96,42,88,54,72,45,36,42,64
    !!$i        # true if $i>0
    &++$i       # odd if (old) $i is 0,2,4,6,8
                # -> true for 2,4,6,8
        ?"=>".!!6   # if true, print "=>1"
        :"",        # else print nothing
    ord($c);    # print ascii value

1

C ++, 92 bayt

#include <cstdio>
int main(){for(char c:"UVX]ZabUXV\\abUYX[VabUXYWZabUXVZX")putchar(c-6*6);}

1

PHP, 53 bayt

<?=join('=>',unpack('v*',gzinflate('�`p������s')));

Hex dökümü:

00000000: 3c3f 3d6a 6f69 6e28 273d 3e27 2c75 6e70  <?=join('=>',unp
00000010: 6163 6b28 2776 2a27 2c67 7a69 6e66 6c61  ack('v*',gzinfla
00000020: 7465 2827 bb60 70c1 bcc0 e684 c50e 7300  te('.`p.......s.
00000030: 2729 2929 3b                             ')));

Çıktı:

12496=>14288=>15472=>14536=>14264

Açıklama:

Beş basamaklı tamsayı bölümlerin her biri imzasız kısa bir küçük endian olarak kodlanır, sonra bir araya getirilir ve sonuç sıkıştırılır. Bu, rahatsız edici basamak karakterleri olmayan bir bayt buharı üretir ve bu daha sonra bir dizeye sabit olarak kodlanır. Çıkarmak için akışı çıkarın, iki baytlık şortları paketinden çıkarın, her birini bir dize olarak yorumlayın ve birleştirin >=.


arızaya ne dersin?
Titus

1

Java 8, 134 bayt

golfed:

()->{String s="";for(String a:new String[]{"JOL","MLD","OIM","N6B","MKE"}){if(!s.isEmpty())s+=("=>");s+=Long.valueOf(a,25);}return s;}

Ungolfed, tam program:

import java.util.function.*;

public class FindFiveFriendsToEatChickenWithPaul {

  public static void main(String[] args) {
    System.out.println(toString(() -> {
      String s = "";
      for (String a : new String[] { "JOL", "MLD", "OIM", "N6B", "MKE" }) {
        if (!s.isEmpty()) s += ("=>");
        s += Long.valueOf(a, 25);
      }
      return s;
    }));

  }

  private static String toString(Supplier<String> s) {
    return s.get();
  }

}

1

Toplu, 191 bayt

@set/as=n=66*(66+66+66+6*6)+66/6+66/6+6,u=6/6
@call:t
@call:t
@echo %s: ==^>%
@exit/b
:t
@call:c
:c
@for /l %%i in (%u%,%u%,%n%)do @set/an-=%%i*!(%n%%%%%i)
@set/an=-n
@set s=%s% %n%

Her bir sayıyı hesaplamak için en az 32 bayt alacağını tahmin 6ediyorum. Ayrıca, %arka arkaya beş s benim için bir kayıt olduğunu düşünüyorum. Ayrıca, düzgün Toplu hile: döngü değerlendirilmeden %n%önce ikame foredilir, böylece döngü tüm faktörleri hesaplarn ve çıkarır n, böylece istenen sonucun olumsuzlanmasıyla sonuçlanır.


1

Jöle , 12 bayt

“<ọ’ÆṣÐĿj“=>

Dördüncü dizeyi yazdırır ve başka bir şey yazdırmaz.

Çevrimiçi deneyin!

Nasıl çalışır

“<ọ’ÆṣÐĿj“=>  Main link. No arguments.

“<ọ’          Yield the 1-based indices of '<' and 'ọ' in Jelly's code page, i.e.,
              [61, 222], and convert the array from base 250 to integer.
              This yields 15472.
      ÐĿ      Iteratively call the link to the left until the results are no longer
              unique and return the array of all unique results.
    Æṣ        Compute the proper digit sum of the previous value (initially 15472).
        j“=>  Join, separating by the string "=>".

0

Python 2, 78 72 bayt

print''.join(chr(ord(x)-6-6)for x in'=@>DDIJ=A@C>IJ=@A?BIJ=@>B@IJ=>@EB')

Edit - Teşekkürler Stewie Griffin 6 bayt tasarruf !

Ayrıca, başka bir çözüm, olası tüm permütasyonları çıkarmak olacaktır. OP çöpün iyi olduğunu söylüyor.

from itertools import permutations
print str(list(permutations(''.join(str(x)+'.'for x in range(int('9'*5)).replace(',','').replace('\'','') 
# also 9 and 5 need to be converted using ord and chr

Dönüştürme çok fazla fazlalık vardır intya listkadar str. Bazı ezoterik dillerde bu daha kolay olurdu sanırım, ama hiçbirini bilmiyorum.


12 yerine 66 ekler misiniz? Bu başka bir bayt tasarrufu sağlar.
GB

Normal ASCII aralığındaki @GB'den çıkacak, yani karakter başına iki bayt saymanız gerekecek.
Stewie Griffin

Gördüm ki, '=>' karakterlerini saymadım.
GB
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.