Joker karakter dizisiyle eşleşen tüm kareler [kapalı]


9

Bu, 2016 ARML yarışması Takım Sorunu # 6'nın bir parçasıydı.

İşte zorluk:

Size bir rakam dizisi ve başka bir karakter olan bir "joker karakter dizisi" verilir. Bir dize, bu joker karakter dizisiyle aşağıdaki sahte kodla eşleşir:

w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]

Nerede '?' seçtiğiniz bir karakterdir.

Regex açısından, sadece hayal '?'olmaya '.'.

Zorluk, ondalık dizgi gösterimleri bu joker karakter dizisiyle eşleşen tüm kare sayılarını (gereksinim 1 milyona kadardır) bulmaktır. "Joker karakter", bir rakam olmadığı sürece, seçtiğiniz herhangi bir ASCII karakteri olabilir.

Örneğin, 4096maçları 4**6ve 4*9*fakat 4114ikisinden biri uyuşmuyor.

Giriş

Giriş normal ifadeyle eşleşen bir sıra olarak verilecektir [0-9?]+. Bu, bir dize, bir karakter dizisi veya ASCII'deki karakterlerin bayt dizisi olabilir.

Çıktı

Çıktı, mükemmel kareler olan ve joker karakter dizisiyle eşleşen, istediğiniz sınırlandırılmış liste / küme / sayı dizisi olacaktır.

Geçerli girdi örnekleri:

1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]

Geçerli çıktı örnekleri:

[1, 4, 9]
1 4 9
1, 4, 9
1-4-9

vb.

