Erweiterung des Spiels der Siebener

8

Einführung

Geben Sie alle Zahlen in einer bestimmten Basis aus, die in einer angepassten Version des Siebenerspiels erscheinen würden.

Herausforderung

Ihre Aufgabe ist es, alle Zahlen in einer bestimmten Basis in einem bestimmten Bereich auszugeben und diejenigen zu überspringen, die bestimmten Bedingungen entsprechen.

Sie erhalten vier Eingänge: base elim startund end. Die Rollen der vier Variablen sind wie folgt:

  • baseGibt an, welche Basis wir für die anderen drei Variablen und auch für die Ausgabe verwenden. Eine Möglichkeit, dies auszudrücken, besteht darin, ein einzelnes Zeichen zu verwenden, das '8', '9' oder ein Großbuchstabe von 'A' bis 'Z' ist, wobei 'A' für das Dezimalsystem und 'G' für das Hexadezimalsystem verwendet werden. Die Basen, die voraussichtlich unterstützt werden, sind 8 bis 35 (einschließlich). Dies ist nur meine vorgeschlagene Art, das auszudrücken, baseund ich werde es im Abschnitt Beispiel für Eingabe und Ausgabe verwenden , aber es ist auch in Ordnung, Ihre eigene Art zu verwenden, um es auszudrücken. Beispielsweise können Sie das Format baseals übliche Dezimaldarstellung wählen .

  • startund endsind zwei Zeichenfolgen, die den Bereich der auszugebenden Zahlen angeben, ausgedrückt in der angegebenen base. Wenn baseist Gund startist 10und endist 1F, müssen Sie ausgeben 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F, aber Sie müssen auch einige davon entfernen, basierend auf dem, was elimist, was bald erklärt wird.

  • elimist ein einzelnes Zeichen und muss eine gültige Ziffer in der angegebenen sein base. Alle Zahlen, die die Ziffer enthalten elimoder Vielfache von sind, elimsollten aus der Liste entfernt werden, um die endgültige Ausgabe zu generieren.

Im obigen Fall, wenn elimist 7, dann 17müssen beseitigt werden , da sie die Ziffer enthält 7. 15und 1Cmüssen auch beseitigt werden, weil sie ein Vielfaches von sind 7. Die endgültige Ausgabe wäre also10 11 12 13 14 16 18 19 1A 1B 1D 1E 1F

Testfälle

Input -> Output

G,7,10,1F -> 10 11 12 13 14 16 18 19 1A 1B 1D 1E 1F
A,3,1,100 -> 1 2 4 5 7 8 10 11 14 16 17 19 20 22 25 26 28 29 40 41 44 46 47 49 50 52 55 56 58 59 61 62 64 65 67 68 70 71 74 76 77 79 80 82 85 86 88 89 91 92 94 95 97 98 100
G,A,96,C0 -> 97 98 99 9B 9C 9D 9E 9F B0 B1 B2 B3 B5 B6 B7 B8 B9 BB BC BD BF C0

Der dritte Testfall wird nach dem ursprünglichen Beitrag hinzugefügt. Alle Antworten, die vor der Bearbeitung veröffentlicht wurden, wurden getestet und haben den dritten Test bestanden.

Technische Daten

  • Die Eingabe ist immer gültig, machen Sie sich also keine Sorgen um die Ausnahmebehandlung.

  • Dies ist , die niedrigste Anzahl von Bytes gewinnt.

  • Sie können Eingaben vornehmen und Ausgaben über jedes Standardformular bereitstellen , und Sie können das Format frei wählen.

  • Wie üblich gelten hier Standardlücken .

  • Dies basiert auf der (realen) Version des Siebener-Spiels .

  • Ich basemuss mindestens 8 sein, nur aufgrund des persönlichen Geschmacks. Ich möchte nur nicht, dass die Anzahl der Ziffern in der Sequenz zu schnell wächst.

Anzeigetafel

