Predikat Rantai Nomor

27

Masalah:

Tugas Anda adalah memutuskan apakah dalam suatu urutan angka, setiap angka mengandung setidaknya satu digit dari angka yang mendahuluinya.

Misalnya, yang berikut harus mengembalikan yang benar:

[1, 12, 203, 0, 30]
             ^   ^ Contains a 0
        ^ Contains a 2
    ^ Contains a 1

Yang berikut harus mengembalikan falsey:

[1, 32, 23, 34]
    ^ Doesn't contain a 1, therefore false

Kiriman Anda dapat berupa fungsi atau program lengkap.

Memasukkan:

Input dapat berupa jenis urutan yang masuk akal. Array angka, array string, string angka yang dibatasi, dll.

Urutan penting, jadi struktur apa pun yang Anda pilih untuk diterima sebagai input jelas harus memiliki pemesanan yang pasti.

Input dapat diambil melalui stdin atau sebagai argumen.

Anda dapat mengasumsikan:

  • semua angka akan berupa bilangan bulat non-negatif

  • input akan selalu mengandung setidaknya 2 angka

  • angka input tidak akan mulai dengan 0

Keluaran:

Output akan berupa nilai truey atau falsey (seperti yang didefinisikan oleh bahasa Anda), mewakili apakah spesifikasi di atas terpenuhi atau tidak.

Nilai kebenaran / kepalsuan tidak perlu konsisten di antara pengujian.

Ini bisa berupa output ke stdout atau dikembalikan.

Kasus uji:

True cases:
[1, 1, 1, 11, 111, 11, 1]
[12, 23, 34, 45, 56]
[65, 54, 43, 32, 21]
[123, 29, 9, 59, 55, 52, 2017, 2]
[1234567890, 19, 95, 5012, 23]