Özellikler

  • Belirli bir aralıktaki karelerin bir listesini bulmak için yerleşikleri kullanamazsınız
  • Standart Loopholes Uygula
  • 1 000 000'e (1 milyon) kadar işlem yapabilmelisiniz
  • Giriş ile birlikte verilirse 1******, yazdırmak doğrudur [1000000]. Yazdırmak da doğru[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
  • Joker karakter dizileri hiçbir zaman joker karakterle başlamaz; yani, her zaman aynı uzunlukta dizelerle eşleşeceklerdir.

Test Durumları

4**6  ->  [4096, 4356]
1**1  ->  [1521, 1681]
1**  ->  [100, 121, 144, 169, 196]
9****9  ->  [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9***  ->  [919681, 929296]
1**0*  ->  [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4  ->  [91204, 94864, 97344]

Kazanan

14 Şubat'a kadar en kısa (geçerli) (çalışan) gönderim, en erken gönderim kazanarak eşitlik.


1
Bu açıklığa kavuşturmak için iyi bir başlangıç ?, cevaplayan tarafından seçilecek olduğunu belirtmek olacaktır .
FryAmTheEggman

2
Neden 25geçerli bir cevap var ***ama değil *2*?
Neil

3
Bence bu sayıların hiç sıfırları olmasaydı daha temiz olurdu, bu yüzden sadece uzunluklarının eşleşen dizileri.
xnor

@Neil Bu benim kendi çözümümle ilgili bir sorun olurdu. Xnor'ın önerisini alacağım.
HyperNeutrino

Girdi, bir basamaklı tamsayılar dizisi ve {4, "w", "w", 6}(veya daha iyisi {4, w, w, 6}) gibi özel bir karakter dizisi gibi bir karakter dizisi olabilir {"4", "w", "w", "6"}mi?
Greg Martin

Yanıtlar:


0

05AB1E , 22 bayt

Muhtemelen burada iyileştirilmesi için bol yer.
Sayı olmayan tüm karakterler joker karakter olarak kullanılabilir.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

Çevrimiçi deneyin!

Daha fazla golf sonrası gelecek açıklama.


Bu, tüm girdiler için işe yarıyor gibi görünüyor. Aferin.
HyperNeutrino

1

Mathematica, 44 bayt

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

Girdi, _joker karakter olarak (tırnak işaretleri olmadan) rakamların listesidir . Örneğin{4, _, _, 6}

açıklama

Range@1*^3

Liste oluştur {1, 2, 3, ... , 1000}

... ^2

Kare. (1 ile 1.000.000 arasındaki tüm karelerin listesi)

IntegerDigits[ ... ]

Her kareyi bir rakam listesine bölün.

... ~Cases~#

Giriş tarafından belirtilen desenle eşleşenleri bulun.

Print@@@ ...

Yazdırın.


Bu, tüm test senaryolarında işe yarıyor gibi görünüyor. Aferin.
HyperNeutrino

1

Brachylog , 23 bayt

@e:{@$|,}a#0:{c.~^#I,}f

Çevrimiçi deneyin!

açıklama

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

Farklı giriş formatı, 13 bayt

Girdi olarak geçerli olarak değerlendirdiğiniz şeye bağlı olarak, bunu yapabilirsiniz:

#0:{c.~^#I,}f

Çevrimiçi deneyin!

temel olarak yukarıdaki cevabın ikinci kısmıdır ve joker karakterlerin bulunduğu basamakları ve değişkenleri içeren girdi olarak bir liste içerir.

Bunu geçerli bulmuyorum çünkü Brachylog'da (büyük harfler) sadece 26 değişken ismi var, bu yüzden 26'dan fazla wilcards varsa bu işe yaramaz.


Bu, tüm girdiler için işe yarıyor gibi görünüyor. Aferin. Ancak, 1 baytlık bir argüman gerekli olduğundan, bunu 24 bayt olarak kabul ediyorum. Bunun için puanlamanın nasıl çalışacağından emin değilim.
HyperNeutrino

1
@AlexL. Bağımsız değişken yalnızca çıktı değişkeninin adını söylemek için vardır (isterseniz başka bir büyük harf kullanabilirsiniz). Bu, yüklem / işlevin adlandırıldığı işlevlere sahip Prolog / dillerdeki yanıtlara benzer, ancak aradığınızda kullandığınız baytları gerçekten saymazsınız.
17'de

Tamam. Argüman gerekli olduğu için 24 puan alması gerekip gerekmediğinden emin değilim (aksi takdirde sadece geri döner true.), ancak daha önce bunu gerektiren dilleri kullanmadım. Bunu nasıl puanlamam gerektiğini belirlemek için bazı referanslar bulmaya çalışacağım, ancak 23 olarak puanlamak mantıklı olacaktır, bu yüzden onu tutacağım.
HyperNeutrino

1

Perl 6 , 30 26 bayt

-4 baytlık @ b2gills sayesinde!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

Girdinin normal ifade olarak kullanılabilmesi için noktayı joker karakter olarak kullanır:

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

Çevrimiçi deneyin .

Yıldız işaretini joker karakter olarak kabul eden bir varyant (görev açıklamasının önceki bir düzeltmesiyle önerildiği gibi) 42 bayt olur:

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}

Kuralları yeniden düzenledim ve herhangi bir joker karakteri seçebilirsiniz. Bunu 38 bayt olarak puanlıyorum.
HyperNeutrino

Um, bunu nasıl kullanıyorsun? Perl hakkında hiçbir şey bilmiyorum.
HyperNeutrino

@AlexL .: Teşekkürler, cevabı güncelledim (ve bir açıklama da ekledim). Bu bir lambda; doğrudan arayabilir (örneğin { ... }("9*9***")) veya daha sonra kullanmak üzere bir değişkene / sembole atayabilirsiniz. Perl 6'nın Perl'den ayrı bir dil olduğunu unutmayın, bu yüzden Perl yorumlayıcısıyla çalışmaz.
sml

Kullandığım sudo apt-get install rakudoben koyduğunuzda sözde Perl6 tercüman olsun ... perl6benim terminale bir komut olarak, bir Perl6 tercüman gibi görünüyor ne başlar, ancak bunu nasıl kullanılacağını bilmiyorum. Bunun lambda olduğunu biliyorum, ama nasıl arayacağımı bilmiyorum.
HyperNeutrino

@AlexL .: Ben çalıştırabilirsiniz tam bir komut dosyası olarak gösteren bir "çevrimiçi deneyin" bağlantısı ekledi perl6 foo.p6. Ayrıca, bir kabuk oneliner'da da test edebilirsinizperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
smls

1

Ruby, 54 bayt

Dize bağımsız değişkenini alan işlev. Çevrimiçi deneyin.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}

Sen benim i yerine i * kullanarak bir bayt kurtarabilecek ** 2
TR

Bu işe yaramaz gibi görünüyor çünkü ikincisi #satırın geri kalanını yorum yapıyor.
HyperNeutrino

@AlexL Oh, iyi çalışıyor. repl.it/FJCV
Değer Mürekkebi

ohhhh tamam Ruby'yi nasıl test edeceğimi bilmiyordum. Özür dilerim. Bu, tüm girdiler için işe yarıyor gibi görünüyor. Aferin!
HyperNeutrino

0

Toplu, 109 bayt

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

?Joker karakter olarak kullanır . 1000 dosya oluşturarak çalışır. Dosyanın adı kare numarasıdır ve dosyanın uzantısı $sonek içeren kare numarasıdır . Sondaki toplu en desen eşleştirme sayar Bunun nedeni ?opsiyonel olarak s, böylece 1?hem eşleşir 1ve 16; bu $nedenle maçı kesin olmaya zorlar. Ancak, çıktısını almak istemiyoruz $, bu yüzden dosya adını sadece uzantı olmadan çıkarıyoruz.


0

JavaScript (ES6), 68 66 bayt

EDIT: JungHwan Min'in cevabından ilham aldıktan sonra aşağıdaki çözümümü güncelledim . Artık ES6 uyumlu.

Joker karakterin '1..4'bulunduğu formatta girdi alır ..

1e6'ya yineleme ve kare köklenme yerine bu 1e3 ve karelere yinelenir.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

JavaScript (ES7), 71 69 bayt

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

0 ile 1e6 arasında bir sayı dizisi oluşturur, ardından kare ve desene uygun sayılarla filtreler.

Korkunç derecede yavaştır, çünkü her zaman 1e6'ya kadar yinelenir.


**Çalıştığını sanmıyorum , çünkü bana bir veriyor "SyntaxError: expected expression, got '*'".
HyperNeutrino

@AlexL. Kurallar değişmiş gibi görünüyor. Önceki kurallar joker karakteri seçebileceğimi önerdi.
George Reith

Tek yapmanız gereken 1e6...
HyperNeutrino

Ayrıca, kuralları geri değiştirdim; sorun kurallarda değil, **operatörün mevcut olmaması, en azından sistemimde olmaması.
HyperNeutrino

@AlexL. Ah, girdi demek istediğini sanıyordum **. Evet burada başlık güncelleyecek ES7 anda desteklenen tarayıcıların bir listesi olduğunu developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
George Reith

0

Perl, 42 45 38 bayt

DÜZENLEME: Alex tarafından açıklama, bu dönemi y // işlemini kesen joker karakter olarak kullanabiliriz.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

EDIT: yıldız işareti joker karakter olarak kullanan ve STDIN üzerinde joker sıra beklemek çözüm

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

Bu hiç şüphesiz iyileştirme için çok fazla alan bırakıyor, oldukça basit. Joker karakter ifadesinin nokta joker karakteriyle (başka ne?) Komut satırı bağımsız değişkeni olması beklenir.

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"

Soru, joker karakterlerin yıldız işareti olarak verildiğini belirtir. Sorunun daha önce gözden geçirilmesi kendi joker karakterinizi seçmenize izin verdi mi?
smls

1
@smls: Soru, kural bölümünde olmasa da kendi joker karakterinizi seçmeyi hala belirtiyor: Joker karakter olarak kullanılan karakterin mutlaka bir yıldız işareti olması gerekmez, seçtiğiniz herhangi bir ASCII karakteri olabilir. açıkçası bir rakam değil.
Emigna

Evet, kafam karıştı. Daha sonra, joker karakterin bir yıldız işareti olması gerektiği açıkça görülmektedir. Regex ile tanımı önde gidiyor sanırım. Çözümümü gözden geçireceğim.
daniel

1
Hımm aslında @Emigna aktardığı cümle biz bu oldukça açıktır olabilir o, kendi joker karakter seçmek değil?
smls

Açıklığa kavuşturmak için, joker karakter istediğiniz her şey olabilir. Açıklamayı tekrar yazarken yanlışlıkla kuralları bozdum.
HyperNeutrino

0

Python 3-98 97 bayt

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

'4..6' gibi giriş gerektirir.


Sen kullanarak 3 bayt kaydedebilir import reve re.findall; ile optimizasyon from...import *aslında bu durumda onu optimize etmez.
HyperNeutrino

Girilen girdi 1...., geçerli cevaplar verir 1 4 9ve 16 25doğru değildir. Lütfen programınızı düzeltin.
HyperNeutrino

"\ N" üzerine katılarak durumu düzeltin.
Carra

Bu işe yaramıyor 1....... Geri döner [], ama vermelidir [1000000]. Bu, range(0, 1001)yerine 0 bayt maliyetiyle sabitlenebilir range(0, 1000).
HyperNeutrino

İyi bir nokta, sadece açıklamasından tüm test vakalarını kontrol ettim :)
Carra

