N ve n ^ 3 aynı rakam grubuna sahip mi?


52

Bir sayısı göz önüne alındığında , N (0 <= N ise <= 2.642.245), kontrol , n ve n, 3 bir truthy veya Falsey değeri de buna uygun aynı basamak kümesini ve çıkış bulunmaktadır.

Örneğin, 100 sayısını kontrol edelim.

100 3 , 1000000'dür.

100'deki rakam kümesi {0, 1} 'dir.

1000000’deki rakam kümesi {0, 1} 'dir.

Bu nedenle, 100 gerçeğe uygun bir değer vermelidir.

Test durumları

0 -> True
1 -> True
10 -> True
107624 -> True
251894 -> True
251895 -> False
102343 -> False

Unutmayın, bu , bu yüzden en az bayt olan kod kazanır.

OEIS A029795


28
Önerilen test durumu: 106239
Dennis

8
Test durumda: 2103869 -> True. Bu (veya daha büyük olanı) bir dili longveri türü ile test etmek için gereklidir .
mbomb007

5
Çok kötü, maksimum 64 bitlik bir tamsayı türü olmayan dil için çok büyük.
edc65

17
Bence taban konusunda açık olmalısın ... ikili olarak eğlencenin yarısı :-D
The Vee

7
@ ZoltánSchmidt 106.239 en küçük pozitif tam sayı olduğu N , öyle ki - 1199090390129919 - tüm rakamlarını içermeyen n . Bazı cevaplar yalnızca n'nin tüm n basamaklarını içerip içermediğini kontrol ediyordu ve bu nedenle 106239 için yanlış sonuç aldı .
Dennis,

Yanıtlar:


28

Python 3, 36 32 bayt

lambda x:{*str(x)}=={*str(x**3)}

Bunun sadece Python 3.5 ve sonrasında çalıştığını düşünüyorum. Copper sayesinde dört bayt gitti.


8
Python 2'de backtics'i repr () için kısayol olarak kullanabilir, 6 bayt kaydedebilirsiniz. set(`x`)
DenDenDo

9
Herhangi bir giriş daha büyük @DenDenDo 2097152( sys.maxint**(1/3.)) ve daha az sys.maxint+1dönecektir Falsekullanırsanız repr(). repl.it/EXs2/1 . Uzun Lsürenin sonunda bir var.
mbomb007

9
Denenmemiş, ancak muhtemelen lambda x:{*str(x)}=={*str(x**3)}Python 3.5+ ile yapabilirsiniz.
Bakır,

1
@BenHoyt print (...) ve input () kullanmaktan daha özlüdür. Bir işlev yapmak, tam bir program yapmaktan daha kısadır.
0WJYxW9FMN

1
Sorusu bir truthy veya falsy değer yeterlidir dönen diyor olduğundan, yerine ==göre ^. İki eşit küme {}hangi sahtedir.
RemcoGerlich

19

05AB1E , 6 bayt

05AB1E, CP-1252 kodlamasını kullanır .

3mê¹êQ

Çevrimiçi deneyin!

açıklama

3m       # input^3
  ê      # sorted with duplicates removed
     Q   # is equal to
   ¹ê    # input sorted with duplicates removed

1
@PuzomorCroatia: 05AB1E, CP-1252 kodlamasını kullanır , böylece tüm bu karakterler her biri 1 bayttır. Golf dillerinin UTF-8'den daha fazla yazdırılabilir karakter içeren kod sayfalarını kullanması veya alternatif olarak kendi kod sayfasını oluşturması oldukça yaygındır.
Emigna

7
Cevap için teşekkürler. Maalesef yorumumu düzenlemeye çalışırken silindi. Sadece işleri açıklığa kavuşturmak için kod golf dilindeki karakterlerin kodlanması hakkında sorular sordum
Puzomor Hırvatistan

14

C, 73 bayt

k;b(i){k=0;while(i)k|=1<<i%10,i/=10;return k;}f(n){return b(n)-b(n*n*n);}

Seti bitler üzerinden oluşturur. İade 0aynı kümesi için, farklı setleri için başka bir şey.

Ungolfed:

k;
b(i){
  k=0;
  while(i)
    k|=1<<i%10,
    i/=10;
  return k;
}

f(n){
  return b(n)-b(n*n*n);
}

Ungolfed kodu eksik 1 <<olan bitleri ayarlarken k |= 1 << i % 10. Harika çözüm!
1Darco1

1
Bu bitmap fikrini 39 byte x86-64 makine kodu fonksiyonu yapmak için kullandım :)
Peter Cordes

0Gerçek gibi düşünmemize izin var mı? Sanırım strcmpbu şekilde çalışıyor, bu yüzden C’de makul gözüküyor
Peter Cordes