Ausschnitt aus dieser Frage . Führen Sie das Snippet aus, um die Anzeigetafel zu erhalten.

Weijun Zhou
quelle
11
Willkommen bei PPCG! Dies ist ein schöner erster Beitrag, aber ich habe einige Empfehlungen: Vermeiden Sie sehr strenge Input / Output - Formate ( base,elim,start,end, ‚A‘ für Dezimalsystem , ‚G‘ für hexadezimale System ), versuchen Sie Ihre Testfälle in einer Art und Weise zu formatieren, ist leicht zu Verwenden und verwenden Sie die Sandbox , um Feedback zu erhalten, bevor Sie sie auf der Hauptseite veröffentlichen. Insgesamt ist dies eine gute erste Herausforderung!
Herr Xcoder
1
@WeijunZhou Klar, ich werde später versuchen, es mir anzusehen. Sie können uns auch gerne im Chat erreichen, wenn Sie beim Bearbeiten auf Schwierigkeiten stoßen und / oder Tipps wünschen.
Herr Xcoder
1
@ Mr.Xcoder Ich habe die Bearbeitung abgeschlossen. Sie können die Frage auch direkt bearbeiten, um sie zu verbessern, und ich werde versuchen, aus Ihrer Bearbeitung zu lernen.
Weijun Zhou
1
@WeijunZhou Ich würde vorschlagen , auch die Eingabeformate machen für start, endund elimmilder.
Erik der Outgolfer
5
Für die "G,7,10,1F"Eingabe würde ein vollständig flexibler Ansatz beispielsweise [16,7,16,31]als Eingabe und [[1,0],[1,1],[1,2],[1,3],[1,4],[1,6],[1,8],[1,9],[1,10],[1,11],[1,13],[1,14],[1,15]]als Ausgabe ermöglichen. (Beachten Sie, dass bei der ersten Antwort davon ausgegangen wurde, dass ein Teil davon bereits zulässig war, da dies ziemlich normal ist - aber es liegt ganz bei Ihnen).
Jonathan Allan

Antworten:

10

Emojicode , 141 116 Bytes

danke an @NieDzejkob für 25 Bytes!

🍇a🚂b🚂c🚂d🚂🔂i⏩c➕1d🍇🍊🎊❎😛0🚮i b☁️🔍🔡i a🔡b a🍇😀🔡i a🍉🍉🍉

Probieren Sie es online aus!

🍇				
  a🚂 b🚂 c🚂 d🚂		👴 4 arguments of type 🚂 (integer)
  🔂 i  ⏩ c  ➕ 1 d 🍇		👴 for i in range(c, d+1)
    🍊 🎊 			👴   if cond_a and cond_b
      ❎ 😛 0  🚮 i b		👴     cond_a: i%b != 0
      ☁️ 🔍 🔡 i a  🔡 b a	👴     cond_b: i in base-a doesnt have b in base-a
    🍇				👴   then
      😀 🔡 i a			👴     print i in base-a
    🍉
  🍉
🍉

betseg
quelle
3
-1 für Sprachwahl ಠ_ಠ
Rod
3
Sie können einfach einen Verschluss posten, der dem Emojicode-Äquivalent eines Lambda entspricht. Dies sollte Ihnen einige Bytes sparen.
NieDzejkob
5

Gelee ,  12  11 Bytes

-1 danke an Erik den Outgolfer (Verwendung von "Ordnung" anstelle von teilbar mit getauschten Argumenten, ḍ@)

r/ọÐḟ⁵bċÐḟ⁵

Ein vollständiges Programm, das drei Eingaben als Befehlszeilenargumente verwendet, die alle eine Dezimalschreibweise verwenden - eine Liste [start, end]und zwei Zahlen - baseund elimdie Jelly-Darstellung einer Liste von Listen druckt, wobei jede die Ziffern einer Zahl in baseund jeder Ziffer darstellt ist eine Dezimalzahl (zB 1043 in Basis 20 wäre [2,12,3]dh 2 × 20 2 + 12 × 20 1 + 3 × 20 0 ).