0

k - 28 karakter

{s(&:)($:s:s*s:!1001)like x}

Kullanımları ?joker karakter olarak. likeFonksiyon kullanımları ?joker olarak ve bu fonksiyon ilk 1001 karelerinden oluşan bir liste yapar, sonra da kalıpla eşleşen çekleri dizeleri hepsini atmalarını ve (1M dahil olmak üzere).

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196

Bunun için bu hatayı alıyorum: type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":". Çalışan bir test paketine bağlantı verebilir misiniz veya bir sorun olup olmadığını görebilir misiniz?
HyperNeutrino

@AlexL. Benim için kdb + 'nın k modunda çalışıyor
C. Quilley

Hmm. Farklı çevirmenlerle test etmeye çalışacağım.
HyperNeutrino

0

bash + Unix yardımcı programları, 33 bayt

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

Bu '.' joker karakter olarak.

Dc programı kare sayıları sonsuz bir döngü halinde yazdırır:

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

DC çıkışı grep'e borudur, bu da sadece gerekli desene uyan kareleri yazdırır.

Bu, gerçek bir Linux veya OS X sisteminde çalıştırdığımda çalışır (ancak muhtemelen DC programı sonsuza kadar geri almaya çalıştığı için TIO'da çalışmaz ve TIO'nun özyineleme için yığın alanının bitmesinden ve / veya hiç bitmeyen bir boru ile ilgili bir sorun).