False cases:
[1, 2, 3, 4, 5, 1, 11] (2 doesn't contain a 1)
[12, 23, 33, 45] (45 doesn't contain a 3)
[98, 87, 76, 11, 12, 23] (11 doesn't contain a 7 or 6)

Ini adalah kode-golf, sehingga jumlah byte terkecil yang menang.

Carcigenicate
sumber

Jawaban:

7

Jelly , 5 4 byte

f2\Ạ

Input adalah larik string.

Cobalah online!

Bagaimana itu bekerja

f2\Ạ  Main link. Argument: A (array of strings)

 2\   Pairwise reduce by:
f       Filter, yielding all chars in the left string that appear in the right one.
   Ạ  All; yield 1 if all strings are non-empty, 0 if not.
Dennis
sumber
13

Python 2 , 48 byte

lambda x:reduce(lambda a,b:set(a)&set(b)and b,x)

Cobalah online!

Cetak satu set kosong untuk Falsedan elemen terakhir untukTrue

tongkat
sumber
12

Retina , 25 20 byte

(.).*¶(?=.*\1)

^.+$

Cobalah online!

Setiap kali kami menemukan angka yang juga terjadi di angka berikutnya, kami menghapus pemisah antara angka-angka itu (bersama dengan angka-angka di angka sebelumnya, mulai dari nomor yang dibagikan, tetapi itu tidak relevan). Input valid, jika semua pemisah telah dihapus dalam proses, yang kami periksa dengan memastikan bahwa string dapat dicocokkan sebagai satu baris.

Martin Ender
sumber
11

Brachylog , 9 byte

{⊇ᵐ=∧?t}ˡ

Cobalah online!

Perhatikan bahwa ini tidak hanya berfungsi dengan daftar bilangan bulat, tetapi juga dengan daftar string atau daftar daftar.

Penjelasan

{      }ˡ       Left fold on the input:
 ⊇ᵐ=              It is possible to find a number which is a subset of both input numbers
    ∧             (and)
     ?t           The output is the second number (to continue the fold)
Fatalisasi
sumber
2
Itu keren. Sepertinya ... deklaratif? Sepertinya Anda hanya memberi tahu spesifikasi bahasa.
Carcigenicate
3
@Carcigenicate Brachylog memang deklaratif, didasarkan pada bahasa pemrograman logika deklaratif Prolog .
Fatalkan
2
Prolog sebenarnya ada dalam daftar panjang (semakin) bahasa saya untuk dipelajari ketika saya mendapatkan waktu luang tanpa batas. Terlalu banyak bahasa keren!
Carcigenicate
8

JavaScript (ES6), 47 44 * 43 byte

Menyimpan satu byte berkat @Neil

x=>x.every(y=>y.match(`[${p}]`,p=y),p=1/19)

Mengambil input sebagai daftar string.

Cuplikan tes

* ( dicoret 44 masih tetap 44 )

Produksi ETH
sumber
Tidak `[${p}]`bekerja
Neil
@Neil Bukan untuk item pertama dari setiap array.
ETHproduk
Ah, saya melihat Anda menemukan solusi. Saya sudah sampai sejauh a=>a.reduce((l,r)=>`${l}`.match(`[${r}]`)&&r)(yang juga berfungsi untuk input numerik).
Neil
Mungkin Anda bisa menghapus p&&jika Anda atur p=1/19?
Neil
@Neil I, uh ... well ... Itu jenius, terima kasih :-)
ETHproduksi
6

05AB1E , 10 byte

ü‚vy`Så1åP

Cobalah online! atau sebagai Test suite

Penjelasan

ü‚          # map pairing over each pair in input
  v         # for each pair
   y`       # push as 2 separate elements on stack
     Så     # check each digit in 2nd number for membership in first
       1å   # check if any 1 exists in the resulting list
         P  # product of stack
Emigna
sumber
€Sü.å- Saya berharap ini bekerja seperti yang saya kira.
Magic Octopus Urn
@carusocomputing: Ya itu akan sangat bagus. Atau hanya ü.åatau €Süå.
Emigna
Mengapa tidak berpasangan bekerja dengan perintah dot lagi?
Magic Octopus Urn
1
@carusocomputing: Ini hanya diterapkan untuk mengambil byte berikutnya sebagai perintah. Tidak memperhitungkan titik.
Emigna
6

CJam , 18 15 14 byte

Disimpan 4 byte berkat Martin Ender

l~Afb_1>.&:,:*

Cobalah online!

Penjelasan

l~              e# Read and eval the input
  Afb           e# Convert each number to a list of digits
     _          e# Duplicate the array
      1>        e# Slice it after the first element
        .&      e# Vectorized set intersection; take the set intersection of corresponding 
                e#  elements of the two arrays
          :,    e# Get the length of each intersection
            :*  e# Take the product of the whole array. 
                e#  Will be 0 if any intersection was empty.
Kucing Bisnis
sumber
6

Haskell, 51 48 35 Bytes

-3 byte terima kasih kepada @NickHansen! Saya benar-benar harus menjadi lebih baik dengan operator monad itu

-4 dan -9 byte masing-masing berkat @Laikoni dan @nimi!

and.(zipWith(any.flip elem)=<<tail)

Versi ini mengambil input sebagai array dari string, menghilangkan kebutuhan akan show, tetapi sejauh yang saya bisa lihat itu berfungsi sebagian besar dengan cara yang sama seperti versi yang lebih lama:

all(\(x,y)->any(`elem`x)y).(zip=<<tail).map show

(Saya cukup yakin saya diizinkan untuk mengirim fungsi anonim seperti ini, tetapi saya akan memperbaikinya jika perlu)

Pertama angkanya dikonversi menjadi string. Kemudian sihir monad zip=<<tailmenciptakan fungsi yang zip daftar dengan dirinya sendiri yang memasangkan setiap entri dengan tetangganya. Kemudian allmemetakan lambda untuk setiap pasangan yang memeriksa apakah satu string berisi karakter dari yang lain dan akhirnya memeriksa bahwa mereka semua keluar True.

Versi lama yang pada dasarnya bekerja dengan cara yang sama:

f a=and$zipWith(\b->any(`elem`show b).show)a$tail a
pengguna1472751
sumber
Saya dapat mencukur byte dengan menggunakan zip dan beberapa (->) tipuan monad: f (x, y) = any ('elem'x) y; g = all f. (Zip = << tail) .map show . sunting: elem seharusnya [semoga jelas] berada di backticks tapi itu tidak mungkin dengan formatter komentar.
Nick Hansen
44 byte:and.(zipWith(any.flip elem)=<<tail).map show
Laikoni
Ini diizinkan untuk mengambil input sebagai daftar string, misalnya ["1234567890", "19", "95", "5012", "23"], sehingga Anda dapat menjatuhkannya .map show.
nimi
5

Mathematica 62 47 35 byte

Dengan 12 byte disimpan berkat MartinE.

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&[{{1},{1,2},{2,0,3},{0},{3,1}}]

Salah

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&[{{1},{1,2},{2,0,3},{0},{3,0}}]

Benar

DavidC
sumber
4

Ruby, 49 48 byte

->x{x.each_cons(2){|z|x&&=z*' '=~/(.).* .*\1/};x}

Output niluntuk false dan integer "acak" untuk true.

GB
sumber
4

Java 8, 94 90 87 byte

Input adalah array string yang mewakili angka. Dimulai dengan string kedua, ia melakukan perbandingan ekspresi reguler terhadap setiap string sebelumnya untuk melihat apakah mengandung karakter nya: .*[previous string].*.

Golf:

a->{int r=1,i=0;while(++i<a.length)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}

Tidak Disatukan:

public class NumberChainingPredicate {

  public static void main(String[] args) {
    System.out.println("Expect true:");
    for (String[] input : new String[][] { { "1", "1", "1", "11", "111", "11", "1" }, { "12", "23", "34", "45", "56" },
        { "65", "54", "43", "32", "21" }, { "123", "29", "9", "59", "55", "52", "2017", "2" },
        { "1234567890", "19", "95", "5012", "23" } }) {
      System.out.println(java.util.Arrays.toString(input) + " = " + exec(f(), input));
    }

    System.out.println();
    System.out.println("Expect false:");
    for (String[] input : new String[][] { { "1", "2", "3", "4", "5", "1", "11" }, { "12", "23", "33", "45" },
        { "98", "87", "76", "11", "12", "23" } }) {
      System.out.println(java.util.Arrays.toString(input) + " = " + exec(f(), input));
    }
  }

  private static java.util.function.Function<String[], Boolean> f() {
    return a -> {
      int r = 1, i = 0;
      while (++i < a.length) {
        r *= a[i].matches(".*[" + a[i - 1] + "].*") ? 1 : 0;
      }
      return r > 0;
    };
  }

  private static boolean exec(java.util.function.Function<String[], Boolean> function, String[] input) {
    return function.apply(input);
  }

}

sumber
Bagus! Jauh lebih pendek daripada yang akan saya posting .. Ngomong-ngomong, Anda bisa bermain golf lebih banyak: a->{for(int i=1;i<a.length;)if(!a[i].matches(".*["+a[i++-1]+"].*"))return 0>1;return 1>0;}( 90 bytes )
Kevin Cruijssen
Saya juga bermain golf ke 90, tetapi dengan cara yang berbeda:a->{int r=1;for(int i=0;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
Bisnis Cat
1
Nevermind, dapatkan ke 87:a->{int r=1,i=0;for(;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
Bisnis Cat
Terima kasih untuk kalian berdua. Saya pikir satu-satunya cara untuk meningkatkan ini dengan jumlah yang berarti sekarang adalah dengan melihat regex.
4

Jelly , 6 byte

Dµf"ḊẠ

Cobalah online!

Penjelasan

Dµf"ḊẠ
Dµ        Treat the first (i.e. only) input as a list of decimal digits
   "      For each pair of corresponding elements in {the input digits} and
    Ḋ     {the input digits} with the first element removed
  f       take all elements common to both sides
     Ạ    then return true if the result has no empty lists, false otherwise

Ini paling jelas untuk digunakan di 2/sini, tetapi menjalankan fungsi unary pada semua irisan ukuran 2. "Ḋsecara efektif menjalankan fungsi biner pada semua pasangan elemen yang berdekatan, yang berarti kita dapat menggunakan fsecara langsung (daripada perlu mengubahnya menjadi unary berfungsi sebagai f/). Ini pada akhirnya meninggalkan elemen terakhir dari input, tetapi untungnya bahkan input 0 tidak menjadi daftar kosong ketika dikonversi menjadi desimal, sehingga tidak berpengaruh pada .


sumber
3

Jelly , 8 byte

Dœ&L¥2\Ạ

Cobalah online!

Bagaimana?

Dœ&L¥2\Ạ - Main link: the list of integers            e.g. [3, 13, 351, 73, 82]
D        - convert all the integers to decimal lists       [[3],[1,3],[3,5,1],[7,3],[8,2]]
     2\  - 2-slice cumulative reduce with:
    ¥    -     last two links as a dyad:
 œ&      -         multiset intersection                   [[3],[1,3],[3],[]]
         -         length                                  [1,2,1,0]
       Ạ - all truthy?                                     0
Jonathan Allan
sumber
3

05AB1E , 5 byte

Kode:

üÃõå_

Menggunakan pengkodean CP-1252 . Cobalah online! atau Verifikasi semua kasus uji! .

Penjelasan:

üà         # Intersection on each pair
  õå       # Check if the empty string exists
    _      # Boolean negate
Adnan
sumber
Ya ampun itu berhasil! RüÃõå_adalah apa yang saya hasilkan sendiri. Saya merasa terhormat telah begitu dekat dengan jawaban terbaik Anda, menghapus milik saya. Mengapa Anda tidak membutuhkannya R?
Magic Octopus Urn
1
@carusocomputing Hmmm, untuk apa Ritu? : p
Adnan
2

PowerShell , 87 byte

param($n)(1..($a=$n.length-1)|?{[char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}}).count-eq$a

Cobalah online!

Bukan yang terpendek dengan ukuran apa pun, tetapi pendekatan yang sedikit berbeda dari yang lain gunakan, dan memamerkan |?{}fungsionalitas bagus .

Ini mengambil input sebagai larik string ke dalam $n, kemudian loop dari 1hingga length-1. Kami menggunakan Where-Object(itu |?{...}) untuk mengeluarkan indeks yang benar untuk kondisi tertentu. Anda dapat menganggap ini seperti forlingkaran kombinasi dengan ifklausa.

Klausa di sini adalah [char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}. Yaitu, kami mengambil indeks saat ini $_, mengaturnya menjadi $i, dan mengurangi 1, dan menggunakannya untuk mengindeks $n(yaitu, jadi kami mendapatkan elemen sebelumnya dalam array input kami). Itu kemudian dilemparkan sebagai char-array dan dikirim melalui Where-Objectprosedur lain .

Klausa bagian dalam $n[$i]-like"*$_*"menentukan bahwa string pada indeks saat ini $iadalah -likekarakter saat ini $_dari indeks sebelumnya. Oleh karena itu, ini akan menampilkan setiap karakter yang sama antara dua elemen array. Jadi, klausa luar hanya akan benar jika ada karakter yang sama (karena array kosong adalah falsey di PowerShell), dan indeks hanya akan dipilih jika ada karakter yang sama.

Kemudian, kami mengumpulkan semua indeks yang cocok dengan kriteria, dan memverifikasi bahwa .countitu -eqsesuai dengan panjang larik input. Hasil Boolean itu ditinggalkan di jalur pipa, dan hasilnya tersirat.

AdmBorkBork
sumber
2

APL (Dyalog APL) , 9 byte

∧/×≢¨2∩/⎕

Cobalah online!

∧/ semua yang ada di daftar

× tanda-tanda

 dari penghitungan

¨ setiap

2∩/ persimpangan berpasangan dari

 input?

Adám
sumber
Saya tidak yakin apa artinya "tanda-tanda", tetapi Anda dapat menganggap semua angka akan positif.
Carcigenicate
@Carcigenicate mereka bisa nol juga.
Adám
Ya maaf. "Tidak negatif".
Carcigenicate
2

PHP, 65 68

for(;null!==$a=$argv[++$i+1];)$r+=$a==strtr($a,$argv[$i],_);echo!$r;

ulangi semua angka dan hapus semua angka yang muncul di sebelumnya. Hitung seberapa sering sama dengan angka itu sendiri (tidak ada digit yang dihapus). Jika setidaknya satu sama dengan kami, kami tidak memiliki kecocokan di salah satu pasangan.


Memperbaiki kesalahan menggunakan triminsted of strtr. Terima kasih kepada @ JörgHülsermann

Christoph
sumber
Maaf besar. untuk testcases yang diberikan solusi Anda bekerja. ["filename",1,11,414]tidak bekerja.
Jörg Hülsermann
@ JörgHülsermann tentu trimhanya berfungsi untuk karakter terkemuka dan tertinggal. Memperbaikinya.
Christoph
Untuk PHP <7.1, Anda bisa menggunakan a&alih-alih null!==(-5 byte).
Titus
... tetapi ini hanya akan berfungsi untuk digit pertama $argv[$i], karena "Jika dari dan memiliki panjang yang berbeda, karakter tambahan di yang lebih panjang dari keduanya diabaikan." (dari manual)
Titus
2

PHP, 75 byte

for($b=3**39;--$argc;)preg_replace("#[$b]#","",$b=$argv[$argc])<$b?:die(1);

mengambil angka dari argumen baris perintah; keluar dengan 1untuk kepalsuan, dengan 0untuk kebenaran.
Jalankan dengan -ratau coba online .

  • mulai dengan $b= angka yang mengandung semua digit
  • loop ke bawah melalui argumen
    • hapus semua digit dari $bargumen
    • salin argumen ke $b
    • jika tidak ada digit yang dihapus, keluar dengan 1
  • implisit: keluar dengan 0
Titus
sumber
1

PHP, 77 Bytes

for($i=$t=1;++$i<$argc;)$t*=preg_match("#[{$argv[$i-1]}]#",$argv[$i]);echo$t;
Jörg Hülsermann
sumber
1
Alternatif foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v)):1;echo$t;:, 77 byte (belum diuji).
Ismael Miguel
1
@IsmaelMiguel Alternatif berat Pertama, Anda harus mengubah $k--ke --$kdan melepaskan satu) setelah itu pendekatan Anda harus bekerja dan Anda harus menambahkan @ untuk peringatan
Jörg Hülsermann
Oh, ya, tidak melihat tanda kurung yang tidak berguna yang menyebabkan kesalahan sintaksis. Dan saya tidak setuju tentang $k--. Saya secara khusus menggunakannya sehingga $ k masih 0 pada jalankan pertama. Dan peringatan itu tidak bisa diabaikan. Itu berarti kode sekarang adalah 76 byte, tetapi masih belum teruji.
Ismael Miguel
Setelah pengeditan, saya dapat mengonfirmasi bahwa foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v):1;echo$t;itu berfungsi sebagaimana mestinya. Pengujian dengan $argv = array(1, 12, 123, 3, 34, 45, 5, 5);display 1dan pengujian dengan $argv = array(1, 12, 123, 3, 34, 45, 5, 6);display 0, seperti yang diharapkan.
Ismael Miguel
@ IsmaelMiguel Anda lupa bahwa parameter pertama dalam adalah nama file.
Jörg Hülsermann
1

MATL , 14 byte

1&)"V@VX&nv@]x

Cobalah online!

Terima kasih @LuisMendo karena menyimpan byte. Penjelasan:

1&)            % 'Pop' the first item from the input and push it on the stack.
   "       ]   % Main 'for' loop, to loop over the rest of the input.
    V            % Stringify previous (or first) iten from the input.
     @V          % Push current number, convert to string
       X&        % Intersect with stringified number already on the stack.
         nv      % Count the size of the intersection, and add it to the existing list of sizes.
           @     % Push the current number again for the intersection in the next loop. 
             x % Remove the number pushed by the last loop.
               % Else the program would end with the result on the second instead of the first position in the stack