Probieren Sie es online aus!

Ein kleiner Hinweis: Dies funktioniert nicht für Bereiche mit negativen Werten, aber die verknüpfte Herausforderung beginnt bei 1 und zählt hoch.

Wie?

r/ọÐḟ⁵bċÐḟ⁵ - Main link: list, [start, end]; number, base
 /          - reduce [start, end] with:
r           - inclusive range => [start, start+1, ..., end]
   Ðḟ       - filter discard if:
     ⁵      -   program's 5th argument (the 3rd input), elim
  ọ         -   order (how many times the element is divisible by elim, or 0 if not)
      b     - convert to base "base"
        Ðḟ  - filter discard if:
          ⁵ -   program's 5th argument (the 3rd input), elim
       ċ    -   count (0 if elim is not a digit)
Jonathan Allan
quelle
ḍ@kann sein ;) (übrigens hätte ich gepostet rọÐḟ⁶b⁵ċÐḟ⁶...)
Erik der Outgolfer
Ah ja, ich habe nie das sechste Argument benutzt!
Jonathan Allan
1
Würde es Ihnen wie üblich etwas ausmachen, es zu erweitern und zu erläutern, wie es funktioniert?
Weijun Zhou
Eine Alternative für ọÐḟkönnte sein%Ðf
Mr. Xcoder
2

Julia 0,6 , 69 Bytes

f(b,e,r,g=filter)=g(z->!contains(z,base(b,e)),base.(b,g(x->x%e>0,r)))

Eingaben sind base, elim, start:endwo start:endist a UnitRange. als Basis 10 ganze Zahlen. Gibt eine Liste von Zeichenfolgen der Zahlen in der angegebenen Basis aus. Filter für die Teilbarkeit in ganzzahliger Form, werden base.zur elementweisen Konvertierung in Zeichenfolgen verwendet und filtern dann nach Zifferneinschluss. Genanntes Beispiel:f(10,3,1:100)

Probieren Sie es online aus!

gggg
quelle
1
Ich hatte nicht daran gedacht, Standardeinstellungen in einer Signatur für Alias-Subroutinen zu verwenden. Das muss ich mir für zukünftige Perl 6-Posts merken.
Brad Gilbert b2gills
1

Python 2 , 102 94 Bytes

lambda b,e,l,u:[i for i in range(l,u+1)if i%e*x(i,b,e)]
x=lambda n,b,e:n<1or(e-n%b)*x(n/b,b,e)

Probieren Sie es online aus!

Ein- und Ausgabe erfolgt in Basis 10.

ovs
quelle
1

Perl 6 ,  94  57 Bytes

->\a,$b,\c,\d {grep {!/$b/},grep({$_%$b.parse-base(a)},[...] (c,d)».parse-base(a))».base(a)}

Teste es (94)

Da sich die Regeln geändert haben:

->\b,$e,\r{grep {!/"$e.base(b)"/},grep(*%$e,r)».base(b)}

Test it (Int, Int, Range) Die
Ausgabe ist eine Liste von Zeichenfolgen in der Basis

Erweitert

->
  \b,  # base  (Int)
  $e,  # elim  (Int)
  \r   # range (Int Range)
{
  grep
    {!/"$e.base(b)"/},  # remove the values that contain the character

    grep(
      * % $e,           # remove values that are divisible by elim
      r                 # the input Range

    )».base(b)          # convert each into base 「b」
}
Brad Gilbert b2gills
quelle
Vielen Dank für Ihr Interesse und Ihre Bemühungen, auch für das Schreiben eines Tests. Viel gelernt.
Weijun Zhou
1

JavaScript, 82 Bytes

Ein Quickie bevor ich den Säufer drücke! Nimmt die Eingabe in Basis 10 in der Reihenfolge base, elim, startund endund gibt einen Raum begrenzt Zeichenkette der Basis 10 Zahlen mit einem einzigen Leerzeichen.