Bunu Linux Mint 17.3 Rosa ile çalıştırıyorum ve bitmiyor. Bence sorun hiç bitmeyen bir dcemirdir.
HyperNeutrino

Soruna neden olan tamponlama olduğundan şüpheleniyorum. Bu Linux sürümüne sahip değilim, ancak grep'i grep --line-buffered ile değiştirmeyi deneyebilirsiniz (her satırın açıldığı gibi yazdırılmasına neden olmak için). [Tabii ki, bu bir dizi bayt ekler.]
Mitchell Spector

Grep argümanını ekledim, ama bir fark yaratmıyor. Her --line-bufferediki tarafına da koymayı denedim ^$1$, ama her iki şekilde de çalışmıyor.
HyperNeutrino

@ AlexL.İstediğiniz için teşekkür ederiz. Aradaki farkın çekirdeğin içinde mi yoksa bash versiyonunda mı olduğunu bilmiyorum. Başını kullanarak grep girişine bir sonu zorlayarak TIO'da çalışmayı başardım: dc <<< '0 [2 ^ pv1 + lax] dsax' | head -1 sed s/./0/g<<<$1| grep ^ $ 1 $ Bu, (4 karakterlik desenler sadece 9999'a kadar kontrol eder). İşte bir TIO bağlantısı: tio.run/nexus/…
Mitchell Spector

Düzeltme için teşekkürler. Mevcut çözümün gerçekten işe yarayacağını sanmıyorum (bash hakkında çok fazla bilgim olmasa da), çünkü bunu beslemeden önce tüm değerleri hesaplaması gerekiyor gibi görünüyor grep. Ancak, şu anda en kısa çözüm olmadığından, puanlama için 33 baytta tutacağım. Tüm girdiler için çalışıyor gibi görünüyor, çok iyi bir iş!
HyperNeutrino
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.