Sanchises
sumber
Anda dapat menyimpan byte yang diganti 1)VGoleh 1&)(dan ini menghindari pengulangan angka pertama)
Luis Mendo
@LuisMendo Tentu saja! Samar-samar saya ingat bahwa MATL memiliki fungsi ini, tetapi mencari "pop" (seperti dalam antrian atau tumpukan) dalam spesifikasi tidak menghasilkan hasil apa pun, jadi saya pikir saya salah.
Sanchises
Ya, sebenarnya ini adalah kasus pengindeksan referensi tertentu. Dengan dua output, operasi pengindeksan referensi seperti )memberikan nilai yang dipilih sebagai output pertama, dan kemudian nilai yang tersisa sebagai output kedua
Luis Mendo
@LuisMendo Pintar Mereka harus mempekerjakan kalian MATL untuk meningkatkan MATLAB ...
Sanchises
Ha ha. Saya terkadang melewatkan beberapa fitur ini di MATLAB
Luis Mendo
1

Clojure, 71 byte

(fn[n](every?(fn[[q w]](some q w))(partition 2 1(map #(set(str %))n))))

Fungsi anonim yang menerima urutan angka. Pengembalian true/ false.

Saya suka membaca. Pasti ada beberapa area yang dapat diperbaiki di sini. Fungsi saya diteruskan ke maptidak dapat dengan mudah diubah sehingga tidak memerlukan fungsi makro, yang berarti seluruh fungsi tidak dapat menggunakan makro, yang kemungkinan menambahkan beberapa byte. Akan lebih baik jika saya bisa mencari cara yang lebih baik untuk membongkar nilai-nilai dalam every?predikat.

(defn number-chain? [nums]
  (let [; Turn each number into a set of characters
        set-nums (map #(set (str %)) nums)

        ; Partition the sets into lists of neighbors
        ; [1 2 3 4] -> [[1 2] [2 3] [3 4]]
        partitioned (partition 2 1 set-nums)]

    ; Does every second neighbor contain some element of the first?
    (every?
      (fn [[l1 l2]]
        (some l1 l2))
      partitioned)))
Carcigenicate
sumber
1

SimpleTemplate, 124 byte

Wow, ini latihan!

{@eachargv asA keyK}{@ifK}{@setR"/[",O,"]/"}{@calljoin intoR"",R}{@ifA is notmatchesR}{@return}{@/}{@/}{@setO A}{@/}{@echo1}

Ini "sederhana" membuat regex menggunakan elemen lama, ditampilkan 1sebagai nilai yang sebenarnya, atau tidak sama sekali.


Tidak Disatukan:

{@each argv as number key K}
    {@if K}
        {@set regex "/[", old, "]/"}
        {@call join into regex "", regex}
        {@if number is not matches regex}
            {@return false}
        {@/}
    {@/}
    {@set old number}
{@/}
{@echo 1}
Ismael Miguel
sumber
1

JavaScript (ES6), 37 byte

s=>/^(.*(.).*\n(?=.*\2))+.+$/.test(s)

Menerima input sebagai serangkaian angka yang dipisahkan oleh baris baru. Berdasarkan @ MartinEnder ♦ jawaban Retina yang luar biasa, tetapi melakukan seluruh tes dalam satu regexp karena lebih pendek dalam JavaScript seperti itu.

Neil
sumber
1

Pip , 12 10 byte

$&B@X^_MPg

Mengambil input sebagai serangkaian argumen baris perintah. Keluaran adalah daftar kosong untuk kebenaran dan daftar kosong untuk falsey. Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan

         g  List of all cmdline args
       MP   Map this function to consecutive pairs of items from that list:
     ^_      Split 1st item of pair into list of characters
    X        Convert to regex that matches any of those characters
  B@         Find all matches in 2nd item of pair
$&          Fold on logical AND--truthy if all items are truthy, falsey if one is falsey
            Print (implicit)
DLosc
sumber
1

Röda , 45 35 byte

{[_=~`(\S*(\S)\S* (?=\S*\2))+\S+`]}

Cobalah online!

Ini mirip dengan solusi Perl 5, yang merupakan port dari solusi Retina oleh Martin Ender. -10 byte terima kasih kepada @Neil.

Berikut solusi yang berbeda ( 73 72 byte):

{[_/""]|{|x|{x|[0]()unless[not(_ in y)]else[1]}if tryPeek y}_|sum|[_=0]}

Ini adalah fungsi anonim yang menarik string dari aliran dan memeriksa bahwa string berturut-turut berisi karakter yang sama. Penjelasan:

{
    [_/""]|    /* split strings -> creates arrays of characters */
    {|x|       /* begin for loop over character arrays */
        {      /* begin if tryPeek(y) -> peeks the second item from the stream */
               /* x and y are now two consecutive character arrays */
            x| /* push characters in x to the stream */
            [0]()unless[not(_ in y)]else[1] /* pushes 0 to the stream */
                                            /* if y contains the character */
                                            /* in the stream, otherwise 1 */
        }if tryPeek y
    }_|        /* end for loop */
    sum|       /* sum all numbers in the stream */
    [_=0]      /* return true if the sum is zero */
}

Mungkin bisa bermain golf lebih ...

fergusq
sumber
Apakah akan membantu untuk memiliki regexp tunggal yang melakukan seluruh tes sekaligus? Sesuatu seperti ^(\S*(\S)\S* (?=\S*\2))+\S+$.
Neil
@ Neil Itu sepertinya berhasil. Terima kasih!
fergusq
1

Utilitas Bash + Unix, 71 69 byte

sed "s/\(.*\)/<<<\1 \&\&grepx[\1]/;1s/.*g/g/;\$s/ .*//"|tr 'x
' \ |sh

Cobalah online!

Input ada di stdin, satu nomor per baris.

Output dalam kode keluar: 0 untuk truey, 1 untuk falsey.

Ini mungkin bisa lebih banyak golf.

Agar kode di atas berfungsi, tidak ada file apa pun di direktori saat ini yang namanya satu digit. Jika ini tidak dapat diterima, ganti [\1]dengan program dengan'[\1]' (dengan biaya 2 byte tambahan).

Contoh dijalankan (test case terakhir yang disediakan dalam tantangan):

$ echo '98
> 87
> 76
> 11
> 12
> 23' | ./digittest > /dev/null; echo $?
1

(1 di sini adalah falsey.)


Bagaimana itu bekerja:

Saya akan menunjukkan pada contoh yang dijalankan di atas.

Perintah sed mengubah input menjadi:

grepx[98]
<<<87 &&grepx[87]
<<<76 &&grepx[76]
<<<11 &&grepx[11]
<<<12 &&grepx[12]
<<<23

Perintah tr kemudian mengubahnya menjadi string:

grep [98] <<<87 &&grep [87] <<<76 &&grep [76] <<<11 &&grep [11] <<<12 &&grep [12] <<<23

String ini adalah perintah shell untuk melakukan operasi yang diinginkan, jadi saya menyalurkannya ke sh dan saya selesai.

Mitchell Spector
sumber
Pembatasan file baik-baik saja, meskipun itu tentu saja merupakan batasan aneh.
Carcigenicate
1

Q, 57 byte

{r::();({r,::any(last x)in y;x,enlist y}\)($)0,x;all 1_r}
  1. Menginisialisasi global r.
  2. Mengonversi input ke array string.
  3. Memindai array memeriksa bahwa beberapa karakter dalam string terakhir ada di string saat ini.
  4. Tambahkan setiap hasil ke r.
  5. Mengembalikan 1 jika semua string memenuhi langkah 3 yang lain mengembalikan 0.

Catatan: 0 ditambahkan untuk memulai array input dalam fungsi. Ini dilakukan agar perbandingan elemen pertama bisa dilakukan tamtama. Jika tidak, karakter terakhir dari elemen pertama akan diambil untuk perbandingan. Namun dapat melakukan pengecekan tipe yang menambahkan 7 byte dari jumlah saat ini.

Daniel Plainview
sumber
Ini terlihat seperti pendekatan yang mirip dengan jawaban Clojure saya. Bahasa yang tampak rapi.
Carcigenicate