(b,l,s,e)=>(g=o=>++s>e?o:g(s%l&&!~s[t=`toString`](b).search(l[t](b))?o+s+` `:o))``

Probieren Sie es online aus

Zottelig
quelle
Dieser hat das Problem als der Japt. Würde es Ihnen etwas ausmachen, es ein wenig zu modifizieren?
Weijun Zhou
@WeijunZhou: Aktualisiert.
Shaggy
Vielen Dank. Sie können den "Erklärungsteil" der anderen Antwort jederzeit aktualisieren. Keine Eile.
Weijun Zhou
@WeijunZhou: Ich nehme an, Sie meinen eher meine Japt-Lösung als diese? Ich werde aktualisieren, wenn ich morgen wieder auf meinem Computer bin.
Shaggy
Ja, mein schlechtes. Ich habe den Kommentar sofort bearbeitet, aber Sie haben immer noch das Original gesehen ... Entschuldigung.
Weijun Zhou
1

Japt , 16 Bytes

Hastig umgeschrieben, nachdem die Spezifikation geändert wurde, um eine dezimale Eingabe zu ermöglichen, kann dies wahrscheinlich verbessert werden.

Nimmt die Eingabe in der Reihenfolge start, end, base, elimund gibt eine Reihe von Zahlen in der gegebenen Basis.

òV kvX msW køXsW

Versuch es


Erläuterung

                   :Implicit input of integers U=start, V=end, W=base & X=elim
òV                 :[U,V]
   k               :Remove
    vX             :  elements divisible by X
       m           :Map
        sW         :  Convert to base-W string
           kø      :Remove elements containing
             XsW   :  X converted to a base-W string
                   :Implicit output of resulting array
Zottelig
quelle
Bei elim-Werten, die größer als 10 und dennoch kleiner als die Basis sind, werden Elemente, die die Ziffer enthalten, nicht entfernt. Zum Beispiel für 0,35,12,11 enthält die Ausgabe fälschlicherweise 23 = (1,11) base12
gggg
@gggg, es sieht so aus, als ob die Spezifikation geändert wurde, seit ich dies gepostet habe. ursprünglich elimwurde angegeben, dass es sich um eine einzelne Ziffer (dh 0-9) und nicht um ein einzelnes Zeichen in der Eingabebasis handelt.
Shaggy
Fair genug, ich fand die Spezifikation super verwirrend.
gggg
Mit "einstellig" meine ich eine Ziffer in der entsprechenden Basis. Daher ist "A" (oder wenn Sie es lieber als 10 ausdrücken möchten) eine Ziffer in einer hexadezimalen Basis. Entschuldigung für die Verwirrung.
Weijun Zhou
1
@ WeijunZhou: Fertig
Shaggy
0

Java 8, 92 Bytes

(b,k,s,e)->{String r="",t;for(;s<=e;r+=t.contains(k)?"":t+" ")t=b.toString(s++,b);return r;}

Eingabe als Integer (base), String (elem), int (start), int (end).

Erläuterung:

Probieren Sie es online aus.

(b,k,s,e)->{              // Method with the four parameters, and String return-type
  String r="",            //  Result-String, starting empty
         t;               //  Temp-String
  for(;s<=e;              //  Loop from start to end (inclusive)
      r+=                 //    After every iteration: append the result-String with:
         t.contains(k)?   //     If the temp-String contains the elem we exclude
          ""              //      Don't append anything to the result-String
         :                //     Else:
          t+" ")          //      Append the temp-String + a space
    t=b.toString(s++,b);  //   Convert the number to the given base and set the temp-String
  return r;}              //  Return the result-String

Die drei Testfälle werden folgendermaßen eingegeben:

16,"7",16,31
10,"3",1,100
16,"A",151,192
Kevin Cruijssen
quelle