1
Bu sadece, int64-bit'den büyükse , soru tarafından istenen tüm girdiler için çalışır . (İmzalı 64 bit bile yeterli değil, ancak imzasız 64 bit ise). Bu nedenle, sorunun sorunun gereksinimlerini nerede karşıladığını bildiğim hiçbir C gerçek uygulaması yok. (Doğru bir şekilde unsigned long longveya sadece unsigned long64-bit tip olduğu uygulamalarda çalışır). GNU C __int128_t64-bit makinelerde (herhangi bir başlık olmadan) tanımlar ...
Peter Cordes

8

Perl, 31 + 2 ( -plbayrak) = 25 21 18 34 33 bayt

$_=($==$_**3)!~/[^$_]/*!/[^$=]/

Kullanımı:

perl -ple '$_=($==$_**3)!~/[^$_]/*!/[^$=]/' <<< 251894

Çıktı: 1\nveya 0\n.

3 bayt için @Dada, 1 bayt için Gabriel Benamy, ve hata raporları için @ Zaid Thanx.


1
Güzel cevap! Hala birkaç (3) bayt kaydedebilirsiniz:perl -pe '$_=$_**3!~/[^$_]/'
Dada

@ Zaid Thanx. Sabit.
Denis İbaev

Şimdi bunun için false çıktıları verir 10:(
Zaid

@ Zaid Yep. -lbayrak gerekli.
Denis İbaev

2
Change &&a *bir byte kaydetmek
Gabriel Benamy

7

Mathematica, 34 bayt

f=Union@*IntegerDigits;f@#==f[#^3]&

Doğrudan uygulama (bir tamsayı argümanının adsız işlevi).


7

Jöle , 8 bayt

,3*\D‘ṬE

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

,3*\D‘ṬE  Main link. Argument: n

,3        Pair; yield [n, 3].
  *\      Cumulative reduce by exponentation. Yields [n, n³].
    D     Decimal; yield the digit arrays of n and n³.
     ‘    Increment, mapping 0 ... 9 to 1 ... 10.
      Ṭ   Untruth (vectorizes); map digit array [a, b, c, ...] to the smallest
          of zeroes with ones at indices a, b, c, ...
       E  Test the results for equality.

6

CJam, 8 bayt

l_~3#s^!

Test odası.

açıklama

l   e# Read input.
_~  e# Duplicate and evaluate.
3#  e# Raise to third power.
s   e# Convert back to string.
^   e# Symmetric set difference. Gives an empty list iff the two sets
    e# are equal.
!   e# Logical NOT.

6

JavaScript ES6, 55 51 bayt

3 bayt için Downgoat'a teşekkürler! ES7'ye dönüştürerek ve n**3yerine kullanarak bir bayt kaydedebilirsiniz n*n*n.

n=>(f=s=>[...new Set(s+[])].sort()+[])(n)==f(n*n*n)

Yeterince basit.


Eşdeğerlik için kümeleri karşılaştırmanın daha iyi bir yolu olmaması korkunç
njzk2

1
@ njzk2 Diyelim ki en büyük trajedi, ==dizilerde bile işe yaramazsa.
Conor O'Brien,

Sen değiştirerek byte kaydedebilirsiniz n*n*niçin n**3, ama o ES7 olup ES6 olabilir sanırım.
Robert Hickman,

1
@Downgoat Teşekkürler, bu biraz daha bayt kurtarmak için bana ilham verdi!
Conor O'Brien,

3
Bu başarısız olur 2103869ve sorun açıkça çalışmak için çözümler gerektirir 2642245.
user5090812 16:16

6

C #, 241 208 205 201 193 233 222 220 212 203 177 159 bayt (109 alternatif)

I=>{x=s=>{var a=new int[10];foreach(var h in s+"")a[h-'0']++;return a;};var i=x(I);var j=x(I*I*I);for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};

Lambda'nın özellikle aşağıdakileri kullanması gerekir ulong:

System.Func<ulong, bool> b; // = I=>{...};
System.Func<ulong, int[]> x; // inner lambda

Bazı baytları kaydetmek için @Corak ve @Dennis_E ve orijinal çözümümle ilgili bir sorun bulmak için @TimmyD sayesinde. @SaxxonPike'a ulong / long / decimal / etc problemini (ki bu da bana biraz bayt kazandırdı) gösterdiği için teşekkür ederiz.


Ayrıca burada Java cevaplarına benzer şekilde HashSets kullanarak 109 baytlık bir çözüm var, ancak puanım için orijinal çözümüme bağlı kalacağım.

using System.Collections.Generic;I=>{return new HashSet<char>(I+"").SetEquals(new HashSet<char>(I*I*I+""));};

p<0Bunun yerine kontrol edebilir misiniz p==1?
Yytsi

@TuukkaX bunu yapardı, ama kümeleri belirleme yöntemim şimdi aynı tamsayı dizisini kullanıyor, her iki dizgeye uygun dizini artırarak, yani 0 veya 2 değeri tamam, ama varsa 1, yanlış döndürmeli.
Yodle

Dizilerin oluşturulmasını ve doldurulmasının ayrı bir lambda haline getirilmesiyle çok az n=>{Func<string,int[]>x=s=>{var a=new int[10];foreach(var c in s)a[int.Parse(c+"")]++;return a;};var i=x(n);var j=x((long)Math.Pow(int.Parse(n),3)+"");for(var k=0;k<10;)if(i[k]>0^j[k++]>0)return 0>1;return 1>0;};
tasarruf edin

Sen yerini alabilir int.Parse(c+"")ilec-'0'
Dennis_E

2103869 test davasında başarısız oldu. Ben de aynı sorunu yaşadım. (Nevermind, bunun nedenini buldum. Bunun longyerine ben kullandım ulongve bu test durumu
MSB'yi

6

Java 8, 154 karakter

a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

Böyle denir:

interface Y {
    boolean n(int x);
}

static Y y = a->java.util.Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new java.math.BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray());

public static void main(String[] args) {
    System.out.println(y.n(0));
    System.out.println(y.n(1));
    System.out.println(y.n(10));
    System.out.println(y.n(107624));
    System.out.println(y.n(251894));
    System.out.println(y.n(251895));
    System.out.println(y.n(102343));
}

Çıktılar:

true
true
true
true
true
false
false

Çok sayıda Java 8-y cevabı, bir lambda ve bazı süslü sayıdan dizeye dönüşümler içeren akışları kullanan bir cevap.

Ne yazık ki , büyük sayılarla yanlış değerler döndüren (başlangıçtan başlayarak ) kesin olmayan çiftler kullanarak Math.pow BigInteger.pow(3)yerine kullanmak zorundayız .Math.pow(a,3)2103869


Bu static Y yşey garip bir başlatma sözdizimidir, y.narabirimin tam olarak bir üyesi olduğundan otomatik olarak atanır mı?
Kedi,

Buna inanıyorum, evet. Dürüst olmak gerekirse, iş yerim hala 7 yaşında olduğundan Java 8'e yeniyim, ama işte böyle çalıştığını düşünüyorum.
Hypino

Derleyici @FunctionalInterface, normal anonim tür örnekleme yerine lambdaların çalışmasını sağlayan ek açıklamaları otomatik olarak ekler (sadece tek bir yöntemle arayüz, javadoc'a bakınız).
1Darco1

Bu esasen eşittir Y y = new Y() { @Override public boolean n(int x) { return Arrays.equals((a+"").chars().distinct().sorted().toArray(),(new BigInteger(a+"").pow(3)+"").chars().distinct().sorted().toArray()); } }ve staticdeğiştirici yalnızca y.n(int)statik ana yöntemden çağrmaya izin vermek için vardır .
1Darco1

1
Boşver, sadece bu konu hakkındaki meta yazıyı oku ve toplumun kabul ettiği anlaşılıyor. Sanırım nedenini anlayabiliyorum. Güncelleyeceğim.
Hypino,

6

BASH, 69, 59 bayt

GÜNCELLEME

Bunu bash yapmak için başka bir güzel yol tr (62 byte, ancak muhtemelen biraz daha sıkılmış olabilir) kullanmaktır

T() { m=`bc<<<$1^3`;[ -z "`tr -d $m <<<$1;tr -d $1 <<<$m`" ];}

EDIT: Bazı daha fazla optimizasyon (Thx! @Manatwork)

golfed

T() { S(){ fold -1|sort -u;};bc<<<$1^3|S|diff - <(S<<<$1);}

Ölçek

TEST() {
 T $1 >/dev/null; echo $?
}

TEST 0
0
TEST 1
0
TEST 11
1
TEST 10
0
TEST 107624
0
TEST 251894
0
TEST 251895
1
TEST 102343
1
TEST 106239
1

0 - başarı için (çıkış kodu) 1 - başarısızlık için (çıkış kodu)


Korkarım temel teori burada tamamen yanlış. Dene T <<< 11. Rakam kümelerinin aynı olduğunu söyleyecektir, çünkü 11 ** 3 == 1331, orijinal numarada iki kez bulunmayan rakamları içerir.
Manatwork

Evet, haklısın, düzeltildi! Teşekkür ederim !
zeplin

Tamam, ama şimdi kodda fazladan boşluk kaldı. -wAçıkça neden eklendiğinden emin değilim fold. Eğer uniqseçenekler olmadan kullanılırsa, sort -udeğiştirebilirsiniz. Ve 2.S çağrısını here-string ile besleyin. Ve bence iletilen formülü alıntılamaya gerek yok bc.
saat

@ manatwork, thx, Ben katsayı argümanını düzelttim, boşlukları kaldırdım ve ikinci farklı argümanı burada-doc kullandı. Şimdi de boru içine ilk argüman fark ve çevresinde gereksiz tırnak kaldırdık bc ifadesinin. > uniq, seçenek olmadan kullanılır; sort -u, yerini alabilir. Bu sadece önceki sürümün kalıntıları ( uniq -u idi )). Teşekkür ederim !
zeplin

1
@zeppelin: cmpyerine diff1 bayt kullanabilir ve kaydedebilirsiniz.
Ipor Sircer

6

x86-64 makine kodu işlevi, 40 bayt.

Veya 0'a karşılık sıfır olmayana strcmp gibi "truthy" olarak izin verilirse 37 bayt.

Karl Napf'ın C'si sayesinde, x86'nın BTS ile çok verimli bir şekilde yapabileceği bitmap fikrine cevap .

İşlev imzası:, _Bool cube_digits_same(uint64_t n);x86-64 System V ABI kullanılarak. ( nRDI'da, boolean dönüş değeri (0 veya 1) AL cinsinden).

_BoolISO C11 ile tanımlanır ve tipik olarak C ++ ile aynı anlambilimiyle #include <stdbool.h>tanımlamak için kullanılır .boolbool

Potansiyel tasarruflar:

  • 3 bayt: Ters koşulu döndürür (fark varsa sıfır olmayan). Veya satır içi asm'den: bayrak koşulu döndürmek (gcc6 ile mümkün)
  • 1 byte: EBX'i engelleyebilseydik (böyle yaparsa bu fonksiyon standart olmayan bir çağrı kuralı olurdu). (satır içi asm bunu yapabilir)
  • 1 bayt: RET komutu (satır içi asm'dan)

Bunların tümü, bir işlev yerine satır içi bir bölüm olsaydı , satır içi asm için 35 bayt yapabilecekse mümkün .

0000000000000000 <cube_digits_same>:
   0:   89 f8           mov    eax,edi
   2:   48 f7 e7        mul    rdi          # can't avoid a REX prefix: 2642245^2 doesn't fit in 32 bits
   5:   48 f7 e7        mul    rdi          # rax = n^3, rdx=0
   8:   44 8d 52 0a     lea    r10d,[rdx+0xa]  # EBX would save a REX prefix, but it's call-preserved in this ABI.
   c:   8d 4a 02        lea    ecx,[rdx+0x2]

000000000000000f <cube_digits_same.repeat>:
   f:   31 f6           xor    esi,esi

0000000000000011 <cube_digits_same.cube_digits>:
  11:   31 d2           xor    edx,edx
  13:   49 f7 f2        div    r10         ; rax = quotient.  rdx=LSB digit
  16:   0f ab d6        bts    esi,edx     ; esi |= 1<<edx
  19:   48 85 c0        test   rax,rax     ; Can't skip the REX: (2^16 * 10)^3 / 10 has all-zero in the low 32.
  1c:   75 f3           jne    11 <cube_digits_same.cube_digits>

                                         ; 1st iter:                 2nd iter:                both:
  1e:   96              xchg   esi,eax   ; eax=n^3 bitmap            eax=n bitmap             esi=0
  1f:   97              xchg   edi,eax   ; edi=n^3 bitmap, eax=n     edi=n bmp, eax=n^3 bmp
  20:   e2 ed           loop   f <cube_digits_same.repeat>

  22:   39 f8           cmp    eax,edi
  24:   0f 94 d0        sete   al
                  ;; The ABI says it's legal to leave garbage in the high bytes of RAX for narrow return values
                  ;; so leaving the high 2 bits of the bitmap in AH is fine.
  27:   c3              ret    
0x28: end of function.

LOOP bir kez tekrar etmenin en küçük yolu gibi görünüyor. Ayrıca sadece döngüyü tekrarlamaya baktım (REX önekleri ve farklı bir bitmap kaydı olmadan), ama bu biraz daha büyük. Ayrıca PUSH RSI'yı kullanmayı ve test spl, 0xf/ jzdöngüsünü bir kez kullanmayı da denedim (ABI, RSP'nin CALL'den önce 16B hizalı olmasını gerektirdiğinden, bir itme onu hizalar, diğeri yeniden hizalar). test r32, imm8Kodlama yok , bu yüzden en küçük yol 4B TEST komutuyla (REX öneki dahil) bir imm8'e karşı RSP'nin sadece düşük baytını test etmekti. LEA + LOOP ile aynı boyutta, ancak ekstra PUSH / POP talimatları gerekli.

Steadybox'ın C uygulamasını (test farklı bir algoritma kullandığı için) vs. Baktığım farklı sonuçlardan iki tanesinde kodum doğruydu ve sabit kutu yanlıştı. Kodumun herkes için doğru olduğunu düşünüyorum.

_Bool cube_digits_same(unsigned long long n);

#include <stdio.h>
#include <stdbool.h>
int main()
{
    for(unsigned n=0 ; n<= 2642245 ; n++) {
        bool c = f(n);
        bool asm_result = cube_digits_same(n);
        if (c!=asm_result)
            printf("%u problem: c=%d asm=%d\n", n, (int)c, (int)asm_result);
    }
}

Yazdırılan tek satırlar c = 1 asm = 0: C algoritması için yanlış pozitifler.

Ayrıca uint64_taynı algoritmanın Karl'ın C uygulamasının bir versiyonuna karşı test edildi ve sonuçlar tüm girdiler için uygun.


Makine kodunda golf kodu ? Bu gerçek ustalık!
chx

@chx: Kod dilinde en iyi duruma getirme, gerçekten assembly dilinde. Onaltılık baytları doğrudan yazmıyorum, sadece her komutun ne kadar olduğunu biliyorum (veya kontrol edin). (Gönderdiğim şey yasm ile bir araya gelip sonra objdump -drwC -Mintelnesne dosyasında çalıştırmak ve yorumları kopyalamaktır). Kod boyutu için optimizasyonun gerçek hayatta gerçekten yararlı olduğu bir dildir. (Ancak o zaman bile, yalnızca bootloaders veya demo'lar gibi nadir durumlarda. Genellikle zaten önbelleğe alınmış durumda performansa zarar vermediğinde, yalnızca kod boyutunu kaydetmeye değer, ancak daha sonra kod çözme darboğazlarını + önbellek özlerini önlemek yararlı olur)
Peter Cordes

@chx: ama evet, asm'da golf oynamak beni bir badass gibi hissettiriyor, fark ettiğiniz için teşekkürler :) Burada ve SO'da diğer cevaplarıma bak :)
Peter Cordes

Ben montajda çok yaşlı bir şapkayım (1987, Z80 ilki) ama bununla golf koduna girmeyi hiç düşünmezdim. İmkansız olduğunu düşünürdüm.
Chx

@chx: Sadece ara sıra golf oynarım, genellikle sadece asm için makul görünen Sıcak Ağ Soruları'nda bir tane gördüğümde. Genellikle rakamlarla, dizelerle değil. Yine de birkaç kişi golf oynuyor. Başka birinin makine kodu golf cevabını görene kadar kendim yapmayı düşünmemiştim. Olabilirdi bu bir Eğer makine kodu yerine asm cevapları için asm kaynak karakterlerin bayt sayabilir gerçeğine beni clued. anatolyg, bu soru da dahil olmak üzere bazı yayınladı.
Peter Cordes

5

Haskell, 47 bayt

n%p=[c|c<-['0'..],elem c$show$n^p]
f n=n%1==n%3

Çok yavaş. İle test et c<-['0'..'9'].

Her karakteri string temsili içerisine dahil etmek için test eder ve içerdiklerinin nbir listesini yapar. Aynı şekilde n^3listeler ve listelerin eşit olup olmadığını kontrol eder.


Haskell set hazırlayıcıları veya benzersiz elemanları bir listeden döndüren bir fonksiyona sahip değil mi?
kedi,

2
@cat No. Haskell'de nub(benzersiz elemanlar bulunur) ve sorther ikisi de uzun ithalat gerektirir import Data.List. Buna rağmen 48 bayt çok yakın gelir: import Data.List;q=sort.nub.show;f n=q n==q(n^3).
xnor

Neden sıralama yapmamız gerekiyor?
kedi,

1
@ cat nub, ilk görünüşte sıralamayı korur nub [3,1,3,2,1,2] == [3,1,2]; Bir set tipine dönüşmez (yok), ancak bir liste verir.
xnor

Oh, Haskell'in ilkel sırasız bir koleksiyon türüne sahip olmadığını
kedi

5

Dyalog APL , 10 bayt

⍕≡⍕∪(⍕*∘3)

⍕≡ bağımsız değişkeninin metin gösterimi aynı

⍕∪ Argümanın metin gösterimi birliği ve

(⍕*∘3) cubed argümanının metin gösterimi?

TryAPL çevrimiçi!

Not: Büyük sayılar için, ⎕PP←34 ⋄ ⎕FR←1287(34 önemli basamak, 128 bit yüzer) ayarlayın


1
N ^ 3'teki benzersiz rakamların ndakinden daha az olamayacağını varsayıyorsunuz.
ngn

Bir karşı örneğin varlığını kanıtlayabilir misiniz?
20’de

1
106239, en tepedeki yorumları görün
ngn


5

Java 7, 185 178 karakter

import java.util.*;
boolean a(int n){return new HashSet(Arrays.asList((n+"").split(""))).equals(new HashSet(Arrays.asList((new java.math.BigInteger(n+"").pow(3)+"").split(""))));}

Çağrı yap:

public static void main(String [] args) {
    System.out.println(0 + " -> " + a(0));
    System.out.println(1 + " -> " + a(1));
    System.out.println(10 + " -> " + a(10));
    System.out.println(107624 + " -> " + a(107624));
    System.out.println(2103869 + " -> " + a(2103869));
    System.out.println(251894 + " -> " + a(251894));
    System.out.println(251895 + " -> " + a(251895));
    System.out.println(102343 + " -> " + a(102343));
    System.out.println(106239 + " -> " + a(106239));
}

Çıktı:

0 -> true
1 -> true
10 -> true
107624 -> true
2103869 -> true
251894 -> true
251895 -> false
102343 -> false
106239 -> false

(İthalatları ve yöntem tanımlarını da saymam gerekip gerekmediğinden asla emin değilim. Her iki şekilde de gördüm.


İthalat / kullanım gerçekten bayt sayımının bir parçası. static Yine de kaldırabilirsiniz .
Kevin Cruijssen

Tamam teşekkürler. Kaldırılan static.
QBrute 16:16

4

Jöle , 8 bayt

*3ṢQ⁼ṢQ$

Çevrimiçi deneyin!

Açıklama:

       $    # As a monadic (single argument) link:
    ⁼       # Return true if the following are equal
     ṢQ     # The unique sorted elements of 'n'
  ṢQ        # and The unique sorted elements
*3          # of 'n^3'

Bu 100 girişi ile çalışmıyor .
Dennis,

Ben öyle değil anlamak, ancak niçin değil bu iş ?
DJMcMayhem

1
Çünkü Jelly kesinlikle operatör önceliği olmadan soldan sağa ayrıştırılır. *3ṢQ⁼ṢQ$amaçlandığı gibi çalışır, çünkü hızlı $atomlar soldaki iki atomu monadik bir zincir halinde toplarlar.
Dennis,

4

Pyth, 10 bayt

Çünkü Pyth cevaplarıyla yeteri kadar çeşitliliğimiz yok, bir tane değil iki tane daha ekleyelim! Her ikisi de 10 bayttır ve 106239örnek girdi olarak test edilmiştir (bazı cevaplar başarısız oldu).

!s.++Q,`**

Açıklama:

!s.++Q,`**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       `         repr(Q^3)
      ,      Q   [repr(Q^3),Q]
    +Q           [Q,repr(Q^3),Q]
  .+             Deltas ([Digits in Q but not in Q^3, digits in Q^3 but not in Q])
!s               Are both empty?

Çevrimiçi bir test takımı kullanarak ilk yanıtı deneyin.

İkinci cevap:

qFmS{`d,**

Açıklama:

qFmS{`d,**QQQQ   Implicit input filling
        **QQQ    Q ^ 3
       ,     Q   [Q^3, Q]
  m              map over each element d of [Q^3, Q]:
     `d           the element's string representation
    {             with duplicates removed
   S              and sorted
qF               Fold over equality (are the two the same?)

Çevrimiçi bir test takımı kullanarak ikinci cevabı deneyin.


4

Kotlin: 46/88/96 bayt

Soru, girişin nereden geldiğini belirtmiyor, işte normal 3 giriş kaynağı.


İşlev: 46 bayt

fun f(i:Long)="$i".toSet()=="${i*i*i}".toSet()

main () ilk program değişkenini kullanarak: 88 bayt

fun main(a:Array<String>){val i=a[0].toLong();println("$i".toSet()=="${i*i*i}".toSet())}


main () standart girdi kullanarak: 96 bayt

fun main(a:Array<String>){val i=readLine()!!.toLong();println("$i".toSet()=="${i*i*i}".toSet())}


1
PPCG'ye Hoşgeldiniz! Girdi / çıktı, kod golf nedeniyle dolaylı olarak belirtildi . Topluluk-konsensüs standartlarını burada görebilirsiniz . İşlev sayınız yeterli olmalı.
AdmBorkBork,

4

Haskell, 54 52 bayt

İki bayt kaydettiğiniz için teşekkürler @Likonik.

(%)=all.flip elem
k n|[a,b]<-show<$>[n,n^3]=b%a&&a%b

1
Bildirmek a%b=all(ELEM a)bbir fonksiyonu olarak ve daha sonra çağıran b%a&&a%biki bayt kaydetmek gerekir.
Laikoni

4

JavaScript (ES6), 44 bayt

g=n=>n<1?0:g(n/10)|1<<n%10
n=>g(n)==g(n*n*n)

@ KarlNapf'ın mükemmel C cevabı limanı. ES7 yoluyla bir bayt kaydeder n**3. JavaScript'in sınırlı sayısal kesinliği nedeniyle yalnızca 208063'e kadar çalışır; sadece 1290'a kadar çalışması için ihtiyacınız varsa, başka bir bayttan tasarruf edebilirsiniz.


4

Perl 6 , 22 bayt

{!(.comb$_³.comb)}

Expanded:

{ # bare block lambda with implicit parameter 「$_」
  !(
    .comb # get a list of the graphemes ( digits )

     # Symmetric Set difference

    $_³.comb # cube and get a list of the graphemes
  )
}

Simetrik Seti fark 「⊖」 operatör boş döner Set her iki taraf eşdeğer Setleri (otomatik Set içine bir liste çıkıyor) ise. Bu noktada yapılacak tek şey mantıksal olarak tersine çevirmek.


Sen yerine $_sadece birlikte.
Jo Kral

4

C ++, 82 bayt

t(int a){int b=a*a*a,c,d;while(a|b)c|=1<<a%10,a/=10,d|=1<<b%10,b/=10;return c==d;}

T (a) işlevi cevabı verir. Küme olarak int kullanır. Güzel yazdırılır:

t(int a)
{
    int b = a*a*a, c, d;
    while(a|b) c|=1 << a%10, a/=10, d|=1 << b%10, b/=10;
    return c==d;
}

Eklemeniz gerekir #include<set>ve using namespace std;golfed kodu ve bayt sayısı
kedi

@cat #include<set>yerinealgorithm
Karl Napf

@KarlNapf oh, tüm stdlib konteynerlerinin algoritma yoluyla erişilebildiğini sanıyordum - C ++ hakkında bildiklerimi gösteriyor :)
kedi

Bana öyle geliyor ki, "c" işlevi yerel değişkeni başlatılmadı, ancak kullanılmış c | = 1 ...
RosLuP

4

R, 65 79 70 bayt

Alır nStdin, gelen böler nve n^3tek haneli içine ve iki set karşılaştırır. gmpBüyük tamsayıları işlemek için paketi kullanır (bu eksikliğe işaret ettiği için Billywob'a teşekkürler). Şimdi kullandığı substringkesmeye nve n^3öneri için @MickyT sayende. (Önceki sürümlerde kullanılan scanve gsubhack bir şekilde.)

s=substring
setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e2,p),s(n^3,p,p))

Ne yazık ki bu bir ntür BigInt paketi kullanmadığınız sürece işe yaramayacak . Bkz ?.Machinebu örneğin karşılaştırmak görmek için vb büyük tamsayı ilgili ayrıntılar için ve yüzer 2600001^3R için Wolfram Alpha
Billywob

Bunu kendim kullanmak zorunda kalmamıştım, ancak gmppaketin bu sorunu çözebileceği anlaşılıyor .
Billywob

Ah, iyi yakalayış! Cevabı güncelledim, şimdi gmp::as.bigz()büyük tamsayılarla başa çıkmak için kullanıyor .
rturnbull

Substring'i, sayıyı bölmek için bir karaktere dönüştürdüğü gerçeğini kullanabilirsiniz, örneğins=substring;setequal(s(n<-gmp::as.bigz(scan()),p<-1:1e4,p),s(n^3,p,p))
MickyT

@MickyT Harika öneri! Bu substringşekilde kullanılabileceğini bilmiyordum (Sadece hiç kullandım substr). Cevap, önerinizi şimdi dahil etmek için düzenlendi.
rturnbull

4

C ++ 14, 93 bayt

int b(auto i){int k=0;while(i)k|=1<<i%10,i/=10;return k;}int f(auto n){return b(n)-b(n*n*n);}

C cevabımın limanı, büyük sayılar için çalışıyor ( Lsonek ile arama ).


3

Haskell, 47 bayt

import Data.Set
s=fromList.show
f n=s n==s(n^3)

Kullanım örneği: f 102343-> False.

Data.SetModülden setleri kullanır . Yardımcı işlev s, sayıyı dize olarak gösterir ve karakterlerden oluşan bir küme yapar.


Burada kullanarak bir bayt kaydedemez misiniz s$n^3?

@ ais523: Hayır, çünkü bunun (s n==s) (n^3)bir tür hata verdiği anlamına gelir.
nimi

3

Brachylog , 11 bayt

doI,?:3^doI

Çevrimiçi deneyin!

Orijinal cevabımla ilgili bir sorunu işaret ettiği için @DrucructibleWatermelon'a teşekkürler.

açıklama

(?)doI,           I is the Input sorted with no duplicates
       ?:3^       Compute Input^3
           doI    Input^3 sorted with no duplicates is I

Bu kedi gülen gibi: 3
QBrute

3

PowerShell v2 +, 94 93 bayt

filter f($n){-join("$n"[0..99]|sort|select -u)}
(f($x=$args[0]))-eq(f("[bigint]$x*$x*$x"|iex))

(Netlik için Newline, bytecount'a dahil değil)

İlk satır, girdi alan ve aşağıdakileri yapan ( buradaki amaçlarımıza spesifikasyonlara girmeyen bir fonksiyona benzer fbir eşittir) olarak tanımlanır :filter$n

filter f($n){-join("$n"[0..99]|sort|select -u)}
       f($n)                                    # Input
                   "$n"                         # Cast as string
                       [0..99]                  # Index as char-array
                              |sort             # Sorted alphabetically
                                   |select -u   # Only select the -Unique elements
             -join(                          )  # Join those back together into a string
                                                 # Implicit return

İkinci satır girdiyi alır, üzerinde işlem $argsyapar fve küp şeklinde gerçekleştirilmesinin -eqnormal olup olmadığını kontrol eder . Açıkça belirtilen alçıya dikkat edin, aksi takdirde sonucu kesinlikle işe yaramayacak olan bilimsel gösterimde geri alırız.f$x[bigint]

Boolean sonucu, boru hattında bırakılır ve çıktı kesindir.

PS C:\Tools\Scripts\golfing> 0,1,10,107624,251894,251895,102343,106239,2103869|%{"$_ --> "+(.\do-n-n3-same-digits.ps1 $_)}
0 --> True
1 --> True
10 --> True
107624 --> True
251894 --> True
251895 --> False
102343 --> False
106239 --> False
2103869 --> True

@ConnorLSW sayesinde bir bayt kaydedildi


Bir bayt kaydetmek "$n"[0..99]yerine kullanabilirsiniz [char[]]"$n", çünkü uğraşmanız gereken en büyük sayı yalnızca 20 karakter uzunluğundadır.
Kasım’da

@ConnorLSW Yine o endeksleme hilesi var. Bunu hatırlamaya ihtiyacım olacak.
AdmBorkBork,

100 karakterden daha az karakter kullanmanız garanti char[]edilmediği sürece, normal dönüşümden yeterince kolay bir tasarruf sağlar , kodunuzun geri kalanı, alabileceğim kadar iyidir, dizileri karşılaştırmanın kısa yolunu varsa ("$n"[0..99]|group).Nameyükleri kurtarmak gibi bir şey kullanın compare, ancak tam olarak golf oynamak kolay ve hızlı değildir.
saat

Cevaplara bakmadan çözdüğüm şey budur ... Hemen hemen aynı cevabı ;-). Ama çok belirgin birkaç optimizasyonu kaçırdın ;-)
Joey

3

Groovy, 35 51 chars / bytes tarafından

Groovy'nin dahil olmadığını göremediğim için üzgündüm, işte orijinal 51 bayt denemem:

def x(def n){"$n".toSet()=="${n.power(3)}".toSet()}

**Manatwork sayesinde, 35 baytlık isimsiz bir kapatma olarak ve üstel olarak yeniden yazılmıştır:

{"$it".toSet()=="${it**3}".toSet()}

Orijinal işlev için bazı test durumları:

println x(0)
println x(1)
println x(10)
println x(107624)
println x(251894)
println x(251895)
println x(102343)

Bir adlandırılmış kapatma cböyle adlandırılabilir: println c.call(107624). Anonim 35 baytlık kapatma şöyle söylenebilir:println ({"$it".toSet()=="${it**3}".toSet()}(107624))

Çıktılar:

true
true
true
true
true
false
false

Lütfen dikkat: Şu anda kod golf gibi bir şeyin var olduğunu öğrendim, umarım bunu hak ettim!


Merhaba Rado ve PPCG'ye Hoşgeldiniz! Bu harika bir ilk cevap, +1!
NoOneIsHere

Bir kapatma kullanarak bunu 47 karakter / bayta daha da sıkmayı başardım, ancak burada yeni olması nedeniyle önceki cevabımı düzenleyemedim, bu yüzden burada:def c={"$it".toSet()=="${it.power(3)}".toSet()}
Rado

1
Anonim işlevler kabul edilebilir. Üstelik **operatörünü üs için kullanın .
Manatwork

@NoOneIsHere teşekkürler! Ayrıca, test durumları için kapatılması, x(107624)c.call(107624)
Rado

@ Manatwork teşekkür ederiz! Anonim bir kapanış kullanmak ve **onu güzel 35 karakter / {"$it".toSet()=="${it**3}".toSet()}
Rado

2

Ruby, 48 bayt

->n{(f=->x{x.to_s.chars.uniq.sort})[n]==f[n**3]}
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.